Replace VoidPArray with GenericArray and remove function implementations

This commit is contained in:
Abdelrahman Said
2025-09-14 23:13:36 +01:00
parent b7eff6a3e4
commit 033fccb8a1
4 changed files with 267 additions and 454 deletions

View File

@@ -77,8 +77,8 @@ def make_array(user_datatypes: Dict[CDataType, ArrayData] = {}):
for _type in CType: for _type in CType:
if _type == CType.VOID: if _type == CType.VOID:
datatypes["void *"] = ArrayData( datatypes[_type.value] = ArrayData(
array_typename="VoidPArray", array_typename="GenericArray",
) )
continue continue
@@ -137,7 +137,7 @@ def make_array(user_datatypes: Dict[CDataType, ArrayData] = {}):
], ],
) )
if isinstance(_type, str) and _type == "void *": if isinstance(_type, str) and _type == CType.VOID.value:
alloc_capacity_func = CFunc( alloc_capacity_func = CFunc(
name=f"_array_alloc_capacity", name=f"_array_alloc_capacity",
ret_type=array, ret_type=array,
@@ -156,275 +156,276 @@ def make_array(user_datatypes: Dict[CDataType, ArrayData] = {}):
pointer=CPointer(CPointerType.SINGLE), pointer=CPointer(CPointerType.SINGLE),
) )
generic_funcs.append(alloc_capacity_func) generic_funcs.append(alloc_capacity_func)
else:
stack_array_cmacro = CMacro( stack_array_cmacro = CMacro(
name=f"wapp_{type_string_lower}_array(...)", name=f"wapp_{type_string_lower}_array(...)",
value=__format_func_body( value=__format_func_body(
filename=snippets_dir / "stack_array", filename=snippets_dir / "stack_array",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
) )
stack_array_cppmacro = CMacro( stack_array_cppmacro = CMacro(
name=f"wapp_{type_string_lower}_array(...)", name=f"wapp_{type_string_lower}_array(...)",
value=__format_func_body( value=__format_func_body(
filename=snippets_dir / "stack_array_cpp", filename=snippets_dir / "stack_array_cpp",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
) )
stack_capacity_array_cmacro = CMacro( stack_capacity_array_cmacro = CMacro(
name=f"wapp_{type_string_lower}_array_with_capacity(CAPACITY)", name=f"wapp_{type_string_lower}_array_with_capacity(CAPACITY)",
value=__format_func_body( value=__format_func_body(
filename=snippets_dir / "stack_capacity_array", filename=snippets_dir / "stack_capacity_array",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
) )
stack_capacity_array_cppmacro = CMacro( stack_capacity_array_cppmacro = CMacro(
name=f"wapp_{type_string_lower}_array_with_capacity(CAPACITY)", name=f"wapp_{type_string_lower}_array_with_capacity(CAPACITY)",
value=__format_func_body( value=__format_func_body(
filename=snippets_dir / "stack_capacity_array_cpp", filename=snippets_dir / "stack_capacity_array_cpp",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
) )
alloc_capacity_array_macro = CMacro( alloc_capacity_array_macro = CMacro(
name=f"wapp_{type_string_lower}_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY)", name=f"wapp_{type_string_lower}_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY)",
value=__format_func_body( value=__format_func_body(
filename=snippets_dir / "alloc_capacity_macro", filename=snippets_dir / "alloc_capacity_macro",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
) )
array_pop_cmacro = CMacro( array_pop_cmacro = CMacro(
name=f"wapp_{type_string_lower}_array_pop(ARRAY_PTR)", name=f"wapp_{type_string_lower}_array_pop(ARRAY_PTR)",
value=__format_func_body( value=__format_func_body(
filename=snippets_dir / "array_pop_macro", filename=snippets_dir / "array_pop_macro",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
) )
array_pop_cppmacro = CMacro( array_pop_cppmacro = CMacro(
name=f"wapp_{type_string_lower}_array_pop(ARRAY_PTR)", name=f"wapp_{type_string_lower}_array_pop(ARRAY_PTR)",
value=__format_func_body( value=__format_func_body(
filename=snippets_dir / "array_pop_macro_cpp", filename=snippets_dir / "array_pop_macro_cpp",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
) )
get_func = CFunc( get_func = CFunc(
name=f"wapp_{type_string_lower}_array_get", name=f"wapp_{type_string_lower}_array_get",
ret_type=type_string, ret_type=type_string,
args=[ args=[
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST), CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
CArg(name="index", _type=CType.U64), CArg(name="index", _type=CType.U64),
], ],
body=__format_func_body( body=__format_func_body(
filename=snippets_dir / "array_get", filename=snippets_dir / "array_get",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
pointer=CPointer(CPointerType.SINGLE), pointer=CPointer(CPointerType.SINGLE),
) )
set_func = CFunc( set_func = CFunc(
name=f"wapp_{type_string_lower}_array_set", name=f"wapp_{type_string_lower}_array_set",
ret_type=CType.VOID, ret_type=CType.VOID,
args=[ args=[
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)), CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
CArg(name="index", _type=CType.U64), CArg(name="index", _type=CType.U64),
CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)), CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)),
], ],
body=__format_func_body( body=__format_func_body(
filename=snippets_dir / "array_set", filename=snippets_dir / "array_set",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
) )
append_capped_func = CFunc( append_capped_func = CFunc(
name=f"wapp_{type_string_lower}_array_append_capped", name=f"wapp_{type_string_lower}_array_append_capped",
ret_type=CType.VOID, ret_type=CType.VOID,
args=[ args=[
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)), CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)), CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)),
], ],
body=__format_func_body( body=__format_func_body(
filename=snippets_dir / "append_capped", filename=snippets_dir / "append_capped",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
) )
extend_capped_func = CFunc( extend_capped_func = CFunc(
name=f"wapp_{type_string_lower}_array_extend_capped", name=f"wapp_{type_string_lower}_array_extend_capped",
ret_type=CType.VOID, ret_type=CType.VOID,
args=[ args=[
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)), CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
CArg(name="other", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST), CArg(name="other", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
], ],
body=__format_func_body( body=__format_func_body(
filename=snippets_dir / "extend_capped", filename=snippets_dir / "extend_capped",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
) )
clear_func = CFunc( clear_func = CFunc(
name=f"wapp_{type_string_lower}_array_clear", name=f"wapp_{type_string_lower}_array_clear",
ret_type=CType.VOID, ret_type=CType.VOID,
args=[ args=[
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)), CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
], ],
body=__format_func_body( body=__format_func_body(
filename=snippets_dir / "clear", filename=snippets_dir / "clear",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
) )
copy_capped_func = CFunc( copy_capped_func = CFunc(
name=f"wapp_{type_string_lower}_array_copy_capped", name=f"wapp_{type_string_lower}_array_copy_capped",
ret_type=CType.VOID, ret_type=CType.VOID,
args=[ args=[
CArg(name="src", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST), CArg(name="src", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
CArg(name="dst", _type=array, pointer=CPointer(CPointerType.SINGLE)), CArg(name="dst", _type=array, pointer=CPointer(CPointerType.SINGLE)),
], ],
body=__format_func_body( body=__format_func_body(
filename=snippets_dir / "copy_capped", filename=snippets_dir / "copy_capped",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
) )
append_alloc_func = CFunc( append_alloc_func = CFunc(
name=f"wapp_{type_string_lower}_array_append_alloc", name=f"wapp_{type_string_lower}_array_append_alloc",
ret_type=array, ret_type=array,
args=[ args=[
CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST), CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)), CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)), CArg(name="item", _type=type_string, pointer=CPointer(CPointerType.SINGLE)),
], ],
body=__format_func_body( body=__format_func_body(
filename=snippets_dir / "append_alloc", filename=snippets_dir / "append_alloc",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
pointer=CPointer(CPointerType.SINGLE), pointer=CPointer(CPointerType.SINGLE),
) )
extend_alloc_func = CFunc( extend_alloc_func = CFunc(
name=f"wapp_{type_string_lower}_array_extend_alloc", name=f"wapp_{type_string_lower}_array_extend_alloc",
ret_type=array, ret_type=array,
args=[ args=[
CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST), CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)), CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
CArg(name="other", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST), CArg(name="other", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
], ],
body=__format_func_body( body=__format_func_body(
filename=snippets_dir / "extend_alloc", filename=snippets_dir / "extend_alloc",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
pointer=CPointer(CPointerType.SINGLE), pointer=CPointer(CPointerType.SINGLE),
) )
copy_alloc_func = CFunc( copy_alloc_func = CFunc(
name=f"wapp_{type_string_lower}_array_copy_alloc", name=f"wapp_{type_string_lower}_array_copy_alloc",
ret_type=array, ret_type=array,
args=[ args=[
CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST), CArg(name="allocator", _type="Allocator", pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
CArg(name="src", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST), CArg(name="src", _type=array, pointer=CPointer(CPointerType.SINGLE), qualifier=CQualifier.CONST),
CArg(name="dst", _type=array, pointer=CPointer(CPointerType.SINGLE)), CArg(name="dst", _type=array, pointer=CPointer(CPointerType.SINGLE)),
], ],
body=__format_func_body( body=__format_func_body(
filename=snippets_dir / "copy_alloc", filename=snippets_dir / "copy_alloc",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
pointer=CPointer(CPointerType.SINGLE), pointer=CPointer(CPointerType.SINGLE),
) )
pop_func = CFunc( pop_func = CFunc(
name=f"_{type_string_lower}_array_pop", name=f"_{type_string_lower}_array_pop",
ret_type=type_string, ret_type=type_string,
args=[ args=[
CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)), CArg(name="array", _type=array, pointer=CPointer(CPointerType.SINGLE)),
], ],
body=__format_func_body( body=__format_func_body(
filename=snippets_dir / "array_pop", filename=snippets_dir / "array_pop",
type_string=type_string, type_string=type_string,
type_string_upper=type_string_upper, type_string_upper=type_string_upper,
type_string_lower=type_string_lower, type_string_lower=type_string_lower,
array_typename=array_data.array_typename, array_typename=array_data.array_typename,
), ),
pointer=CPointer(CPointerType.SINGLE), pointer=CPointer(CPointerType.SINGLE),
) )
header.macros.extend([
alloc_capacity_array_macro,
])
header.c_macros.extend([
stack_array_cmacro,
stack_capacity_array_cmacro,
array_pop_cmacro,
])
header.cpp_macros.extend([
stack_array_cppmacro,
stack_capacity_array_cppmacro,
array_pop_cppmacro,
])
header.funcs.extend([
get_func,
set_func,
append_capped_func,
extend_capped_func,
clear_func,
copy_capped_func,
append_alloc_func,
extend_alloc_func,
copy_alloc_func,
pop_func,
])
header.decl_types.extend(array_data.hdr_decl_types) header.decl_types.extend(array_data.hdr_decl_types)
header.macros.extend([
alloc_capacity_array_macro,
])
header.c_macros.extend([
stack_array_cmacro,
stack_capacity_array_cmacro,
array_pop_cmacro,
])
header.cpp_macros.extend([
stack_array_cppmacro,
stack_capacity_array_cppmacro,
array_pop_cppmacro,
])
header.types.extend([array]) header.types.extend([array])
header.funcs.extend([
get_func,
set_func,
append_capped_func,
extend_capped_func,
clear_func,
copy_capped_func,
append_alloc_func,
extend_alloc_func,
copy_alloc_func,
pop_func,
])
source.decl_types.extend(array_data.src_decl_types) source.decl_types.extend(array_data.src_decl_types)
source.funcs = header.funcs source.funcs = header.funcs

View File

@@ -1,4 +1,4 @@
wapp_debug_assert(allocator != NULL, "`array` should not be NULL"); wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL");
u64 allocation_size = sizeof({ArrayType}) + item_size * capacity; u64 allocation_size = sizeof({ArrayType}) + item_size * capacity;
{ArrayType} *array = wapp_mem_allocator_alloc(allocator, allocation_size); {ArrayType} *array = wapp_mem_allocator_alloc(allocator, allocation_size);

View File

@@ -159,155 +159,6 @@ Str8 *_str8_array_pop(Str8Array *array) {
return out; return out;
} }
void * *wapp_void_ptr_array_get(const VoidPArray *array, u64 index) {
wapp_debug_assert(array != NULL, "`array` should not be NULL");
wapp_runtime_assert(index < array->count, "`index` is out of bounds");
u8 *ptr = (u8 *)(array->items) + (array->item_size * index);
return (void * *)ptr;
}
void wapp_void_ptr_array_set(VoidPArray *array, u64 index, void * *item) {
void * *ptr = wapp_void_ptr_array_get(array, index);
memcpy((void *)ptr, (void *)item, array->item_size);
}
void wapp_void_ptr_array_append_capped(VoidPArray *array, void * *item) {
wapp_debug_assert(array != NULL, "`array` should not be NULL");
wapp_runtime_assert(array->count < array->capacity, "`array` is full");
u64 index = (array->count)++;
wapp_void_ptr_array_set(array, index, item);
}
void wapp_void_ptr_array_extend_capped(VoidPArray *array, const VoidPArray *other) {
wapp_debug_assert(array != NULL && other != NULL, "`array` and `other` should not be NULL");
u64 remaining_capacity = array->capacity - array->count;
wapp_runtime_assert(other->count < remaining_capacity, "`array` does not have enough capacity");
void * *item;
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
// MSVC Spectre mitigation warnings
u64 items_to_add = other->count;
u64 item_index = 0;
b32 running = true;
while (running) {
item = wapp_void_ptr_array_get(other, item_index);
++item_index;
running = item_index < items_to_add;
if (!item) {
continue;
}
wapp_void_ptr_array_append_capped(array, item);
}
}
void wapp_void_ptr_array_clear(VoidPArray *array) {
wapp_debug_assert(array != NULL, "`array` should not be NULL");
array->count = 0;
}
void wapp_void_ptr_array_copy_capped(const VoidPArray *src, VoidPArray *dst) {
wapp_debug_assert(src != NULL && dst != NULL, "`src` and `dst` should not be NULL");
wapp_void_ptr_array_clear(dst);
void * *item;
// NOTE (Abdelrahman): Uses a while loop instead of a for loop to get rid of
// MSVC Spectre mitigation warnings
u64 to_copy = src->count < dst->capacity ? src->count : dst->capacity;
u64 item_index = 0;
b32 running = true;
while (running) {
item = wapp_void_ptr_array_get(src, item_index);
++item_index;
running = item_index < to_copy;
if (!item) {
continue;
}
wapp_void_ptr_array_append_capped(dst, item);
}
}
VoidPArray *wapp_void_ptr_array_append_alloc(const Allocator *allocator, VoidPArray *array, void * *item) {
wapp_debug_assert(allocator != NULL && array != NULL, "`allocator` and `array` should not be NULL");
VoidPArray *output = array;
if (array->count >= array->capacity) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(array->capacity * 2);
output = (VoidPArray *)_array_alloc_capacity(allocator, new_capacity, array->item_size);
if (!output) {
output = array;
goto RETURN_VOID_PTR_ARRAY_APPEND_ALLOC;
}
wapp_void_ptr_array_copy_capped(array, output);
}
wapp_void_ptr_array_append_capped(output, item);
RETURN_VOID_PTR_ARRAY_APPEND_ALLOC:
return output;
}
VoidPArray *wapp_void_ptr_array_extend_alloc(const Allocator *allocator, VoidPArray *array, const VoidPArray *other) {
wapp_debug_assert(allocator != NULL && array != NULL && other != NULL, "`allocator`, `array` and `other` should not be NULL");
VoidPArray *output = array;
u64 remaining_capacity = array->capacity - array->count;
if (other->count >= remaining_capacity) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(array->capacity * 2);
output = (VoidPArray *)_array_alloc_capacity(allocator, new_capacity, array->item_size);
if (!output) {
output = array;
goto RETURN_VOID_PTR_ARRAY_EXTEND_ALLOC;
}
wapp_void_ptr_array_copy_capped(array, output);
}
wapp_void_ptr_array_extend_capped(output, other);
RETURN_VOID_PTR_ARRAY_EXTEND_ALLOC:
return output;
}
VoidPArray *wapp_void_ptr_array_copy_alloc(const Allocator *allocator, const VoidPArray *src, VoidPArray *dst) {
wapp_debug_assert(allocator != NULL && src != NULL && dst != NULL, "`allocator`, `src` and `dst` should not be NULL");
VoidPArray *output = dst;
if (src->count >= dst->capacity) {
u64 new_capacity = wapp_misc_utils_u64_round_up_pow2(dst->capacity * 2);
output = (VoidPArray *)_array_alloc_capacity(allocator, new_capacity, src->item_size);
if (!output) {
output = dst;
goto RETURN_VOID_PTR_ARRAY_COPY_ALLOC;
}
}
wapp_void_ptr_array_clear(output);
wapp_void_ptr_array_copy_capped(src, output);
RETURN_VOID_PTR_ARRAY_COPY_ALLOC:
return output;
}
void * *_void_ptr_array_pop(VoidPArray *array) {
u64 index = array->count - 1;
void * *out = wapp_void_ptr_array_get(array, index);
--(array->count);
return out;
}
b32 *wapp_b32_array_get(const B32Array *array, u64 index) { b32 *wapp_b32_array_get(const B32Array *array, u64 index) {
wapp_debug_assert(array != NULL, "`array` should not be NULL"); wapp_debug_assert(array != NULL, "`array` should not be NULL");
wapp_runtime_assert(index < array->count, "`index` is out of bounds"); wapp_runtime_assert(index < array->count, "`index` is out of bounds");
@@ -2990,16 +2841,16 @@ uptr *_uptr_array_pop(UptrArray *array) {
return out; return out;
} }
VoidPArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size) { GenericArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size) {
wapp_debug_assert(allocator != NULL, "`array` should not be NULL"); wapp_debug_assert(allocator != NULL, "`allocator` should not be NULL");
u64 allocation_size = sizeof(VoidPArray) + item_size * capacity; u64 allocation_size = sizeof(GenericArray) + item_size * capacity;
VoidPArray *array = wapp_mem_allocator_alloc(allocator, allocation_size); GenericArray *array = wapp_mem_allocator_alloc(allocator, allocation_size);
if (!array) { if (!array) {
goto RETURN_GENERIC_ARRAY_ALLOC; goto RETURN_GENERIC_ARRAY_ALLOC;
} }
array->items = (void * *)((u8 *)array + sizeof(VoidPArray)); array->items = (void *)((u8 *)array + sizeof(GenericArray));
array->count = 0; array->count = 0;
array->capacity = capacity; array->capacity = capacity;
array->item_size = item_size; array->item_size = item_size;

View File

@@ -15,7 +15,6 @@ BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP #endif // !WAPP_PLATFORM_CPP
#define wapp_str8_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((Str8Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(Str8))) #define wapp_str8_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((Str8Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(Str8)))
#define wapp_void_ptr_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((VoidPArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(void *)))
#define wapp_b32_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((B32Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(b32))) #define wapp_b32_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((B32Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(b32)))
#define wapp_char_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((CharArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(char))) #define wapp_char_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((CharArray *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(char)))
#define wapp_c8_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((C8Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(c8))) #define wapp_c8_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY) ((C8Array *)_array_alloc_capacity(ALLOCATOR_PTR, CAPACITY, sizeof(c8)))
@@ -53,23 +52,6 @@ BEGIN_C_LINKAGE
*_str8_array_pop(ARRAY_PTR) : \ *_str8_array_pop(ARRAY_PTR) : \
Str8{} \ Str8{} \
) )
#define wapp_void_ptr_array(...) ([&]() { \
persistent void * buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(void *, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
return VoidPArray{ \
buf, \
wapp_misc_utils_va_args_count(void *, __VA_ARGS__), \
wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(void *, __VA_ARGS__) * 2), \
sizeof(void *) \
}; \
}())
#define wapp_void_ptr_array_with_capacity(CAPACITY) ([&]() { \
persistent void * buf[CAPACITY] = {}; \
return VoidPArray{buf, 0, CAPACITY, sizeof(void *)}; \
}())
#define wapp_void_ptr_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
*_void_ptr_array_pop(ARRAY_PTR) : \
void *{} \
)
#define wapp_b32_array(...) ([&]() { \ #define wapp_b32_array(...) ([&]() { \
persistent b32 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(b32, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \ persistent b32 buf[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(b32, __VA_ARGS__) * 2)] = {__VA_ARGS__}; \
return B32Array{ \ return B32Array{ \
@@ -388,17 +370,6 @@ BEGIN_C_LINKAGE
*_str8_array_pop(ARRAY_PTR) : \ *_str8_array_pop(ARRAY_PTR) : \
(Str8){0} \ (Str8){0} \
) )
#define wapp_void_ptr_array(...) ((VoidPArray){ \
.items = (void *[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(void *, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
.count = wapp_misc_utils_va_args_count(void *, __VA_ARGS__), \
.capacity = wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(void *, __VA_ARGS__) * 2), \
.item_size = sizeof(void *) \
})
#define wapp_void_ptr_array_with_capacity(CAPACITY) ((VoidPArray){.items = (void *[CAPACITY]){0}, .count = 0, .capacity = CAPACITY, .item_size = sizeof(void *)})
#define wapp_void_ptr_array_pop(ARRAY_PTR) (ARRAY_PTR != NULL && (ARRAY_PTR)->count > 0 ? \
*_void_ptr_array_pop(ARRAY_PTR) : \
(void *){0} \
)
#define wapp_b32_array(...) ((B32Array){ \ #define wapp_b32_array(...) ((B32Array){ \
.items = (b32[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(b32, __VA_ARGS__) * 2)]){__VA_ARGS__}, \ .items = (b32[wapp_misc_utils_u64_round_up_pow2(wapp_misc_utils_va_args_count(b32, __VA_ARGS__) * 2)]){__VA_ARGS__}, \
.count = wapp_misc_utils_va_args_count(b32, __VA_ARGS__), \ .count = wapp_misc_utils_va_args_count(b32, __VA_ARGS__), \
@@ -609,9 +580,9 @@ struct Str8Array {
u64 item_size; u64 item_size;
}; };
typedef struct VoidPArray VoidPArray; typedef struct GenericArray GenericArray;
struct VoidPArray { struct GenericArray {
void * *items; void *items;
u64 count; u64 count;
u64 capacity; u64 capacity;
u64 item_size; u64 item_size;
@@ -771,16 +742,6 @@ Str8Array *wapp_str8_array_append_alloc(const Allocator *allocator, Str8Array *a
Str8Array *wapp_str8_array_extend_alloc(const Allocator *allocator, Str8Array *array, const Str8Array *other); Str8Array *wapp_str8_array_extend_alloc(const Allocator *allocator, Str8Array *array, const Str8Array *other);
Str8Array *wapp_str8_array_copy_alloc(const Allocator *allocator, const Str8Array *src, Str8Array *dst); Str8Array *wapp_str8_array_copy_alloc(const Allocator *allocator, const Str8Array *src, Str8Array *dst);
Str8 *_str8_array_pop(Str8Array *array); Str8 *_str8_array_pop(Str8Array *array);
void * *wapp_void_ptr_array_get(const VoidPArray *array, u64 index);
void wapp_void_ptr_array_set(VoidPArray *array, u64 index, void * *item);
void wapp_void_ptr_array_append_capped(VoidPArray *array, void * *item);
void wapp_void_ptr_array_extend_capped(VoidPArray *array, const VoidPArray *other);
void wapp_void_ptr_array_clear(VoidPArray *array);
void wapp_void_ptr_array_copy_capped(const VoidPArray *src, VoidPArray *dst);
VoidPArray *wapp_void_ptr_array_append_alloc(const Allocator *allocator, VoidPArray *array, void * *item);
VoidPArray *wapp_void_ptr_array_extend_alloc(const Allocator *allocator, VoidPArray *array, const VoidPArray *other);
VoidPArray *wapp_void_ptr_array_copy_alloc(const Allocator *allocator, const VoidPArray *src, VoidPArray *dst);
void * *_void_ptr_array_pop(VoidPArray *array);
b32 *wapp_b32_array_get(const B32Array *array, u64 index); b32 *wapp_b32_array_get(const B32Array *array, u64 index);
void wapp_b32_array_set(B32Array *array, u64 index, b32 *item); void wapp_b32_array_set(B32Array *array, u64 index, b32 *item);
void wapp_b32_array_append_capped(B32Array *array, b32 *item); void wapp_b32_array_append_capped(B32Array *array, b32 *item);
@@ -961,7 +922,7 @@ UptrArray *wapp_uptr_array_append_alloc(const Allocator *allocator, UptrArray *a
UptrArray *wapp_uptr_array_extend_alloc(const Allocator *allocator, UptrArray *array, const UptrArray *other); UptrArray *wapp_uptr_array_extend_alloc(const Allocator *allocator, UptrArray *array, const UptrArray *other);
UptrArray *wapp_uptr_array_copy_alloc(const Allocator *allocator, const UptrArray *src, UptrArray *dst); UptrArray *wapp_uptr_array_copy_alloc(const Allocator *allocator, const UptrArray *src, UptrArray *dst);
uptr *_uptr_array_pop(UptrArray *array); uptr *_uptr_array_pop(UptrArray *array);
VoidPArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size); GenericArray *_array_alloc_capacity(const Allocator *allocator, u64 capacity, u64 item_size);
#ifdef WAPP_PLATFORM_CPP #ifdef WAPP_PLATFORM_CPP
END_C_LINKAGE END_C_LINKAGE