summaryrefslogtreecommitdiff
path: root/dynarr.h
diff options
context:
space:
mode:
Diffstat (limited to 'dynarr.h')
-rw-r--r--dynarr.h57
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