summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWormHeamer2026-01-05 04:27:50 -0500
committerWormHeamer2026-01-05 04:27:50 -0500
commit69e6e7753af7e46460813ea160a8226a5847a965 (patch)
tree8a9a6db9344871cbbd816d5b019b96a76ff3f62d
parent51781c481efc56dd06cbfe75c356b3aae600f0bc (diff)
fix bad bug in dynarr.h (realloc on every single push)
-rw-r--r--dynarr.h50
1 files changed, 24 insertions, 26 deletions
diff --git a/dynarr.h b/dynarr.h
index 4ba8840..7462df9 100644
--- a/dynarr.h
+++ b/dynarr.h
@@ -7,51 +7,49 @@
#include "wrmr.h"
-typedef struct {
- u32 len, cap;
- void *data;
-} DynArrHdr;
-
-#define DYNARR(T) struct { u32 len, cap; T *data; }
+#define DYNARR(T) struct { u32 n, c_; T *v; }
#define DA_INIT_CAP 32
-#define DA_ELEM(da, n) ((n) * sizeof(*(da)->data))
+#define DA_ELEM(da, n) ((n) * sizeof(*(da)->v))
/* 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");\
+ if ((n) > (da)->c_) {\
+ (da)->c_ = stdc_bit_ceil((u32)(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)->len + (n))
+#define DA_GROW(da, n_) DA_FIT(da, (da)->n + (n_))
#define DA_PUSH(da, ...) do {\
DA_GROW(da, 1);\
- (da)->data[(da)->len++] = (__VA_ARGS__);\
+ (da)->v[(da)->n++] = (__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);\
+#define DA_PUSH_MULT(da, o, n_) do {\
+ DA_GROW(da, n_);\
+ memcpy((da)->v + (da)->n, (o), DA_ELEM(da, n_));\
+ (da)->n += (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;\
+ if ((n) > (da)->c_) {\
+ u32 da_fit_c = stdc_bit_ceil((u32)(n));\
+ (da)->v = resize(a, (da)->v, (da)->c_, da_fit_c);\
+ (da)->c_ = da_fit_c;\
+ }\
} while(0)
-#define DA_AGROW(da, a, n) DA_AFIT(da, a, (da)->len + (n))
+#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)->data[(da)->len++] = (__VA_ARGS__);\
+ (da)->v[(da)->n++] = (__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);\
+#define DA_APUSH_MULT(da, a, o, n_) do {\
+ DA_AGROW(da, a, n_);\
+ memcpy((da)->v + (da)->n, (o), DA_ELEM(da, n_));\
+ (da)->n += (n_);\
} while(0)
#endif