168 lines
4.6 KiB
C
168 lines
4.6 KiB
C
/**
|
|
* @file kQueue.x.h
|
|
*
|
|
* @internal
|
|
* Copyright (C) 2005-2021 by LMI Technologies Inc.
|
|
* Licensed under the MIT License.
|
|
* Redistributed files must retain the above copyright notice.
|
|
*/
|
|
#ifndef K_API_QUEUE_X_H
|
|
#define K_API_QUEUE_X_H
|
|
|
|
#define xkQUEUE_MIN_CAPACITY (16)
|
|
#define xkQUEUE_GROWTH_FACTOR (2)
|
|
|
|
typedef struct kQueueClass
|
|
{
|
|
kObjectClass base;
|
|
kType itemType; //item type
|
|
kSize itemSize; //item size, in bytes
|
|
kSize allocSize; //size of allocated array memory, in bytes
|
|
void* items; //item array
|
|
kSize count; //current number of elements
|
|
kSize head; //array index of first item
|
|
kSize capacity; //maximum elements before reallocation
|
|
kBool isAttached; //is array memory externally owned?
|
|
} kQueueClass;
|
|
|
|
kDeclareClassEx(k, kQueue, kObject)
|
|
|
|
/*
|
|
* Forward declarations.
|
|
*/
|
|
|
|
kFx(kStatus) kQueue_Add(kQueue queue, const void* item);
|
|
kFx(kStatus) kQueue_SetItem(kQueue queue, kSize index, const void* item);
|
|
kFx(kStatus) kQueue_Item(kQueue queue, kSize index, void* item);
|
|
kFx(kStatus) kQueue_Purge(kQueue queue);
|
|
|
|
kInlineFx(kType) kQueue_ItemType(kQueue queue);
|
|
kInlineFx(kSize) kQueue_Count(kQueue queue);
|
|
kInlineFx(kSize) kQueue_Capacity(kQueue queue);
|
|
kInlineFx(kSize) kQueue_ItemSize(kQueue queue);
|
|
kInlineFx(void*) kQueue_DataAt(kQueue queue, kSize index);
|
|
kInlineFx(void*) kQueue_At(kQueue queue, kSize index);
|
|
|
|
/*
|
|
* Private methods.
|
|
*/
|
|
|
|
kFx(kStatus) xkQueue_ConstructFramework(kQueue* queue, kAlloc allocator);
|
|
|
|
kFx(kStatus) xkQueue_Init(kQueue queue, kType classType, kType itemType, kSize initialCapacity, kAlloc alloc);
|
|
|
|
kFx(kStatus) xkQueue_VClone(kQueue queue, kQueue source, kAlloc valueAlloc, kObject context);
|
|
|
|
kFx(kStatus) xkQueue_VRelease(kQueue queue);
|
|
|
|
kInlineFx(kStatus) xkQueue_VDisposeItems(kQueue queue)
|
|
{
|
|
return kQueue_Purge(queue);
|
|
}
|
|
|
|
kFx(kBool) xkQueue_VHasShared(kQueue queue);
|
|
kFx(kSize) xkQueue_VSize(kQueue queue);
|
|
kFx(kAllocTrait) xkQueue_VAllocTraits(kQueue queue);
|
|
|
|
kFx(kStatus) xkQueue_WriteDat5V1(kQueue queue, kSerializer serializer);
|
|
kFx(kStatus) xkQueue_ReadDat5V1(kQueue queue, kSerializer serializer);
|
|
|
|
kFx(kStatus) xkQueue_WriteDat6V0(kQueue queue, kSerializer serializer);
|
|
kFx(kStatus) xkQueue_ReadDat6V0(kQueue queue, kSerializer serializer);
|
|
|
|
kFx(kStatus) xkQueue_Resize(kQueue queue, kSize count);
|
|
|
|
kFx(kIterator) xkQueue_GetIterator(kQueue queue);
|
|
kFx(kBool) xkQueue_HasNext(kQueue queue, kIterator iterator);
|
|
kFx(void*) xkQueue_Next(kQueue queue, kIterator* iterator);
|
|
|
|
kInlineFx(kBool) xkQueue_IsSplit(kQueue queue)
|
|
{
|
|
kObj(kQueue, queue);
|
|
|
|
return (obj->head + obj->count) > obj->capacity;
|
|
}
|
|
|
|
kInlineFx(kSize) xkQueue_HeadCount(kQueue queue)
|
|
{
|
|
kObj(kQueue, queue);
|
|
|
|
if (xkQueue_IsSplit(queue))
|
|
{
|
|
return obj->capacity - obj->head;
|
|
}
|
|
else
|
|
{
|
|
return obj->count;
|
|
}
|
|
}
|
|
|
|
kInlineFx(kSize) xkQueue_TailCount(kQueue queue)
|
|
{
|
|
kObj(kQueue, queue);
|
|
|
|
if (xkQueue_IsSplit(queue))
|
|
{
|
|
return obj->head + obj->count - obj->capacity;
|
|
}
|
|
else
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
kInlineFx(kSize) xkQueue_DataSize(kQueue queue)
|
|
{
|
|
return kQueue_Count(queue) * kQueue_ItemSize(queue);
|
|
}
|
|
|
|
kInlineFx(kStatus) xkQueue_AddT(kQueue queue, const void* item, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kQueue_ItemType(queue), itemSize));
|
|
|
|
return kQueue_Add(queue, item);
|
|
}
|
|
|
|
kInlineFx(kStatus) xkQueue_SetItemT(kQueue queue, kSize index, const void* item, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kQueue_ItemType(queue), itemSize));
|
|
|
|
return kQueue_SetItem(queue, index, item);
|
|
}
|
|
|
|
kInlineFx(kStatus) xkQueue_ItemT(kQueue queue, kSize index, void* item, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kQueue_ItemType(queue), itemSize));
|
|
|
|
return kQueue_Item(queue, index, item);
|
|
}
|
|
|
|
kInlineFx(void*) xkQueue_DataAtT(kQueue queue, kSize index, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kQueue_ItemType(queue), itemSize));
|
|
|
|
return kQueue_DataAt(queue, index);
|
|
}
|
|
|
|
kInlineFx(void*) xkQueue_AtT(kQueue queue, kSize index, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kQueue_ItemType(queue), itemSize));
|
|
|
|
return kQueue_At(queue, index);
|
|
}
|
|
|
|
kInlineFx(void*) xkQueue_AsT(kQueue queue, kSize index, kSize itemSize)
|
|
{
|
|
kAssert(itemSize == kQueue_ItemSize(queue));
|
|
|
|
return kQueue_At(queue, index);
|
|
}
|
|
|
|
/*
|
|
* Experimental (FSS-993)
|
|
*/
|
|
|
|
kFx(kStatus) kQueue_ConstructEx(kQueue* queue, kType itemType, kSize initialCapacity, kAlloc allocator, kAlloc valueAllocator);
|
|
|
|
#endif
|