From 250f86ac2da613a7886dd1c09609d405d9445da8 Mon Sep 17 00:00:00 2001 From: sergeypdev Date: Sun, 10 Aug 2025 03:15:22 +0400 Subject: [PATCH] Add chunk iterator --- common/container/xarr/xarr.odin | 55 ++++++++++++++++++++++++++++ common/container/xarr/xarr_test.odin | 1 - 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/common/container/xarr/xarr.odin b/common/container/xarr/xarr.odin index d379370..df41cf8 100644 --- a/common/container/xarr/xarr.odin +++ b/common/container/xarr/xarr.odin @@ -172,3 +172,58 @@ iterator_next :: proc(it: ^Iterator($E, $SOA)) -> (e: ^E, idx: int, ok: bool) { it.idx += 1 return } + +Chunk_Iterator :: struct($E: typeid, $SOA: bool) { + xarr: ^Xarr(E, SOA), + base_element_idx: int, + chunk_idx: i8, +} + +chunk_iterator :: proc(a: $T/^Xarr($E, $SOA)) -> Chunk_Iterator(E, SOA) { + return Chunk_Iterator(E, SOA){xarr = a} +} + +chunk_iterator_next_scalar :: proc( + it: ^Chunk_Iterator($E, false), +) -> ( + chunk: []E, + base_element_idx: int, + ok: bool, +) { + if (it.xarr.allocated_chunks_mask & (u32(1) << it.idx)) == 0 { + return nil, 0, false + } + + chunk = get_chunk_slice_scalar(it.xarr, it.idx) + base_element_idx = it.base_element_idx + ok = true + + base_element_idx += chunk_size(it.chunk_idx) + it.chunk_idx += 1 + return +} + +chunk_iterator_next_soa :: proc( + it: ^Chunk_Iterator($E, true), +) -> ( + chunk: #soa[]E, + base_element_idx: int, + ok: bool, +) { + if (it.xarr.allocated_chunks_mask & (u32(1) << it.idx)) == 0 { + return nil, 0, false + } + + chunk = get_chunk_slice_soa(it.xarr, it.idx) + base_element_idx = it.base_element_idx + ok = true + + base_element_idx += chunk_size(it.chunk_idx) + it.chunk_idx += 1 + return +} + +chunk_iterator_next :: proc { + chunk_iterator_next_scalar, + chunk_iterator_next_soa, +} diff --git a/common/container/xarr/xarr_test.odin b/common/container/xarr/xarr_test.odin index af618c8..6e87105 100644 --- a/common/container/xarr/xarr_test.odin +++ b/common/container/xarr/xarr_test.odin @@ -131,7 +131,6 @@ test_soa :: proc(t: ^testing.T) { append(&a, My_Struct{x = 1, y = 2, z = 3}) - testing.expect_value(t, get(a, 0), My_Struct{x = 1, y = 2, z = 3}) testing.expect_value(t, size_of(Xarr(My_Struct, false)), 0) }