From 957c64c7b8b5e98d8a03dd84c7e27e7991fb9dbc Mon Sep 17 00:00:00 2001 From: iamcheeseman Date: Mon, 6 Apr 2026 17:04:05 -0400 Subject: Initial commit --- common/dyn_arr.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 common/dyn_arr.c (limited to 'common/dyn_arr.c') diff --git a/common/dyn_arr.c b/common/dyn_arr.c new file mode 100644 index 0000000..f378702 --- /dev/null +++ b/common/dyn_arr.c @@ -0,0 +1,44 @@ +#include "dyn_arr.h" + +#include +#include + +void *_da_create(size_t type_size, int init_cap) +{ + init_cap = init_cap < DA_MIN_CAP + ? DA_MIN_CAP + : init_cap; + + int *arr = (int*)mem_alloc(type_size * init_cap + sizeof(int) * 2); + + arr[0] = 0; + arr[1] = init_cap; + return (void*)(arr + 2); +} + +void *_da_append_slot(size_t type_size, void **arr) +{ + int *cap = da_cap_ptr(*arr); + int *len = da_len_ptr(*arr); + + (*len)++; + + if (*len > *cap) { + *cap *= DA_GROW_RATE; + + void* base = da_base(*arr); + base = mem_realloc(base, (type_size * *cap) + sizeof(int) * 2); + assert(base != NULL); // Just to handle the case + *arr = (void*)((int*)base + 2); + + len = da_len_ptr(*arr); + } + + return (char*)*arr + ((*len - 1) * type_size); +} + +void da_free(void *arr) +{ + void *base = da_base(arr); + mem_free(base); +} -- cgit v1.3-2-g0d8e