214 lines
7.4 KiB
C
214 lines
7.4 KiB
C
/**
|
|
* @file kArrayList.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_ARRAY_LIST_X_H
|
|
#define K_API_ARRAY_LIST_X_H
|
|
|
|
#define xkARRAY_LIST_MIN_CAPACITY (16) ///< Minimum number of allocated elements.
|
|
#define xkARRAY_LIST_GROWTH_FACTOR (2) ///< Factor by which capacity is increased upon exhaustion.
|
|
|
|
typedef struct kArrayListClass
|
|
{
|
|
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 capacity; //maximum elements before reallocation
|
|
kBool isAttached; //is array memory externally owned?
|
|
} kArrayListClass;
|
|
|
|
kDeclareClassEx(k, kArrayList, kObject)
|
|
|
|
/*
|
|
* Forward declarations.
|
|
*/
|
|
|
|
kFx(kStatus) kArrayList_Attach(kArrayList list, void* items, kType itemType, kSize capacity);
|
|
kFx(kStatus) kArrayList_Import(kArrayList list, const void* items, kType itemType, kSize count);
|
|
kFx(kStatus) kArrayList_Append(kArrayList list, const void* items, kSize count);
|
|
kFx(kStatus) kArrayList_Reserve(kArrayList list, kSize capacity);
|
|
kFx(kStatus) kArrayList_Remove(kArrayList list, kSize index, void* item);
|
|
kFx(kStatus) kArrayList_Add(kArrayList list, const void* item);
|
|
kFx(kStatus) kArrayList_Insert(kArrayList list, kSize before, const void* item);
|
|
kFx(kStatus) kArrayList_Item(kArrayList list, kSize index, void* item);
|
|
kFx(kStatus) kArrayList_SetItem(kArrayList list, kSize index, const void* item);
|
|
kInlineFx(kSize) kArrayList_Count(kArrayList list);
|
|
kInlineFx(void*) kArrayList_Begin(kArrayList list);
|
|
kInlineFx(void*) kArrayList_RBegin(kArrayList list);
|
|
kFx(kStatus) kArrayList_Purge(kArrayList list);
|
|
kInlineFx(kType) kArrayList_ItemType(kArrayList list);
|
|
kInlineFx(kSize) kArrayList_ItemSize(kArrayList list);
|
|
kInlineFx(void*) kArrayList_Data(kArrayList list);
|
|
kInlineFx(void*) kArrayList_DataAt(kArrayList list, kSSize index);
|
|
kInlineFx(void*) kArrayList_At(kArrayList list, kSize index);
|
|
kInlineFx(void*) kArrayList_First(kArrayList list);
|
|
kInlineFx(void*) kArrayList_Last(kArrayList list);
|
|
kInlineFx(void*) kArrayList_Begin(kArrayList list);
|
|
kInlineFx(void*) kArrayList_End(kArrayList list);
|
|
kInlineFx(void*) kArrayList_RBegin(kArrayList list);
|
|
kInlineFx(void*) kArrayList_REnd(kArrayList list);
|
|
|
|
/*
|
|
* Private methods.
|
|
*/
|
|
|
|
kFx(kStatus) xkArrayList_ConstructFramework(kArrayList* list, kAlloc allocator);
|
|
|
|
kFx(kStatus) xkArrayList_Init(kArrayList list, kType classType, kType itemType, kSize initialCapacity, kAlloc alloc);
|
|
kFx(kStatus) xkArrayList_VClone(kArrayList list, kArrayList source, kAlloc valueAlloc, kObject context);
|
|
|
|
kFx(kStatus) xkArrayList_VRelease(kArrayList list);
|
|
|
|
kInlineFx(kStatus) xkArrayList_VDisposeItems(kArrayList list)
|
|
{
|
|
return kArrayList_Purge(list);
|
|
}
|
|
|
|
kFx(kBool) xkArrayList_VHasShared(kArrayList list);
|
|
kFx(kSize) xkArrayList_VSize(kArrayList list);
|
|
kFx(kAllocTrait) xkArrayList_VAllocTraits(kArrayList list);
|
|
|
|
kFx(kStatus) xkArrayList_WriteDat5V1(kArrayList list, kSerializer serializer);
|
|
kFx(kStatus) xkArrayList_ReadDat5V1(kArrayList list, kSerializer serializer);
|
|
kFx(kStatus) xkArrayList_WriteDat6V0(kArrayList list, kSerializer serializer);
|
|
kFx(kStatus) xkArrayList_ReadDat6V0(kArrayList list, kSerializer serializer);
|
|
|
|
kFx(kIterator) xkArrayList_GetIterator(kArrayList list);
|
|
kFx(kBool) xkArrayList_HasNext(kArrayList list, kIterator iterator);
|
|
kFx(void*) xkArrayList_Next(kArrayList list, kIterator* iterator);
|
|
|
|
kInlineFx(kStatus) xkArrayList_AttachT(kArrayList list, void* items, kType itemType, kSize capacity, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(itemType, itemSize));
|
|
|
|
return kArrayList_Attach(list, items, itemType, capacity);
|
|
}
|
|
|
|
kInlineFx(kStatus) xkArrayList_ImportT(kArrayList list, const void* items, kType itemType, kSize count, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(itemType, itemSize));
|
|
|
|
return kArrayList_Import(list, items, itemType, count);
|
|
}
|
|
|
|
kInlineFx(kStatus) xkArrayList_AppendT(kArrayList list, const void* items, kSize count, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_Append(list, items, count);
|
|
}
|
|
|
|
kInlineFx(kStatus) xkArrayList_AddT(kArrayList list, const void* item, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_Add(list, item);
|
|
}
|
|
|
|
kInlineFx(kStatus) xkArrayList_InsertT(kArrayList list, kSize before, const void* item, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_Insert(list, before, item);
|
|
}
|
|
|
|
kInlineFx(kStatus) xkArrayList_RemoveT(kArrayList list, kSize index, void* item, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_Remove(list, index, item);
|
|
}
|
|
|
|
kInlineFx(kStatus) xkArrayList_ItemT(kArrayList list, kSize index, void* item, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_Item(list, index, item);
|
|
}
|
|
|
|
kInlineFx(kStatus) xkArrayList_SetItemT(kArrayList list, kSize index, const void* item, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_SetItem(list, index, item);
|
|
}
|
|
|
|
kInlineFx(void*) xkArrayList_DataT(kArrayList list, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_Data(list);
|
|
}
|
|
|
|
kInlineFx(void*) xkArrayList_DataAtT(kArrayList list, kSSize index, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_DataAt(list, index);
|
|
}
|
|
|
|
kInlineFx(void*) xkArrayList_AtT(kArrayList list, kSize index, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_At(list, index);
|
|
}
|
|
|
|
kInlineFx(void*) xkArrayList_FirstT(kArrayList list, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_First(list);
|
|
}
|
|
|
|
kInlineFx(void*) xkArrayList_LastT(kArrayList list, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_Last(list);
|
|
}
|
|
|
|
kInlineFx(void*) xkArrayList_BeginT(kArrayList list, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_Begin(list);
|
|
}
|
|
|
|
kInlineFx(void*) xkArrayList_EndT(kArrayList list, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_End(list);
|
|
}
|
|
|
|
kInlineFx(void*) xkArrayList_RBeginT(kArrayList list, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_RBegin(list);
|
|
}
|
|
|
|
kInlineFx(void*) xkArrayList_REndT(kArrayList list, kSize itemSize)
|
|
{
|
|
kAssert(xkType_IsPointerCompatible(kArrayList_ItemType(list), itemSize));
|
|
|
|
return kArrayList_REnd(list);
|
|
}
|
|
|
|
kInlineFx(void*) xkArrayList_AsT(kArrayList list, kSize index, kSize itemSize)
|
|
{
|
|
kAssert(itemSize == kArrayList_ItemSize(list));
|
|
|
|
return kArrayList_At(list, index);
|
|
}
|
|
|
|
#endif
|