diff options
| author | iamcheeseman <[email protected]> | 2026-05-08 19:30:44 -0400 |
|---|---|---|
| committer | iamcheeseman <[email protected]> | 2026-05-08 19:30:44 -0400 |
| commit | 5625a8626fe303748b205c80f87035593cf2f561 (patch) | |
| tree | 5e5a5adb6f1265358ae21ec47cd384362345df5a /teensy/dyn_arr.c | |
Initial commit
Diffstat (limited to 'teensy/dyn_arr.c')
| -rw-r--r-- | teensy/dyn_arr.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/teensy/dyn_arr.c b/teensy/dyn_arr.c new file mode 100644 index 0000000..38e3b31 --- /dev/null +++ b/teensy/dyn_arr.c @@ -0,0 +1,44 @@ +#include "dyn_arr.h" + +#include <stdio.h> +#include <assert.h> + +void *_ty_list_create(size_t type_size, int init_cap) +{ + init_cap = init_cap < TY_LIST_MIN_CAP + ? TY_LIST_MIN_CAP + : init_cap; + + int *arr = (int*)ty_alloc(type_size * init_cap + sizeof(int) * 2); + + arr[0] = 0; + arr[1] = init_cap; + return (void*)(arr + 2); +} + +void *_ty_list_append_slot(size_t type_size, void **arr) +{ + int *cap = ty_list_cap_ptr(*arr); + int *len = ty_list_len_ptr(*arr); + + (*len)++; + + if (*len > *cap) { + *cap *= TY_LIST_GROW_RATE; + + void* base = ty_list_base(*arr); + base = ty_realloc(base, (type_size * *cap) + sizeof(int) * 2); + assert(base != NULL); // Just to handle the case + *arr = (void*)((int*)base + 2); + + len = ty_list_len_ptr(*arr); + } + + return (char*)*arr + ((*len - 1) * type_size); +} + +void ty_list_free(void *arr) +{ + void *base = ty_list_base(arr); + ty_free(base); +} |
