summary refs log tree commit diff
diff options
context:
space:
mode:
authorWormHeamer2025-02-28 17:46:21 -0500
committerWormHeamer2025-02-28 17:46:56 -0500
commit58b300a7f49fec1d9121536107fac0af6dd83bfa (patch)
tree517c4e296f6309e454efb3455db14909e7f478b0
parentc2995c57c4a8a97c7a456e63d9f847b2809a31aa (diff)
add zdynarr.h
-rw-r--r--zdynarr.h63
-rw-r--r--zone.h2
2 files changed, 64 insertions, 1 deletions
diff --git a/zdynarr.h b/zdynarr.h
new file mode 100644
index 0000000..3d88657
--- /dev/null
+++ b/zdynarr.h
@@ -0,0 +1,63 @@
+#ifndef DYNARR_H
+#define DYNARR_H
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "stdwrm.h"
+#include "zone.h"
+
+typedef struct { Zone *zone; ZoneFrame *zf; size_t count, capacity; } ZDarrHeader;
+
+#define ZDYNARR(type) type *
+#define ZDA_HEADER(da) ((ZDarrHeader*)(da) - 1)
+
+#define ZDA_INIT_CAP 16
+#define ZDA_INIT_SZ(da, z, cap) do {\
+	ZoneFrame *zda_zf_ptr;\
+	char *zda_init_ptr = zn_alloc_zf(z, &zda_zf_ptr, sizeof(ZDarrHeader) + cap * sizeof(*da));\
+	if (!zda_init_ptr) { fprintf(stderr, "dynamic array allocation failed\n"); abort(); }\
+	da = (void *)(zda_init_ptr + sizeof(ZDarrHeader));\
+	*ZDA_HEADER(da) = (ZDarrHeader) { 0, cap };\
+} while(0)
+
+#define ZDA_INIT(da, z) ZDA_INIT_SZ(da, z, ZDA_INIT_CAP)
+
+#define ZDA_FREE(da)\
+	free(ZDA_HEADER(da))
+
+#define ZDA_LEN(da) (ZDA_HEADER(da)->count)
+#define ZDA_FIT(da, count) do {\
+	size_t zda_fit_cap = ZA_HEADER(da)->capacity;\
+	if (count >= zda_fit_cap) {\
+		ZoneFrame *zda_zf_ptr = (da)->zf;\
+		while (count >= zda_fit_cap) zda_fit_cap <<= 1;\
+		char *zda_fit_ptr = zn_zf_realloc((da)->zone, &zda_zf_ptr, ZDA_HEADER(da),\
+				sizeof(ZDarrHeader) + ZDA_HEADER(da)->capacity * sizeof(*da),\
+				sizeof(ZDarrHeader) + zda_fit_cap * sizeof(*da));\
+		if (!zda_fit_ptr) { fprintf(stderr, "dynamic array reallocation failed\n"); abort(); }\
+		(da) = (void *)(zda_fit_ptr + sizeof(ZDarrHeader));\
+		ZDA_HEADER(da)->capacity = zda_fit_cap;\
+		ZDA_HEADER(da)->zf = zda_zf_ptr;\
+	}\
+} while(0)
+
+#define ZDA_PUSH(da, ...) do {\
+	ZDA_FIT(da, ZDA_LEN(da) + 1);\
+	(da)[ZDA_HEADER(da)->count++] = (__VA_ARGS__);\
+} while(0)
+
+#define ZDA_PUSH_MULT(da, buf, n) do {\
+	ZDA_FIT(da, ZDA_LEN(da) + n);\
+	memcpy(&(da)[ZDA_HEADER(da)->count], buf, n * sizeof(*(da)));\
+	ZDA_HEADER(da)->count += n;\
+} while(0)
+
+#define ZDA_FOR(da, name)\
+	for (typeof(da) name = (da); name < &(da)[ZDA_LEN(da)]; name++)
+
+#define ZDA_FORVAL(da, name)\
+	for (volatile typeof(*(da)) *stdwrm__zda_iter = (da), name; stdwrm__zda_iter < &(da)[ZDA_LEN(da)] && (name = *stdwrm__zda_iter, 1); stdwrm__zda_iter++)
+
+#endif
diff --git a/zone.h b/zone.h
index 71ad926..8199bda 100644
--- a/zone.h
+++ b/zone.h
@@ -21,7 +21,7 @@ void zn_clear(Zone *z);
 
 void *zn_alloc(Zone *z, size_t n);
 void *zn_zf_alloc(Zone *z, ZoneFrame **zf, size_t n);
-void *zn_zf_realloc(Zone *z, ZoneFrame **zf, void *ptr, size_t oldsz, size-t newsz);
+void *zn_zf_realloc(Zone *z, ZoneFrame **zf, void *ptr, size_t oldsz, size_t newsz);
 char *zn_strdup(Zone *z, const char *s);
 
 #ifdef ZONE_IMPL