Files
2024-05-18 23:53:26 +08:00

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