From 23ddb8dd3f7fb1ed1cd6b1cd11aacdc9cdaccd7d Mon Sep 17 00:00:00 2001 From: gingerBill Date: Fri, 12 Dec 2025 01:00:11 +0000 Subject: [PATCH] Add `push_back_elem_and_get_ptr` --- core/container/xar/xar.odin | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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)