From 5e38aebb97048d9c634e88f1be02f825a93720fe Mon Sep 17 00:00:00 2001 From: WormHeamer Date: Wed, 27 Aug 2025 19:00:27 -0400 Subject: add scratch arena to Proc --- doc/xar.txt | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 doc/xar.txt (limited to 'doc') 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 +} -- cgit v1.2.3