diff options
| author | WormHeamer | 2026-01-05 04:27:50 -0500 |
|---|---|---|
| committer | WormHeamer | 2026-01-05 04:27:50 -0500 |
| commit | 69e6e7753af7e46460813ea160a8226a5847a965 (patch) | |
| tree | 8a9a6db9344871cbbd816d5b019b96a76ff3f62d | |
| parent | 51781c481efc56dd06cbfe75c356b3aae600f0bc (diff) | |
fix bad bug in dynarr.h (realloc on every single push)
| -rw-r--r-- | dynarr.h | 50 |
1 files changed, 24 insertions, 26 deletions
@@ -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 |
