diff --git a/src/base/array/array.c b/src/base/array/array.c index 3162208..93aae06 100644 --- a/src/base/array/array.c +++ b/src/base/array/array.c @@ -104,7 +104,8 @@ void _array_copy_capped(GenericArray dst, const GenericArray src, u64 item_size) 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"); _array_validate(array, item_size); @@ -113,7 +114,8 @@ GenericArray _array_append_alloc(const Allocator *allocator, GenericArray array, ArrayHeader *header = _array_header(array); if (header->count >= header->capacity) { 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) { output = array; goto RETURN_ARRAY_APPEND_ALLOC; @@ -127,7 +129,8 @@ RETURN_ARRAY_APPEND_ALLOC: 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"); _array_validate(dst, 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; if (src_header->count >= remaining_capacity) { 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) { output = dst; goto RETURN_ARRAY_EXTEND_ALLOC; @@ -153,7 +157,8 @@ RETURN_ARRAY_EXTEND_ALLOC: 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"); _array_validate(dst, 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) { u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst_header->capacity * 2); output = (GenericArray )_array_alloc_capacity(allocator, new_capacity, - src_header->item_size, false); + src_header->item_size, flags); if (!output) { output = dst; goto RETURN_ARRAY_COPY_ALLOC; diff --git a/src/base/array/array.h b/src/base/array/array.h index b679d7e..a4283c4 100644 --- a/src/base/array/array.h +++ b/src/base/array/array.h @@ -153,21 +153,24 @@ typedef enum { (_array_copy_capped((GenericArray)DST_ARRAY, \ (GenericArray)SRC_ARRAY, \ 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, \ (GenericArray)ARRAY, \ (u8 *)VALUE_PTR, \ - sizeof(TYPE))) -#define wapp_array_extend_alloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY) \ + sizeof(TYPE), \ + FLAGS)) +#define wapp_array_extend_alloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY, FLAGS) \ ((TYPE *)_array_extend_alloc(ALLOCATOR_PTR, \ (GenericArray)DST_ARRAY, \ (GenericArray)SRC_ARRAY, \ - sizeof(TYPE))) -#define wapp_array_copy_alloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY) \ + sizeof(TYPE), \ + FLAGS)) +#define wapp_array_copy_alloc(TYPE, ALLOCATOR_PTR, DST_ARRAY, SRC_ARRAY, FLAGS) \ ((TYPE *)_array_copy_alloc(ALLOCATOR_PTR, \ (GenericArray)DST_ARRAY, \ (GenericArray)SRC_ARRAY, \ - sizeof(TYPE))) + sizeof(TYPE), \ + FLAGS)) #define wapp_array_clear(TYPE, ARRAY) \ (_array_clear((GenericArray)ARRAY, \ 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_extend_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_extend_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); +GenericArray _array_append_alloc(const Allocator *allocator, GenericArray array, void *value, + u64 item_size, ArrayInitFlags flags); +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_clear(GenericArray array, u64 item_size); u64 _array_calc_alloc_size(u64 capacity, u64 item_size); diff --git a/tests/array/test_i32_array.c b/tests/array/test_i32_array.c index 49f4491..8086f70 100644 --- a/tests/array/test_i32_array.c +++ b/tests/array/test_i32_array.c @@ -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 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; u64 count = 4; @@ -174,7 +174,7 @@ TestFuncResult test_i32_array_append_alloc(void) { b8 running = true; while (running) { 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; running = index < count; @@ -194,10 +194,10 @@ TestFuncResult test_i32_array_extend_alloc(void) { I32Array array2 = wapp_array(i32, 1, 2); 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; - 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; wapp_mem_arena_allocator_destroy(&allocator); @@ -215,7 +215,7 @@ TestFuncResult test_i32_array_copy_alloc(void) { I32Array array = NULL; 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; u64 index = 0; @@ -228,7 +228,7 @@ TestFuncResult test_i32_array_copy_alloc(void) { } 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; index = 0; diff --git a/tests/array/test_i32_array.cc b/tests/array/test_i32_array.cc index 2e9800a..38d6ee1 100644 --- a/tests/array/test_i32_array.cc +++ b/tests/array/test_i32_array.cc @@ -169,7 +169,7 @@ TestFuncResult test_i32_array_append_alloc(void) { I32Array array2 = wapp_array(i32, 1, 2); 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; u64 count = 4; @@ -177,7 +177,7 @@ TestFuncResult test_i32_array_append_alloc(void) { b8 running = true; while (running) { 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; running = index < count; @@ -197,10 +197,10 @@ TestFuncResult test_i32_array_extend_alloc(void) { I32Array array2 = wapp_array(i32, 1, 2); 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; - 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; wapp_mem_arena_allocator_destroy(&allocator); @@ -218,7 +218,7 @@ TestFuncResult test_i32_array_copy_alloc(void) { I32Array array = nullptr; 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; u64 index = 0; @@ -231,7 +231,7 @@ TestFuncResult test_i32_array_copy_alloc(void) { } 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; index = 0;