diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/resarr.c | 73 |
1 files changed, 73 insertions, 0 deletions
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 <stdlib.h> +#include <stdint.h> +#include <string.h> + +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; +} + |