From 7f6011bc44e0d7643b3f1eafefbd4fa1390c1661 Mon Sep 17 00:00:00 2001 From: Ren Kararou Date: Fri, 31 Jan 2025 01:34:25 -0600 Subject: implement the easy parts of resizable array --- src/resarr.c | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/resarr.c (limited to 'src') diff --git a/src/resarr.c b/src/resarr.c new file mode 100644 index 0000000..4a72217 --- /dev/null +++ b/src/resarr.c @@ -0,0 +1,73 @@ +#include "resarr.h" + +#include +#include +#include + +stype_resarr resarr_create(size_t elemsize) { + return (stype_resarr) { .elemsize = elemsize, .elemcount = 0, .allocsize = 0, .array = NULL }; +} + +int resarr_reserve(stype_resarr *arr, size_t elemcount) { + if (arr == NULL) return -1; + size_t ec = 1; + while (ec < elemcount) { + ec *= 2; + } + if (ec * arr->elemsize < arr->allocsize) return -1; + arr->array = realloc(arr->array, (ec * arr->elemsize)); + if (arr->array == NULL) return -1; + arr->allocsize = ec * arr->elemsize; + return 0; +} + +int resarr_reserve_exact(stype_resarr *arr, size_t elemcount) { + if (arr == NULL) return -1; + if (elemcount * arr->elemsize < arr->allocsize) return -1; + arr->array = realloc(arr->array, (elemcount * arr->elemsize)); + if (arr->array == NULL) return -1; + arr->allocsize = elemcount * arr->elemsize; + return 0; +} + +int resarr_push(stype_resarr *arr, void *elem) { + if (arr == NULL) return -1; + if (arr->elemsize * arr->elemcount == arr->allocsize) { + arr->array = realloc(arr->array, (arr->allocsize * 2)); + if (arr->array == NULL) return -1; + arr->allocsize *= 2; + } + memcpy( + ((uintptr_t *)arr->array + (arr->elemsize * arr->elemcount)), + (uintptr_t *)elem, + arr->elemsize + ); + return 0; +} + +int resarr_pop(stype_resarr *arr) { + if (arr == NULL) return -1; + if (arr->array == NULL) return -1; + memset( + ((uintptr_t *)arr->array + (arr->elemsize * arr->elemcount)), + 0, + arr->elemsize + ); + return 0; +} + +size_t resarr_size(stype_resarr arr) { + return arr.elemcount; +} + +// TODO: insert{,_single}, delete, swap, clear + +int resarr_destroy(stype_resarr *arr) { + if (arr == NULL) return -1; + free(arr->array); + arr->elemcount = 0; + arr->elemsize = 0; + arr->allocsize = 0; + return 0; +} + -- cgit 1.4.1-2-gfad0