diff --git a/dqn_containers.h b/dqn_containers.h index 3bd506d..3e0eb1f 100644 --- a/dqn_containers.h +++ b/dqn_containers.h @@ -192,8 +192,11 @@ template Dqn_ArrayFindResult Dqn_CArra #if !defined(DQN_NO_VARRAY) template Dqn_VArray Dqn_VArray_InitByteSize (Dqn_usize byte_size, uint8_t arena_flags); template Dqn_VArray Dqn_VArray_Init (Dqn_usize max, uint8_t arena_flags); +template Dqn_VArray Dqn_VArray_InitSlice (Dqn_Slice slice, Dqn_usize max, uint8_t arena_flags); +template Dqn_VArray Dqn_VArray_InitCArray (T const (&items)[N], Dqn_usize max, uint8_t arena_flags); template void Dqn_VArray_Deinit (Dqn_VArray *array); template bool Dqn_VArray_IsValid (Dqn_VArray const *array); +template Dqn_Slice Dqn_VArray_Slice (Dqn_VArray const *array); template bool Dqn_VArray_Reserve (Dqn_VArray *array, Dqn_usize count); template T * Dqn_VArray_AddArray (Dqn_VArray *array, T const *items, Dqn_usize count); template T * Dqn_VArray_AddCArray (Dqn_VArray *array, T const (&items)[N]); @@ -216,9 +219,11 @@ template T Dqn_VArra template Dqn_ArrayEraseResult Dqn_VArray_EraseRange (Dqn_VArray *array, Dqn_usize begin_index, Dqn_isize count, Dqn_ArrayErase erase); template void Dqn_VArray_Clear (Dqn_VArray *array, Dqn_ZeroMem zero_mem); #endif // !defined(DQN_NO_VARRAY) +// NOTE: [$SARR] Dqn_SArray //////////////////////////////////////////////////////////////////////// #if !defined(DQN_NO_SARRAY) template Dqn_SArray Dqn_SArray_Init (Dqn_Arena *arena, Dqn_usize size, Dqn_ZeroMem zero_mem); -template Dqn_SArray Dqn_SArray_InitCArray (Dqn_Arena *arena, T const (&array)[N]); +template Dqn_SArray Dqn_SArray_InitSlice (Dqn_Arena *arena, Dqn_Slice slice, Dqn_usize size, Dqn_ZeroMem zero_mem); +template Dqn_SArray Dqn_SArray_InitCArray (Dqn_Arena *arena, T const (&array)[N], Dqn_usize size); template bool Dqn_SArray_IsValid (Dqn_SArray const *array); template Dqn_Slice Dqn_SArray_Slice (Dqn_SArray const *array); template T * Dqn_SArray_AddArray (Dqn_SArray *array, T const *items, Dqn_usize count); @@ -244,6 +249,7 @@ template void Dqn_SArra #endif // !defined(DQN_NO_SARRAY) #if !defined(DQN_NO_FARRAY) template Dqn_FArray Dqn_FArray_Init (T const *array, Dqn_usize count); +template Dqn_FArray Dqn_FArray_InitSlice (Dqn_Slice slice); template Dqn_FArray Dqn_FArray_InitCArray (T const (&items)[K]); template bool Dqn_FArray_IsValid (Dqn_FArray const *array); template Dqn_usize Dqn_FArray_Max (Dqn_FArray const *) { return N; } @@ -270,6 +276,7 @@ template Dqn_ArrayEraseResult Dqn_FArra template void Dqn_FArray_Clear (Dqn_FArray *array); #endif // !defined(DQN_NO_FARRAY) #if !defined(DQN_NO_SLICE) +#define DQN_TO_SLICE(val) Dqn_Slice_Init((val)->data, (val)->size) template Dqn_Slice Dqn_Slice_Init (T* const data, Dqn_usize size); template Dqn_Slice Dqn_Slice_InitCArray (Dqn_Arena *arena, T const (&array)[N]); template Dqn_Slice Dqn_Slice_Alloc (Dqn_Arena *arena, Dqn_usize size, Dqn_ZeroMem zero_mem); @@ -454,8 +461,10 @@ template Dqn_VArray Dqn_VArray_InitByteSize(Dqn_usize byte_size, { Dqn_VArray result = {}; result.arena = Dqn_Arena_InitSize(DQN_ARENA_HEADER_SIZE + byte_size, 0 /*commit*/, arena_flags | Dqn_ArenaFlag_NoGrow | Dqn_ArenaFlag_NoPoison); - result.data = DQN_CAST(T *)(DQN_CAST(char *)result.arena.curr + result.arena.curr->used); - result.max = (result.arena.curr->reserve - result.arena.curr->used) / sizeof(T); + if (result.arena.curr) { + result.data = DQN_CAST(T *)(DQN_CAST(char *)result.arena.curr + result.arena.curr->used); + result.max = (result.arena.curr->reserve - result.arena.curr->used) / sizeof(T); + } return result; } @@ -466,6 +475,22 @@ template Dqn_VArray Dqn_VArray_Init(Dqn_usize max, uint8_t arena return result; } +template Dqn_VArray Dqn_VArray_InitSlice(Dqn_Slice slice, Dqn_usize max, uint8_t arena_flags) +{ + Dqn_usize real_max = DQN_MAX(slice.size, max); + Dqn_VArray result = Dqn_VArray_Init(real_max, arena_flags); + if (Dqn_VArray_IsValid(&result)) + Dqn_VArray_AddArray(&result, slice.data, slice.size); + return result; +} + +template Dqn_VArray Dqn_VArray_InitCArray(T const (&items)[N], Dqn_usize max, uint8_t arena_flags) +{ + Dqn_usize real_max = DQN_MAX(N, max); + Dqn_VArray result = Dqn_VArray_InitSlice(Dqn_Slice_Init(items, N), real_max, arena_flags); + return result; +} + template void Dqn_VArray_Deinit(Dqn_VArray *array) { Dqn_Arena_Deinit(&array->arena); @@ -478,6 +503,14 @@ template bool Dqn_VArray_IsValid(Dqn_VArray const *array) return result; } +template Dqn_Slice Dqn_VArray_Slice(Dqn_VArray const *array) +{ + Dqn_Slice result = {}; + if (array) + result = Dqn_Slice_Init(array->data, array->size); + return result; +} + template T *Dqn_VArray_AddArray(Dqn_VArray *array, T const *items, Dqn_usize count) { T *result = Dqn_VArray_MakeArray(array, count, Dqn_ZeroMem_No); @@ -599,31 +632,35 @@ template Dqn_SArray Dqn_SArray_Init(Dqn_Arena *arena, Dqn_usize return result; } -template Dqn_SArray Dqn_SArray_InitCArray(Dqn_Arena *arena, T const (&array)[N]) +template Dqn_SArray Dqn_SArray_InitSlice(Dqn_Arena *arena, Dqn_Slice slice, Dqn_usize size, Dqn_ZeroMem zero_mem) { - Dqn_SArray result = {}; - if (!arena || !N) - return result; - result.data = Dqn_Arena_NewArray(arena, T, N, Dqn_ZeroMem_No); - if (result.data) { - DQN_MEMCOPY(result.data, array, sizeof(T) * N); - result.size = N; - result.max = N; + Dqn_usize max = DQN_MAX(slice.size, size); + Dqn_SArray result = Dqn_SArray_Init(arena, max, Dqn_ZeroMem_No); + if (Dqn_SArray_IsValid(&result)) { + Dqn_SArray_AddArray(&result, slice.data, slice.size); + if (zero_mem == Dqn_ZeroMem_Yes) + DQN_MEMSET(result.data + result.size, 0, (result.max - result.size) * sizeof(T)); } return result; } +template Dqn_SArray Dqn_SArray_InitCArray(Dqn_Arena *arena, T const (&array)[N], Dqn_usize size, Dqn_ZeroMem zero_mem) +{ + Dqn_SArray result = Dqn_SArray_InitSlice(arena, Dqn_Slice_Init(array, N), size, zero_mem); + return result; +} + template bool Dqn_SArray_IsValid(Dqn_SArray const *array) { bool result = array && array->data && array->size <= array->max; return result; } -template Dqn_Slice Dqn_SArray_Slice(Dqn_SArray const *array) +template Dqn_Slice Dqn_SArray_Slice(Dqn_SArray const *array) { Dqn_Slice result = {}; if (array) - Dqn_Slice_Init(DQN_CAST(T *)array->data, array->size); + result = Dqn_Slice_Init(DQN_CAST(T *)array->data, array->size); return result; } @@ -643,9 +680,10 @@ template T *Dqn_SArray_Make(Dqn_SArray *array, Dqn_ZeroMem zero_ template T *Dqn_SArray_AddArray(Dqn_SArray *array, T const *items, Dqn_usize count) { - T *result = Dqn_SArray_Make(array, count, Dqn_ZeroMem_No); + T *result = Dqn_SArray_MakeArray(array, count, Dqn_ZeroMem_No); if (result) DQN_MEMCPY(result, items, count * sizeof(T)); + return result; } template T *Dqn_SArray_AddCArray(Dqn_SArray *array, T const (&items)[N]) @@ -719,11 +757,15 @@ template Dqn_FArray Dqn_FArray_Init(T const *arr return result; } +template Dqn_FArray Dqn_FArray_InitSlice(Dqn_Slice slice) +{ + Dqn_FArray result = Dqn_FArray_Init(slice.data, slice.size); + return result; +} + template Dqn_FArray Dqn_FArray_InitCArray(T const (&items)[K]) { - Dqn_FArray result = {}; - bool added = Dqn_FArray_AddArray(&result, items, K); - DQN_ASSERT(added); + Dqn_FArray result = Dqn_FArray_Init(items, K); return result; } diff --git a/dqn_helpers.cpp b/dqn_helpers.cpp index 5b95e43..d9d923f 100644 --- a/dqn_helpers.cpp +++ b/dqn_helpers.cpp @@ -585,16 +585,19 @@ DQN_API uint64_t Dqn_Safe_SaturateCastUSizeToU64(Dqn_usize val) return result; } -// NOTE: Dqn_Safe_SaturateCastU64To* -// ----------------------------------------------------------------------------- -// INT*_MAX literals will be promoted to the type of val as val is -// the highest possible rank (unsigned > signed). +// NOTE: Dqn_Safe_SaturateCastU64To* /////////////////////////////////////////////////////////////// DQN_API int Dqn_Safe_SaturateCastU64ToInt(uint64_t val) { int result = DQN_CHECK(val <= INT_MAX) ? DQN_CAST(int)val : INT_MAX; return result; } +DQN_API int64_t Dqn_Safe_SaturateCastU64ToI64(uint64_t val) +{ + int64_t result = DQN_CHECK(val <= INT64_MAX) ? DQN_CAST(int64_t)val : INT64_MAX; + return result; +} + // Both operands are unsigned and the lowest rank operand will be promoted to // match the highest rank operand. DQN_API unsigned int Dqn_Safe_SaturateCastU64ToUInt(uint64_t val) diff --git a/dqn_helpers.h b/dqn_helpers.h index dbc9194..f9303fb 100644 --- a/dqn_helpers.h +++ b/dqn_helpers.h @@ -380,6 +380,7 @@ DQN_API int32_t Dqn_Safe_SaturateCastUSizeToI32 (Dqn_usize DQN_API int64_t Dqn_Safe_SaturateCastUSizeToI64 (Dqn_usize val); DQN_API int Dqn_Safe_SaturateCastU64ToInt (uint64_t val); +DQN_API int64_t Dqn_Safe_SaturateCastU64ToI64 (uint64_t val); DQN_API unsigned int Dqn_Safe_SaturateCastU64ToUInt (uint64_t val); DQN_API uint8_t Dqn_Safe_SaturateCastU64ToU8 (uint64_t val); DQN_API uint16_t Dqn_Safe_SaturateCastU64ToU16 (uint64_t val);