Switch array fill to flags

This commit is contained in:
2026-01-11 20:17:09 +00:00
parent ce76ac1e7c
commit a4492cf8e8
4 changed files with 26 additions and 19 deletions

View File

@@ -204,7 +204,8 @@ u64 _array_alloc_size(u64 capacity, u64 item_size) {
return sizeof(ArrayHeader) + item_size * capacity; return sizeof(ArrayHeader) + item_size * capacity;
} }
GenericArray _array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size, b8 fill) { GenericArray _array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size,
ArrayInitFlags flags) {
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;
@@ -217,7 +218,7 @@ GenericArray _array_alloc_capacity(const Allocator *allocator, u64 capacity, u64
output = (u8 *)(header + 1); output = (u8 *)(header + 1);
header->magic = WAPP_ARRAY_MAGIC; header->magic = WAPP_ARRAY_MAGIC;
header->count = fill ? capacity : 0; header->count = flags & ARRAY_INIT_FILLED ? capacity : 0;
header->capacity = capacity; header->capacity = capacity;
header->item_size = item_size; header->item_size = item_size;

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(TYPE, ALLOCATOR_PTR, CAPACITY, FILL) \ #define wapp_array_alloc_capacity(TYPE, ALLOCATOR_PTR, CAPACITY, FLAGS) \
((TYPE *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(TYPE), FILL)) ((TYPE *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(TYPE), FLAGS))
typedef struct Str8 Str8; typedef struct Str8 Str8;
@@ -44,6 +44,11 @@ typedef uptr *UptrArray;
typedef iptr *IptrArray; typedef iptr *IptrArray;
typedef Str8 *Str8Array; typedef Str8 *Str8Array;
typedef enum {
ARRAY_INIT_NONE = 0,
ARRAY_INIT_FILLED = 1 << 1,
} ArrayInitFlags;
#ifdef WAPP_PLATFORM_CPP #ifdef WAPP_PLATFORM_CPP
#define wapp_array(TYPE, ...) ([&]() { \ #define wapp_array(TYPE, ...) ([&]() { \
u64 capacity = _calc_array_capacity(TYPE, __VA_ARGS__); \ u64 capacity = _calc_array_capacity(TYPE, __VA_ARGS__); \
@@ -63,13 +68,13 @@ typedef Str8 *Str8Array;
memcpy(buf, items, capacity * sizeof(TYPE)); \ memcpy(buf, items, capacity * sizeof(TYPE)); \
return (TYPE *)buf; \ return (TYPE *)buf; \
}()) }())
#define wapp_array_with_capacity(TYPE, CAPACITY, FILL) ([&]() { \ #define wapp_array_with_capacity(TYPE, CAPACITY, FLAGS) ([&]() { \
wapp_persist u8 array[ \ wapp_persist u8 array[ \
sizeof(ArrayHeader) + CAPACITY * sizeof(TYPE) \ sizeof(ArrayHeader) + CAPACITY * sizeof(TYPE) \
] = {0}; \ ] = {0}; \
ArrayHeader *header = (ArrayHeader *)array; \ ArrayHeader *header = (ArrayHeader *)array; \
header->magic = WAPP_ARRAY_MAGIC; \ header->magic = WAPP_ARRAY_MAGIC; \
header->count = FILL ? CAPACITY : 0; \ header->count = (FLAGS & ARRAY_INIT_FILLED) ? CAPACITY : 0; \
header->capacity = CAPACITY; \ header->capacity = CAPACITY; \
header->item_size = sizeof(TYPE); \ header->item_size = sizeof(TYPE); \
\ \
@@ -100,12 +105,12 @@ typedef Str8 *Str8Array;
.items = {__VA_ARGS__}, \ .items = {__VA_ARGS__}, \
}.items \ }.items \
)) ))
#define wapp_array_with_capacity(TYPE, CAPACITY, FILL) \ #define wapp_array_with_capacity(TYPE, CAPACITY, FLAGS) \
((TYPE *)( \ ((TYPE *)( \
(_stack_array(TYPE, CAPACITY)){ \ (_stack_array(TYPE, CAPACITY)){ \
.header = { \ .header = { \
.magic = WAPP_ARRAY_MAGIC, \ .magic = WAPP_ARRAY_MAGIC, \
.count = FILL ? CAPACITY : 0, \ .count = (FLAGS & ARRAY_INIT_FILLED) ? CAPACITY : 0, \
.capacity = CAPACITY, \ .capacity = CAPACITY, \
.item_size = sizeof(TYPE), \ .item_size = sizeof(TYPE), \
}, \ }, \
@@ -191,7 +196,8 @@ GenericArray _array_copy_alloc(const Allocator *allocator, GenericArray dst, con
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_alloc_size(u64 capacity, u64 item_size); u64 _array_alloc_size(u64 capacity, u64 item_size);
GenericArray _array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size, b8 fill); GenericArray _array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size,
ArrayInitFlags flags);
#ifdef WAPP_PLATFORM_CPP #ifdef WAPP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE

View File

@@ -25,10 +25,10 @@ TestFuncResult test_i32_array(void) {
TestFuncResult test_i32_array_with_capacity(void) { TestFuncResult test_i32_array_with_capacity(void) {
b8 result; b8 result;
I32Array array1 = wapp_array_with_capacity(i32, 64, false); I32Array array1 = wapp_array_with_capacity(i32, 64, ARRAY_INIT_NONE);
result = wapp_array_count(array1) == 0 && wapp_array_capacity(array1) == 64; result = wapp_array_count(array1) == 0 && wapp_array_capacity(array1) == 64;
I32Array array2 = wapp_array_with_capacity(i32, 64, true); I32Array array2 = wapp_array_with_capacity(i32, 64, ARRAY_INIT_FILLED);
result = wapp_array_count(array2) == 64 && wapp_array_capacity(array2) == 64; result = wapp_array_count(array2) == 64 && wapp_array_capacity(array2) == 64;
return wapp_tester_result(result); return wapp_tester_result(result);
@@ -79,7 +79,7 @@ TestFuncResult test_i32_array_set(void) {
TestFuncResult test_i32_array_append_capped(void) { TestFuncResult test_i32_array_append_capped(void) {
b8 result; b8 result;
I32Array array = wapp_array_with_capacity(i32, 64, false); I32Array array = wapp_array_with_capacity(i32, 64, ARRAY_INIT_NONE);
wapp_array_append_capped(i32, array, &((i32){10})); wapp_array_append_capped(i32, array, &((i32){10}));
result = wapp_array_count(array) == 1; result = wapp_array_count(array) == 1;
@@ -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, &allocator, capacity, false); I32Array array = wapp_array_alloc_capacity(i32, &allocator, capacity, ARRAY_INIT_NONE);
result = array && wapp_array_capacity(array) == capacity; result = array && wapp_array_capacity(array) == capacity;
@@ -249,7 +249,7 @@ TestFuncResult test_i32_array_pop(void) {
b8 result; b8 result;
I32Array array1 = wapp_array(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8); I32Array array1 = wapp_array(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8);
I32Array array2 = wapp_array_with_capacity(i32, 32, false); I32Array array2 = wapp_array_with_capacity(i32, 32, ARRAY_INIT_NONE);
i32 item1 = wapp_array_pop(i32, array1); i32 item1 = wapp_array_pop(i32, array1);
i32 item2 = wapp_array_pop(i32, array2); i32 item2 = wapp_array_pop(i32, array2);

View File

@@ -25,10 +25,10 @@ TestFuncResult test_i32_array(void) {
TestFuncResult test_i32_array_with_capacity(void) { TestFuncResult test_i32_array_with_capacity(void) {
b8 result; b8 result;
I32Array array1 = wapp_array_with_capacity(i32, 64, false); I32Array array1 = wapp_array_with_capacity(i32, 64, ARRAY_INIT_NONE);
result = wapp_array_count(array1) == 0 && wapp_array_capacity(array1) == 64; result = wapp_array_count(array1) == 0 && wapp_array_capacity(array1) == 64;
I32Array array2 = wapp_array_with_capacity(i32, 64, true); I32Array array2 = wapp_array_with_capacity(i32, 64, ARRAY_INIT_FILLED);
result = wapp_array_count(array2) == 64 && wapp_array_capacity(array2) == 64; result = wapp_array_count(array2) == 64 && wapp_array_capacity(array2) == 64;
return wapp_tester_result(result); return wapp_tester_result(result);
@@ -79,7 +79,7 @@ TestFuncResult test_i32_array_set(void) {
TestFuncResult test_i32_array_append_capped(void) { TestFuncResult test_i32_array_append_capped(void) {
b8 result; b8 result;
I32Array array = wapp_array_with_capacity(i32, 64, false); I32Array array = wapp_array_with_capacity(i32, 64, ARRAY_INIT_NONE);
i32 item1 = 10; i32 item1 = 10;
wapp_array_append_capped(i32, array, &item1); wapp_array_append_capped(i32, array, &item1);
@@ -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, &allocator, capacity, false); I32Array array = wapp_array_alloc_capacity(i32, &allocator, capacity, ARRAY_INIT_NONE);
result = array && wapp_array_capacity(array) == capacity; result = array && wapp_array_capacity(array) == capacity;
@@ -265,7 +265,7 @@ TestFuncResult test_i32_array_pop(void) {
b8 result; b8 result;
I32Array array1 = wapp_array(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8); I32Array array1 = wapp_array(i32, 0, 1, 2, 3, 4, 5, 6, 7, 8);
I32Array array2 = wapp_array_with_capacity(i32, 32, false); I32Array array2 = wapp_array_with_capacity(i32, 32, ARRAY_INIT_NONE);
i32 item1 = wapp_array_pop(i32, array1); i32 item1 = wapp_array_pop(i32, array1);
i32 item2 = wapp_array_pop(i32, array2); i32 item2 = wapp_array_pop(i32, array2);