#ifndef DYNARR_H #define DYNARR_H #include #include #include #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