diff options
| author | WormHeamer | 2025-12-27 23:26:28 -0500 |
|---|---|---|
| committer | WormHeamer | 2025-12-27 23:26:28 -0500 |
| commit | bf4535008a78ed84fe3e76a9ae262646b9a5f150 (patch) | |
| tree | 86a0a199e15634c9fe6682de9e08593ef9237687 /dynarr.h | |
basic piece table implementation
Diffstat (limited to 'dynarr.h')
| -rw-r--r-- | dynarr.h | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/dynarr.h b/dynarr.h new file mode 100644 index 0000000..ae93462 --- /dev/null +++ b/dynarr.h @@ -0,0 +1,57 @@ +#ifndef DYNARR_H +#define DYNARR_H + +#include <stdlib.h> +#include <stdbit.h> +#include <string.h> + +#include "wrmr.h" + +typedef struct { + u32 n, c; + void *v; +} DynArrHdr; + +#define DYNARR(T) struct { u32 n, c; T *v; } + +#define DA_INIT_CAP 32 +#define DA_ELEM(da, n) ((n) * sizeof(*(da)->v)) + +/* malloc */ + +#define DA_FIT(da, n) do {\ + (da)->c = stdc_bit_ceil(n);\ + (da)->v = realloc((da)->v, DA_ELEM(da, (da)->c));\ + if (!(da)->v) FAIL_WITH_MSG("failed to realloc dynamic array");\ +} while(0) +#define DA_GROW(da, n) DA_FIT(da, (da)->n + (n)) +#define DA_PUSH(da, ...) do {\ + DA_GROW(da, 1);\ + (da)->v[(da)->n++] = (__VA_ARGS__);\ +} while(0) +#define DA_PUSH_MULT(da, o, n) do {\ + DA_GROW(da, n);\ + memcpy((da)->v + (da)->n, (o), (n) * sizeof(*(da)->v));\ + (da)->n += (n);\ +} while(0) + +/* arena */ + +#define DA_AFIT(da, a, n) do {\ + u32 da_fit_c = stdc_bit_ceil(n);\ + (da)->v = arena_realloc(a, (da)->v, DA_ELEM(da, (da)->c),\ + DA_ELEM(da, da_fit_c), _Alignof(TYPEOF(*(da)->v)));\ + (da)->c = da_fit_c;\ +} while(0) +#define DA_AGROW(da, a, n) DA_AFIT(da, a, (da)->n + (n)) +#define DA_APUSH(da, a, ...) do {\ + DA_AGROW(da, a, 1);\ + (da)->v[(da)->n++] = (__VA_ARGS__);\ +} while(0) +#define DA_APUSH_MULT(da, a, o, n) do {\ + DA_AGROW(da, a, n);\ + memcpy((da)->v + (da)->n, (o), (n) * sizeof(*(da)->v));\ + (da)->n += (n);\ +} while(0) + +#endif |
