summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorWormHeamer2025-08-27 19:00:27 -0400
committerWormHeamer2025-08-27 19:00:27 -0400
commit5e38aebb97048d9c634e88f1be02f825a93720fe (patch)
tree5a02ecbf4bb49a0173f80a9d8bdea9b6fadc41d7 /doc
parent8c0a2fa3efdaf100b7119649863ecc173236153a (diff)
add scratch arena to Proc
Diffstat (limited to 'doc')
-rw-r--r--doc/xar.txt36
1 files changed, 36 insertions, 0 deletions
diff --git a/doc/xar.txt b/doc/xar.txt
new file mode 100644
index 0000000..548827a
--- /dev/null
+++ b/doc/xar.txt
@@ -0,0 +1,36 @@
+/* andrew reese's Exponential Array datatype */
+
+use bits, mem.Arena, mem.arena_alloc
+
+const XAR_INIT_SZ = 8
+const XAR_MAX_DOUBLE = 20
+
+struct Xar(T) {
+ n u32,
+ chunk [XAR_MAX_DOUBLE]^T
+}
+
+#[inline]
+func xar_chnk_slot(xar ^Xar(T), idx u32) (u32, u32) {
+ let chnk = 31 - bits.clz((idx / XAR_INIT_SZ) + 1)
+ let slot = idx - ((XAR_INIT_SZ << chnk) - XAR_INIT_SZ)
+ return (chnk, slot)
+}
+
+func xar_get(xar ^Xar(T), idx u32) ^T {
+ let chnk, slot = xar_chnk_slot(xar, idx)
+ return xar->chunk[chnk] + (slot * sizeof(T))
+}
+
+func xar_put(xar ^Xar(T), idx u32, a ^Arena) {
+ let chnk, slot = xar_chnk_slot(xar, idx)
+ if (!xar->chunk[chnk]) {
+ xar->chunk[chnk] := arena_alloc(a, sizeof(T) * (XAR_INIT_SZ << chnk)), alignof(T))
+ }
+ return xar->chunk[chnk] + (slot * sizeof(T))
+}
+
+proc xar_push(xar ^Xar(T), v T, a ^Arena) {
+ xar_put(xar, xar.n, a)^ = v
+ xar.n := xar.n + 1
+}