diff options
| author | WormHeamer | 2025-12-02 05:12:28 -0500 |
|---|---|---|
| committer | WormHeamer | 2025-12-02 05:12:28 -0500 |
| commit | 7b85b8ae6162aace521fe1051c576f9889155350 (patch) | |
| tree | c3aa78aedfbac06cdc36a61c21ab2e7fa083821e | |
| parent | c664ae72a01de5e5f51689fccfbfc09a557f7900 (diff) | |
inline da_[a]fit() into DA_[A]FIT() to remove need for arena.h
| -rw-r--r-- | dynarr.h | 78 |
1 files changed, 40 insertions, 38 deletions
@@ -3,9 +3,8 @@ #include <stdlib.h> #include <stdbit.h> -#include <stdio.h> +#include <string.h> -#include "arena.h" #include "wrmr.h" typedef struct { @@ -13,43 +12,46 @@ typedef struct { void *data; } DynArrHdr; -#define DYNARR(t) struct { u32 len, cap; t *data; } +#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; -} +#define DA_ELEM(da, n) ((n) * sizeof(*(da)->data)) + +/* malloc */ + +#define DA_FIT(da, n) do {\ + (da)->cap = stdc_bit_ceil(n);\ + (da)->data = realloc((da)->data, DA_ELEM(da, (da)->cap));\ + if (!(da)->data) FAIL_WITH_MSG("failed to realloc dynamic array");\ +} while(0) +#define DA_GROW(da, n) DA_FIT(da, (da)->len + (n)) +#define DA_PUSH(da, ...) do {\ + DA_GROW(da, 1);\ + (da)->data[(da)->len++] = (__VA_ARGS__);\ +} while(0) +#define DA_PUSH_MULT(da, o, n) do {\ + DA_GROW(da, n);\ + memcpy((da)->data + (da)->len, (o), (n) * sizeof(*(da)->data));\ + (da)->len += (n);\ +} while(0) + +/* arena */ + +#define DA_AFIT(da, a, n) do {\ + u32 da_fit_cap = stdc_bit_ceil(n);\ + (da)->data = arena_realloc(a, (da)->data, DA_ELEM(da, (da)->cap),\ + DA_ELEM(da, da_fit_cap), _Alignof(TYPEOF(*(da)->data)));\ + (da)->cap = da_fit_cap;\ +} while(0) +#define DA_AGROW(da, a, n) DA_AFIT(da, a, (da)->len + (n)) +#define DA_APUSH(da, a, ...) do {\ + DA_AGROW(da, a, 1);\ + (da)->data[(da)->len++] = (__VA_ARGS__);\ +} while(0) +#define DA_APUSH_MULT(da, a, o, n) do {\ + DA_AGROW(da, a, n);\ + memcpy((da)->data + (da)->len, (o), (n) * sizeof(*(da)->data));\ + (da)->len += (n);\ +} while(0) #endif |
