Add option to fill array when allocating

This commit is contained in:
2025-12-28 18:49:27 +00:00
parent 1cbb148a1f
commit 5e939a7158
4 changed files with 10 additions and 10 deletions

View File

@@ -66,7 +66,7 @@ GenericArray *_array_append_alloc(const Allocator *allocator, GenericArray *arra
if (array->count >= array->capacity) { if (array->count >= array->capacity) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(array->capacity * 2); u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(array->capacity * 2);
output = (GenericArray *)_array_alloc_capacity(allocator, new_capacity, array->item_size); output = (GenericArray *)_array_alloc_capacity(allocator, new_capacity, array->item_size, false);
if (!output) { if (!output) {
output = array; output = array;
goto RETURN_ARRAY_APPEND_ALLOC; goto RETURN_ARRAY_APPEND_ALLOC;
@@ -90,7 +90,7 @@ GenericArray *_array_extend_alloc(const Allocator *allocator, GenericArray *dst,
u64 remaining_capacity = dst->capacity - dst->count; u64 remaining_capacity = dst->capacity - dst->count;
if (src->count >= remaining_capacity) { if (src->count >= remaining_capacity) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst->capacity * 2); u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst->capacity * 2);
output = (GenericArray *)_array_alloc_capacity(allocator, new_capacity, dst->item_size); output = (GenericArray *)_array_alloc_capacity(allocator, new_capacity, dst->item_size, false);
if (!output) { if (!output) {
output = dst; output = dst;
goto RETURN_ARRAY_EXTEND_ALLOC; goto RETURN_ARRAY_EXTEND_ALLOC;
@@ -113,7 +113,7 @@ GenericArray *_array_copy_alloc(const Allocator *allocator, GenericArray *dst, c
if (src->count >= dst->capacity) { if (src->count >= dst->capacity) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst->capacity * 2); u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst->capacity * 2);
output = (GenericArray *)_array_alloc_capacity(allocator, new_capacity, src->item_size); output = (GenericArray *)_array_alloc_capacity(allocator, new_capacity, src->item_size, false);
if (!output) { if (!output) {
output = dst; output = dst;
goto RETURN_ARRAY_COPY_ALLOC; goto RETURN_ARRAY_COPY_ALLOC;
@@ -145,7 +145,7 @@ void _array_clear(GenericArray *array, u64 item_size) {
array->count = 0; array->count = 0;
} }
GenericArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size) { GenericArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size, b8 fill) {
wapp_runtime_assert(allocator != NULL, "`allocator` should not be NULL"); wapp_runtime_assert(allocator != NULL, "`allocator` should not be NULL");
GenericArray *output = NULL; GenericArray *output = NULL;
@@ -158,7 +158,7 @@ GenericArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u6
} }
output->magic = WAPP_ARRAY_MAGIC; output->magic = WAPP_ARRAY_MAGIC;
output->count = 0; output->count = fill ? capacity : 0;
output->capacity = capacity; output->capacity = capacity;
output->item_size = item_size; output->item_size = item_size;
output->items = (void *)(output + 1); output->items = (void *)(output + 1);

View File

@@ -17,8 +17,8 @@ BEGIN_C_LINKAGE
#define _calc_array_count(TYPE, ...) wapp_misc_utils_va_args_count(TYPE, __VA_ARGS__) #define _calc_array_count(TYPE, ...) wapp_misc_utils_va_args_count(TYPE, __VA_ARGS__)
#define _calc_array_capacity(TYPE, ...) wapp_misc_utils_u64_round_up_pow2(_calc_array_count(TYPE, __VA_ARGS__) * 2) #define _calc_array_capacity(TYPE, ...) wapp_misc_utils_u64_round_up_pow2(_calc_array_count(TYPE, __VA_ARGS__) * 2)
#define wapp_array_alloc_capacity(ELEM_TYPE, ARRAY_TYPE, ALLOCATOR_PTR, CAPACITY) \ #define wapp_array_alloc_capacity(ELEM_TYPE, ARRAY_TYPE, ALLOCATOR_PTR, CAPACITY, FILL) \
((ARRAY_TYPE *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(ELEM_TYPE))) ((ARRAY_TYPE *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(ELEM_TYPE), FILL))
#define WAPP_DEF_ARRAY_TYPE(T, NAME) \ #define WAPP_DEF_ARRAY_TYPE(T, NAME) \
typedef struct { \ typedef struct { \
@@ -131,7 +131,7 @@ GenericArray *_array_extend_alloc(const Allocator *allocator, GenericArray *dst,
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);
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);
GenericArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size); GenericArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size, b8 fill);
// Base array types // Base array types
typedef struct str8 Str8; typedef struct str8 Str8;

View File

@@ -150,7 +150,7 @@ TestFuncResult test_i32_array_alloc_capacity(void) {
Allocator allocator = wapp_mem_arena_allocator_init(MiB(4)); Allocator allocator = wapp_mem_arena_allocator_init(MiB(4));
u64 capacity = 32; u64 capacity = 32;
I32Array *array = wapp_array_alloc_capacity(i32, I32Array, &allocator, capacity); I32Array *array = wapp_array_alloc_capacity(i32, I32Array, &allocator, capacity, false);
result = array && array->capacity == capacity; result = array && array->capacity == capacity;

View File

@@ -152,7 +152,7 @@ TestFuncResult test_i32_array_alloc_capacity(void) {
Allocator allocator = wapp_mem_arena_allocator_init(MiB(4)); Allocator allocator = wapp_mem_arena_allocator_init(MiB(4));
u64 capacity = 32; u64 capacity = 32;
I32Array *array = wapp_array_alloc_capacity(i32, I32Array, &allocator, capacity); I32Array *array = wapp_array_alloc_capacity(i32, I32Array, &allocator, capacity, false);
result = array && array->capacity == capacity; result = array && array->capacity == capacity;