aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <gingerBill@users.noreply.github.com>2025-12-12 01:00:11 +0000
committergingerBill <gingerBill@users.noreply.github.com>2025-12-12 01:00:11 +0000
commit23ddb8dd3f7fb1ed1cd6b1cd11aacdc9cdaccd7d (patch)
tree61ec0c67f1a410691ffdf7926c405c9f62cb4082
parenta2d361f17d75808d21bc2948ce2883dc243dc27d (diff)
Add `push_back_elem_and_get_ptr`
-rw-r--r--core/container/xar/xar.odin16
1 files changed, 16 insertions, 0 deletions
diff --git a/core/container/xar/xar.odin b/core/container/xar/xar.odin
index 746c77f77..29a8c3e00 100644
--- a/core/container/xar/xar.odin
+++ b/core/container/xar/xar.odin
@@ -112,6 +112,22 @@ push_back_elems :: proc(x: ^$X/Xar($T, $SHIFT), values: ..T, loc := #caller_loca
return
}
+append_and_get_ptr :: push_back_elem_and_get_ptr
+
+@(require_results)
+push_back_elem_and_get_ptr :: proc(x: ^$X/Xar($T, $SHIFT), value: T, loc := #caller_location) -> (ptr: ^T, err: mem.Allocator_Error) {
+ chunk_idx, elem_idx, chunk_cap := meta_get(SHIFT, uint(x.len))
+ if x.chunks[chunk_idx] == nil {
+ x.chunks[chunk_idx] = make([^]T, chunk_cap, x.allocator) or_return
+ }
+ x.chunks[chunk_idx][elem_idx] = value
+ x.len += 1
+ n = 1
+ ptr = &x.chunks[chunk_idx][elem_idx]
+ return
+}
+
+
pop :: proc(x: ^$X/Xar($T, $SHIFT), loc := #caller_location) -> (val: T) {
assert(x.len > 0, loc=loc)
index := uint(x.len-1)