summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWormHeamer2025-11-26 01:35:23 -0500
committerWormHeamer2025-11-26 01:35:23 -0500
commitd10773eff2a95aff224dc133513643186bae7bb4 (patch)
tree5d1afa37e78757d89b9be16d5cf5643ba7e0bdb4
parent1f3cb8bf23ee7840c266fb9ca51e9f4fc7cb041a (diff)
add dynarr.h
-rw-r--r--dynarr.h55
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