diff options
| author | WormHeamer | 2025-11-26 01:35:23 -0500 |
|---|---|---|
| committer | WormHeamer | 2025-11-26 01:35:23 -0500 |
| commit | d10773eff2a95aff224dc133513643186bae7bb4 (patch) | |
| tree | 5d1afa37e78757d89b9be16d5cf5643ba7e0bdb4 | |
| parent | 1f3cb8bf23ee7840c266fb9ca51e9f4fc7cb041a (diff) | |
add dynarr.h
| -rw-r--r-- | dynarr.h | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/dynarr.h b/dynarr.h new file mode 100644 index 0000000..2041b97 --- /dev/null +++ b/dynarr.h @@ -0,0 +1,55 @@ +#ifndef DYNARR_H +#define DYNARR_H + +#include <stdlib.h> +#include <stdbit.h> +#include <stdio.h> + +#include "arena.h" +#include "wrmr.h" + +typedef struct { + u32 len, cap; + void *data; +} DynArrHdr; + +#define DYNARR(t) struct { u32 len, cap; t *data; } + +#define DA_INIT_CAP 32 + +#define DA_FIT(da, c)\ + ((TYPEOF((da)->data))da_fit((DynArrHdr*)(da), c, sizeof(*(da)->data))) + +#define DA_GROW(da, n) DA_FIT(da, (da)->len + n) +#define DA_PUSH(da, ...) (DA_GROW(da, 1)[(da)->len++] = (__VA_ARGS__)) + +#define DA_AFIT(da, a, c)\ + ((TYPEOF((da)->data))da_afit(\ + (DynArrHdr*)(da), a, c,\ + sizeof(*(da)->data),\ + _Alignof(TYPEOF(*(da)->data))\ + )) + +#define DA_AGROW(da, a, n) DA_AFIT(da, a, (da)->len + n) +#define DA_APUSH(da, a, ...) (DA_AGROW(da, a, 1)[(da)->len++] = (__VA_ARGS__)) + +static inline void *da_fit(DynArrHdr *da, u32 n, u32 sz) { + u32 c = stdc_bit_ceil(n); + void *p = realloc(da->data, c * sz); + if (!p) { + fprintf(stderr, "dynamic array resize failure\n"); + abort(); + } + da->cap = c; + da->data = p; + return p; +} + +static inline void *da_afit(DynArrHdr *da, Arena *a, u32 n, u32 sz, u32 align) { + u32 c = stdc_bit_ceil(n); + da->data = arena_realloc(a, da->data, da->cap * sz, c * sz, align); + da->cap = c; + return da->data; +} + +#endif |
