summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWormHeamer2025-12-02 05:12:28 -0500
committerWormHeamer2025-12-02 05:12:28 -0500
commit7b85b8ae6162aace521fe1051c576f9889155350 (patch)
treec3aa78aedfbac06cdc36a61c21ab2e7fa083821e
parentc664ae72a01de5e5f51689fccfbfc09a557f7900 (diff)
inline da_[a]fit() into DA_[A]FIT() to remove need for arena.h
-rw-r--r--dynarr.h78
1 files changed, 40 insertions, 38 deletions
diff --git a/dynarr.h b/dynarr.h
index 2041b97..4ba8840 100644
--- a/dynarr.h
+++ b/dynarr.h
@@ -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