Switch array fill to flags
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user