#if !defined(DN_OS_CONTAINERS_H) #define DN_OS_CONTAINERS_H // NOTE: DN_VArray ///////////////////////////////////////////////////////////////////////////////// // TODO(doyle): Add an API for shrinking the array by decomitting pages back to the OS. template struct DN_VArray { T *data; // Pointer to the start of the array items in the block of memory DN_USize size; // Number of items currently in the array DN_USize max; // Maximum number of items this array can store DN_USize commit; // Bytes committed T *begin() { return data; } T *end () { return data + size; } T const *begin() const { return data; } T const *end () const { return data + size; } }; template DN_VArray DN_VArray_InitByteSize (DN_USize byte_size); template DN_VArray DN_VArray_Init (DN_USize max); template DN_VArray DN_VArray_InitSlice (DN_Slice slice, DN_USize max); template DN_VArray DN_VArray_InitCArray (T const (&items)[N], DN_USize max); template void DN_VArray_Deinit (DN_VArray *array); template bool DN_VArray_IsValid (DN_VArray const *array); template DN_Slice DN_VArray_Slice (DN_VArray const *array); template bool DN_VArray_Reserve (DN_VArray *array, DN_USize count); template T * DN_VArray_AddArray (DN_VArray *array, T const *items, DN_USize count); template T * DN_VArray_AddCArray (DN_VArray *array, T const (&items)[N]); template T * DN_VArray_Add (DN_VArray *array, T const &item); #define DN_VArray_AddArrayAssert(...) DN_HardAssert(DN_VArray_AddArray(__VA_ARGS__)) #define DN_VArray_AddCArrayAssert(...) DN_HardAssert(DN_VArray_AddCArray(__VA_ARGS__)) #define DN_VArray_AddAssert(...) DN_HardAssert(DN_VArray_Add(__VA_ARGS__)) template T * DN_VArray_MakeArray (DN_VArray *array, DN_USize count, DN_ZeroMem zero_mem); template T * DN_VArray_Make (DN_VArray *array, DN_ZeroMem zero_mem); #define DN_VArray_MakeArrayAssert(...) DN_HardAssert(DN_VArray_MakeArray(__VA_ARGS__)) #define DN_VArray_MakeAssert(...) DN_HardAssert(DN_VArray_Make(__VA_ARGS__)) template T * DN_VArray_InsertArray (DN_VArray *array, DN_USize index, T const *items, DN_USize count); template T * DN_VArray_InsertCArray (DN_VArray *array, DN_USize index, T const (&items)[N]); template T * DN_VArray_Insert (DN_VArray *array, DN_USize index, T const &item); #define DN_VArray_InsertArrayAssert(...) DN_HardAssert(DN_VArray_InsertArray(__VA_ARGS__)) #define DN_VArray_InsertCArrayAssert(...) DN_HardAssert(DN_VArray_InsertCArray(__VA_ARGS__)) #define DN_VArray_InsertAssert(...) DN_HardAssert(DN_VArray_Insert(__VA_ARGS__)) template T DN_VArray_PopFront (DN_VArray *array, DN_USize count); template T DN_VArray_PopBack (DN_VArray *array, DN_USize count); template DN_ArrayEraseResult DN_VArray_EraseRange (DN_VArray *array, DN_USize begin_index, DN_ISize count, DN_ArrayErase erase); template void DN_VArray_Clear (DN_VArray *array, DN_ZeroMem zero_mem); #endif // !defined(DN_OS_CONTAINERS_H)