diff -r 55b13f583356 -r f5883f6e42e7 src/array_list.c --- a/src/array_list.c Sun Dec 14 17:30:17 2025 +0100 +++ b/src/array_list.c Sun Dec 14 21:14:34 2025 +0100 @@ -218,6 +218,43 @@ return 0; } +int cx_array_init_(CxArray *array, const CxAllocator *allocator, size_t elem_size, size_t capacity) { + array->size = 0; + array->capacity = capacity; + array->data = cxCalloc(allocator, capacity, elem_size); + return array->data == NULL; +} + +static size_t cx_array_increase_capacity(size_t old_capacity) { + // TODO: make this strategy better + if (old_capacity < 1024) { + return old_capacity + 64; + } else { + return old_capacity + 128; + } +} + +int cx_array_add_(CxArray *array, const CxAllocator *allocator, size_t elem_size, void *element) { + if (array->size >= array->capacity) { + size_t newcap = cx_array_increase_capacity(array->capacity); + if (cxReallocateArray(allocator, &array->data, newcap, elem_size)) { + return -1; + } + array->capacity = newcap; + } + char *dst = array->data; + dst += elem_size * array->size; + memcpy(dst, element, elem_size); + array->size++; + return 0; +} + +void cx_array_free_(const CxAllocator *allocator, CxArray *array) { + cxFree(allocator, array->data); + array->data = NULL; + array->size = array->capacity = 0; +} + int cx_array_copy( void **target, void *size,