Pass init flags to allocating array utilities

This commit is contained in:
Abdelrahman Said
2026-01-19 06:09:36 +00:00
parent 243f04c0ca
commit 21ac756fad
4 changed files with 38 additions and 27 deletions

View File

@@ -104,7 +104,8 @@ void _array_copy_capped(GenericArray dst, const GenericArray src, u64 item_size)
dst_header->count = copy_count; dst_header->count = copy_count;
} }
GenericArray _array_append_alloc(const Allocator *allocator, GenericArray array, void *value, u64 item_size) { GenericArray _array_append_alloc(const Allocator *allocator, GenericArray array, void *value,
u64 item_size, ArrayInitFlags flags) {
wapp_runtime_assert(allocator != NULL && array != NULL, "`allocator` and `array` should not be NULL"); wapp_runtime_assert(allocator != NULL && array != NULL, "`allocator` and `array` should not be NULL");
_array_validate(array, item_size); _array_validate(array, item_size);
@@ -113,7 +114,8 @@ GenericArray _array_append_alloc(const Allocator *allocator, GenericArray array,
ArrayHeader *header = _array_header(array); ArrayHeader *header = _array_header(array);
if (header->count >= header->capacity) { if (header->count >= header->capacity) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(header->capacity * 2); u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(header->capacity * 2);
output = (GenericArray )_array_alloc_capacity(allocator, new_capacity, header->item_size, false); output = (GenericArray )_array_alloc_capacity(allocator, new_capacity, header->item_size,
flags);
if (!output) { if (!output) {
output = array; output = array;
goto RETURN_ARRAY_APPEND_ALLOC; goto RETURN_ARRAY_APPEND_ALLOC;
@@ -127,7 +129,8 @@ RETURN_ARRAY_APPEND_ALLOC:
return output; return output;
} }
GenericArray _array_extend_alloc(const Allocator *allocator, GenericArray dst, const GenericArray src, u64 item_size) { GenericArray _array_extend_alloc(const Allocator *allocator, GenericArray dst, const GenericArray src,
u64 item_size, ArrayInitFlags flags) {
wapp_runtime_assert(allocator != NULL && dst != NULL && src != NULL, "`allocator`, `dst` and `src` should not be NULL"); wapp_runtime_assert(allocator != NULL && dst != NULL && src != NULL, "`allocator`, `dst` and `src` should not be NULL");
_array_validate(dst, item_size); _array_validate(dst, item_size);
_array_validate(src, item_size); _array_validate(src, item_size);
@@ -139,7 +142,8 @@ GenericArray _array_extend_alloc(const Allocator *allocator, GenericArray dst, c
u64 remaining_capacity = dst_header->capacity - dst_header->count; u64 remaining_capacity = dst_header->capacity - dst_header->count;
if (src_header->count >= remaining_capacity) { if (src_header->count >= remaining_capacity) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst_header->capacity * 2); u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst_header->capacity * 2);
output = (GenericArray )_array_alloc_capacity(allocator, new_capacity, dst_header->item_size, false); output = (GenericArray )_array_alloc_capacity(allocator, new_capacity,
dst_header->item_size, flags);
if (!output) { if (!output) {
output = dst; output = dst;
goto RETURN_ARRAY_EXTEND_ALLOC; goto RETURN_ARRAY_EXTEND_ALLOC;
@@ -153,7 +157,8 @@ RETURN_ARRAY_EXTEND_ALLOC:
return output; return output;
} }
GenericArray _array_copy_alloc(const Allocator *allocator, GenericArray dst, const GenericArray src, u64 item_size) { GenericArray _array_copy_alloc(const Allocator *allocator, GenericArray dst, const GenericArray src,
u64 item_size, ArrayInitFlags flags) {
wapp_runtime_assert(allocator != NULL && dst != NULL && src != NULL, "`allocator`, `dst` and `src` should not be NULL"); wapp_runtime_assert(allocator != NULL && dst != NULL && src != NULL, "`allocator`, `dst` and `src` should not be NULL");
_array_validate(dst, item_size); _array_validate(dst, item_size);
_array_validate(src, item_size); _array_validate(src, item_size);
@@ -165,7 +170,7 @@ GenericArray _array_copy_alloc(const Allocator *allocator, GenericArray dst, con
if (src_header->count >= dst_header->capacity) { if (src_header->count >= dst_header->capacity) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst_header->capacity * 2); u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst_header->capacity * 2);
output = (GenericArray )_array_alloc_capacity(allocator, new_capacity, output = (GenericArray )_array_alloc_capacity(allocator, new_capacity,
src_header->item_size, false); src_header->item_size, flags);
if (!output) { if (!output) {
output = dst; output = dst;
goto RETURN_ARRAY_COPY_ALLOC; goto RETURN_ARRAY_COPY_ALLOC;

View File

@@ -153,21 +153,24 @@ typedef enum {
(_array_copy_capped((GenericArray)DST_ARRAY, \ (_array_copy_capped((GenericArray)DST_ARRAY, \
(GenericArray)SRC_ARRAY, \ (GenericArray)SRC_ARRAY, \
sizeof(TYPE))) sizeof(TYPE)))
#define wapp_array_append_alloc(TYPE, ALLOCATOR_PTR, ARRAY, VALUE_PTR) \ #define wapp_array_append_alloc(TYPE, ALLOCATOR_PTR, ARRAY, VALUE_PTR, FLAGS) \
((TYPE *)_array_append_alloc(ALLOCATOR_PTR, \ ((TYPE *)_array_append_alloc(ALLOCATOR_PTR, \
(GenericArray)ARRAY, \ (GenericArray)ARRAY, \
(u8 *)VALUE_PTR, \ (u8 *)VALUE_PTR, \
sizeof(TYPE))) sizeof(TYPE), \
#define wapp_array_extend_alloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY) \ FLAGS))
#define wapp_array_extend_alloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY, FLAGS) \
((TYPE *)_array_extend_alloc(ALLOCATOR_PTR, \ ((TYPE *)_array_extend_alloc(ALLOCATOR_PTR, \
(GenericArray)DST_ARRAY, \ (GenericArray)DST_ARRAY, \
(GenericArray)SRC_ARRAY, \ (GenericArray)SRC_ARRAY, \
sizeof(TYPE))) sizeof(TYPE), \
#define wapp_array_copy_alloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY) \ FLAGS))
#define wapp_array_copy_alloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY, FLAGS) \
((TYPE *)_array_copy_alloc(ALLOCATOR_PTR, \ ((TYPE *)_array_copy_alloc(ALLOCATOR_PTR, \
(GenericArray)DST_ARRAY, \ (GenericArray)DST_ARRAY, \
(GenericArray)SRC_ARRAY, \ (GenericArray)SRC_ARRAY, \
sizeof(TYPE))) sizeof(TYPE), \
FLAGS))
#define wapp_array_clear(TYPE, ARRAY) \ #define wapp_array_clear(TYPE, ARRAY) \
(_array_clear((GenericArray)ARRAY, \ (_array_clear((GenericArray)ARRAY, \
sizeof(TYPE))) sizeof(TYPE)))
@@ -190,9 +193,12 @@ void _array_set(GenericArray array, u64 index, void *value, u64 item_siz
void _array_append_capped(GenericArray array, void *value, u64 item_size); void _array_append_capped(GenericArray array, void *value, u64 item_size);
void _array_extend_capped(GenericArray dst, const GenericArray src, u64 item_size); void _array_extend_capped(GenericArray dst, const GenericArray src, u64 item_size);
void _array_copy_capped(GenericArray dst, const GenericArray src, u64 item_size); void _array_copy_capped(GenericArray dst, const GenericArray src, u64 item_size);
GenericArray _array_append_alloc(const Allocator *allocator, GenericArray array, void *value, u64 item_size); GenericArray _array_append_alloc(const Allocator *allocator, GenericArray array, void *value,
GenericArray _array_extend_alloc(const Allocator *allocator, GenericArray dst, const GenericArray src, u64 item_size); u64 item_size, ArrayInitFlags flags);
GenericArray _array_copy_alloc(const Allocator *allocator, GenericArray dst, const GenericArray src, u64 item_size); GenericArray _array_extend_alloc(const Allocator *allocator, GenericArray dst, const GenericArray src,
u64 item_size, ArrayInitFlags flags);
GenericArray _array_copy_alloc(const Allocator *allocator, GenericArray dst, const GenericArray src,
u64 item_size, ArrayInitFlags flags);
void *_array_pop(GenericArray array, u64 item_size); void *_array_pop(GenericArray array, u64 item_size);
void _array_clear(GenericArray array, u64 item_size); void _array_clear(GenericArray array, u64 item_size);
u64 _array_calc_alloc_size(u64 capacity, u64 item_size); u64 _array_calc_alloc_size(u64 capacity, u64 item_size);

View File

@@ -166,7 +166,7 @@ TestFuncResult test_i32_array_append_alloc(void) {
I32Array array1 = wapp_array(i32, 1, 2, 3, 4, 5, 6, 7, 8); I32Array array1 = wapp_array(i32, 1, 2, 3, 4, 5, 6, 7, 8);
I32Array array2 = wapp_array(i32, 1, 2); I32Array array2 = wapp_array(i32, 1, 2);
I32Array arr_ptr = wapp_array_append_alloc(i32, &allocator, array1, &((i32){10})); I32Array arr_ptr = wapp_array_append_alloc(i32, &allocator, array1, &((i32){10}), ARRAY_INIT_NONE);
result = arr_ptr == array1; result = arr_ptr == array1;
u64 count = 4; u64 count = 4;
@@ -174,7 +174,7 @@ TestFuncResult test_i32_array_append_alloc(void) {
b8 running = true; b8 running = true;
while (running) { while (running) {
i32 num = (i32)index; i32 num = (i32)index;
arr_ptr = wapp_array_append_alloc(i32, &allocator, array2, &num); arr_ptr = wapp_array_append_alloc(i32, &allocator, array2, &num, ARRAY_INIT_NONE);
++index; ++index;
running = index < count; running = index < count;
@@ -194,10 +194,10 @@ TestFuncResult test_i32_array_extend_alloc(void) {
I32Array array2 = wapp_array(i32, 1, 2); I32Array array2 = wapp_array(i32, 1, 2);
I32Array array3 = wapp_array(i32, 1, 2, 3, 4); I32Array array3 = wapp_array(i32, 1, 2, 3, 4);
I32Array arr_ptr = wapp_array_extend_alloc(i32, &allocator, array1, array3); I32Array arr_ptr = wapp_array_extend_alloc(i32, &allocator, array1, array3, ARRAY_INIT_NONE);
result = arr_ptr == array1; result = arr_ptr == array1;
arr_ptr = wapp_array_extend_alloc(i32, &allocator, array2, array3); arr_ptr = wapp_array_extend_alloc(i32, &allocator, array2, array3, ARRAY_INIT_NONE);
result = result && arr_ptr != array2; result = result && arr_ptr != array2;
wapp_mem_arena_allocator_destroy(&allocator); wapp_mem_arena_allocator_destroy(&allocator);
@@ -215,7 +215,7 @@ TestFuncResult test_i32_array_copy_alloc(void) {
I32Array array = NULL; I32Array array = NULL;
u64 expected_count = 5; u64 expected_count = 5;
array = wapp_array_copy_alloc(i32, &allocator, dst1, src); array = wapp_array_copy_alloc(i32, &allocator, dst1, src, ARRAY_INIT_NONE);
result = wapp_array_count(array) == expected_count && array == dst1; result = wapp_array_count(array) == expected_count && array == dst1;
u64 index = 0; u64 index = 0;
@@ -228,7 +228,7 @@ TestFuncResult test_i32_array_copy_alloc(void) {
} }
expected_count = 5; expected_count = 5;
array = wapp_array_copy_alloc(i32, &allocator, dst2, src); array = wapp_array_copy_alloc(i32, &allocator, dst2, src, ARRAY_INIT_NONE);
result = result && wapp_array_count(array) == expected_count && array != dst2; result = result && wapp_array_count(array) == expected_count && array != dst2;
index = 0; index = 0;

View File

@@ -169,7 +169,7 @@ TestFuncResult test_i32_array_append_alloc(void) {
I32Array array2 = wapp_array(i32, 1, 2); I32Array array2 = wapp_array(i32, 1, 2);
i32 num = 10; i32 num = 10;
I32Array arr_ptr = wapp_array_append_alloc(i32, &allocator, array1, &num); I32Array arr_ptr = wapp_array_append_alloc(i32, &allocator, array1, &num, ARRAY_INIT_NONE);
result = arr_ptr == array1; result = arr_ptr == array1;
u64 count = 4; u64 count = 4;
@@ -177,7 +177,7 @@ TestFuncResult test_i32_array_append_alloc(void) {
b8 running = true; b8 running = true;
while (running) { while (running) {
num = (i32)index; num = (i32)index;
arr_ptr = wapp_array_append_alloc(i32, &allocator, array2, &num); arr_ptr = wapp_array_append_alloc(i32, &allocator, array2, &num, ARRAY_INIT_NONE);
++index; ++index;
running = index < count; running = index < count;
@@ -197,10 +197,10 @@ TestFuncResult test_i32_array_extend_alloc(void) {
I32Array array2 = wapp_array(i32, 1, 2); I32Array array2 = wapp_array(i32, 1, 2);
I32Array array3 = wapp_array(i32, 1, 2, 3, 4); I32Array array3 = wapp_array(i32, 1, 2, 3, 4);
I32Array array = wapp_array_extend_alloc(i32, &allocator, array1, array3); I32Array array = wapp_array_extend_alloc(i32, &allocator, array1, array3, ARRAY_INIT_NONE);
result = array == array1; result = array == array1;
array = wapp_array_extend_alloc(i32, &allocator, array2, array3); array = wapp_array_extend_alloc(i32, &allocator, array2, array3, ARRAY_INIT_NONE);
result = result && array != array2; result = result && array != array2;
wapp_mem_arena_allocator_destroy(&allocator); wapp_mem_arena_allocator_destroy(&allocator);
@@ -218,7 +218,7 @@ TestFuncResult test_i32_array_copy_alloc(void) {
I32Array array = nullptr; I32Array array = nullptr;
u64 expected_count = 5; u64 expected_count = 5;
array = wapp_array_copy_alloc(i32, &allocator, dst1, src); array = wapp_array_copy_alloc(i32, &allocator, dst1, src, ARRAY_INIT_NONE);
result = wapp_array_count(array) == expected_count && array == dst1; result = wapp_array_count(array) == expected_count && array == dst1;
u64 index = 0; u64 index = 0;
@@ -231,7 +231,7 @@ TestFuncResult test_i32_array_copy_alloc(void) {
} }
expected_count = 5; expected_count = 5;
array = wapp_array_copy_alloc(i32, &allocator, dst2, src); array = wapp_array_copy_alloc(i32, &allocator, dst2, src, ARRAY_INIT_NONE);
result = result && wapp_array_count(array) == expected_count && array != dst2; result = result && wapp_array_count(array) == expected_count && array != dst2;
index = 0; index = 0;