diff options
| author | WormHeamer | 2025-08-27 19:00:27 -0400 |
|---|---|---|
| committer | WormHeamer | 2025-08-27 19:00:27 -0400 |
| commit | 5e38aebb97048d9c634e88f1be02f825a93720fe (patch) | |
| tree | 5a02ecbf4bb49a0173f80a9d8bdea9b6fadc41d7 /doc | |
| parent | 8c0a2fa3efdaf100b7119649863ecc173236153a (diff) | |
add scratch arena to Proc
Diffstat (limited to 'doc')
| -rw-r--r-- | doc/xar.txt | 36 |
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 +} |
