#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; }