X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=blobdiff_plain;f=src%2Fdynarr.h;h=8690b5abf31fa8e0d307ec3657cf902229636469;hp=e5283054f1ea714bd466b64be00f2f47f1501b4f;hb=8001fafbf699a4048046d4393377e3ec83480b95;hpb=c76efec19002adcbe637534a3abddb92014aadc3 diff --git a/src/dynarr.h b/src/dynarr.h index e528305..8690b5a 100644 --- a/src/dynarr.h +++ b/src/dynarr.h @@ -5,18 +5,6 @@ #ifndef DYNARR_H_ #define DYNARR_H_ -void *dynarr_alloc(int elem, int szelem); -void dynarr_free(void *da); -void *dynarr_resize(void *da, int elem); - -int dynarr_empty(void *da); -int dynarr_size(void *da); - -/* stack semantics */ -void *dynarr_push(void *da, void *item); -void *dynarr_pop(void *da); - - /* usage example: * ------------- * int *arr = dynarr_alloc(0, sizeof *arr); @@ -34,5 +22,59 @@ void *dynarr_pop(void *da); * dynarr_free(arr); */ +void *dynarr_alloc(int elem, int szelem); +void dynarr_free(void *da); +void *dynarr_resize(void *da, int elem); + +/* dynarr_empty returns non-zero if the array is empty + * Complexity: O(1) */ +int dynarr_empty(void *da); +/* dynarr_size returns the number of elements in the array + * Complexity: O(1) */ +int dynarr_size(void *da); + +void *dynarr_clear(void *da); + +/* stack semantics */ +void *dynarr_push(void *da, void *item); +void *dynarr_pop(void *da); + +/* Finalize the array. No more resizing is possible after this call. + * Use free() instead of dynarr_free() to deallocate a finalized array. + * Returns pointer to the finalized array. + * dynarr_finalize can't fail. + * Complexity: O(n) + */ +void *dynarr_finalize(void *da); + +/* helper macros */ +#define DYNARR_RESIZE(da, n) \ + do { (da) = dynarr_resize((da), (n)); } while(0) +#define DYNARR_CLEAR(da) \ + do { (da) = dynarr_clear(da); } while(0) +#define DYNARR_PUSH(da, item) \ + do { (da) = dynarr_push((da), (item)); } while(0) +#define DYNARR_POP(da) \ + do { (da) = dynarr_pop(da); } while(0) + +/* utility macros to push characters to a string. assumes and maintains + * the invariant that the last element is always a zero + */ +#define DYNARR_STRPUSH(da, c) \ + do { \ + char cnull = 0, ch = (char)(c); \ + (da) = dynarr_pop(da); \ + (da) = dynarr_push((da), &ch); \ + (da) = dynarr_push((da), &cnull); \ + } while(0) + +#define DYNARR_STRPOP(da) \ + do { \ + char cnull = 0; \ + (da) = dynarr_pop(da); \ + (da) = dynarr_pop(da); \ + (da) = dynarr_push((da), &cnull); \ + } while(0) + #endif /* DYNARR_H_ */