summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWormHeamer2025-11-26 01:53:33 -0500
committerWormHeamer2025-11-26 01:53:33 -0500
commitef415a4d9cfaa0da72e34338208494a82247ee0f (patch)
treebbab0d15b02b5844220981d2fbff787574772083
parentd10773eff2a95aff224dc133513643186bae7bb4 (diff)
reorder XAR_* arguments to line up better with dynarr.h DA_A*
-rw-r--r--xar.h21
1 files changed, 15 insertions, 6 deletions
diff --git a/xar.h b/xar.h
index e448889..a0d6664 100644
--- a/xar.h
+++ b/xar.h
@@ -5,7 +5,9 @@
/* see https://danielchasehooper.com/posts/segment_array/ */
#include <stdbit.h>
+
#include "arena.h"
+#include "wrmr.h"
#define XAR_INIT_SZ 8
#define XAR_MAX_DOUBLE 26
@@ -16,12 +18,19 @@ typedef struct {
} XarHdr;
#define XAR(T) struct { int n, chunks; T *chunk[XAR_MAX_DOUBLE]; }
-#define XAR_GET_T(xar, T, idx) (T*)(xar_get((XarHdr*)(xar), idx, sizeof(T)))
-#define XAR_PUT_T(xar, T, idx, a) (T*)(xar_put((XarHdr*)(xar), idx, sizeof(T), a))
-#define XAR_GET(xar, idx) XAR_GET_T(xar, typeof(**(xar)->chunk), idx)
-#define XAR_PUT(xar, idx, a) XAR_PUT_T(xar, typeof(**(xar)->chunk), idx, a)
-#define XAR_PUSH(xar, v, a) (*XAR_PUT(xar, (xar)->n++, a) = (v))
-#define XAR_PUSH_T(xar, T, v, a) (*XAR_PUT_T(xar, T, (xar)->n++, a) = (v))
+#define XAR_TYPE(xar) TYPEOF(**(xar)->chunk)
+
+#define XAR_ELEM_T(xar, T, idx) (T*)(xar_get((XarHdr*)(xar), idx, sizeof(T)))
+#define XAR_PUT_T(xar, T, a, idx) (T*)(xar_put((XarHdr*)(xar), idx, sizeof(T), a))
+#define XAR_PUSH_T(xar, T, a, ...) (*XAR_PUT_T(xar, T, a, (xar)->n++) = (__VA_ARGS__))
+
+#define XAR_ELEM(xar, idx) XAR_ELEM_T(xar, XAR_TYPE(xar), idx)
+#define XAR_PUT(xar, a, idx) XAR_PUT_T(xar, XAR_TYPE(xar), a, idx)
+#define XAR_PUSH(xar, a, ...) XAR_PUSH_T(xar, XAR_TYPE(xar), a, __VA_ARGS__)
+
+#define XAR_GET(xar, idx) (*XAR_ELEM_T(xar, XAR_TYPE(xar), idx))
+#define XAR_SET(xar, idx, ...) (*XAR_ELEM_T(xar, XAR_TYPE(xar), idx) = (__VA_ARGS__))
+
#define XAR_CHUNK(idx) (unsigned)(31 - stdc_leading_zeros(((unsigned)(idx) / XAR_INIT_SZ) + 1))
#define XAR_CHUNK_SZ(chnk) (XAR_INIT_SZ << (chnk))
#define XAR_SLOT(chnk, idx) ((idx) - (XAR_CHUNK_SZ(chnk) - XAR_CHUNK_SZ(0)))