From 26de90f18d0260c300484ba518696709c194171b Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Wed, 17 Jun 2026 09:48:09 +0200 Subject: [PATCH] feat: add iteration and aggregation to compact int vec Implemented `sum()`, `count_nonzero()`, and `iter()` to complete the numeric vector interface. The builder now computes aggregate values across memory-mapped regions and overflow entries, while the reader delegates these operations to its inherent methods. The iterator provides zero-copy access to underlying `u32` elements. --- src/obicompactvec/src/builder.rs | 8 +++++++- src/obicompactvec/src/memoryintvec.rs | 1 + src/obicompactvec/src/reader.rs | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/obicompactvec/src/builder.rs b/src/obicompactvec/src/builder.rs index 080254b..3e622d9 100644 --- a/src/obicompactvec/src/builder.rs +++ b/src/obicompactvec/src/builder.rs @@ -5,7 +5,7 @@ use std::path::{Path, PathBuf}; use memmap2::MmapMut; -use crate::format::{HEADER_SIZE, finalize_pciv, parse_overflow_entry}; +use crate::format::{byte_count_nonzero, byte_sum, HEADER_SIZE, finalize_pciv, parse_overflow_entry}; use crate::reader::PersistentCompactIntVec; pub struct PersistentCompactIntVecBuilder { @@ -148,6 +148,12 @@ impl IntSlice for PersistentCompactIntVecBuilder { fn overflow_entries(&self) -> impl Iterator + '_ { self.overflow.iter().map(|(&k, &v)| (k, v)) } + fn sum(&self) -> u64 { + byte_sum(&self.mmap[HEADER_SIZE..HEADER_SIZE + self.n], self.overflow.values().copied()) + } + fn count_nonzero(&self) -> u64 { + byte_count_nonzero(&self.mmap[HEADER_SIZE..HEADER_SIZE + self.n]) + } } impl IntSliceMut for PersistentCompactIntVecBuilder { diff --git a/src/obicompactvec/src/memoryintvec.rs b/src/obicompactvec/src/memoryintvec.rs index 3c40377..d5ca280 100644 --- a/src/obicompactvec/src/memoryintvec.rs +++ b/src/obicompactvec/src/memoryintvec.rs @@ -80,6 +80,7 @@ impl IntSlice for MemoryIntVec { fn overflow_entries(&self) -> impl Iterator + '_ { self.overflow.iter().map(|(&k, &v)| (k, v)) } + fn iter(&self) -> impl Iterator + '_ { self.iter() } fn sum(&self) -> u64 { self.sum() } fn count_nonzero(&self) -> u64 { self.count_nonzero() } } diff --git a/src/obicompactvec/src/reader.rs b/src/obicompactvec/src/reader.rs index 4c75762..af7d05c 100644 --- a/src/obicompactvec/src/reader.rs +++ b/src/obicompactvec/src/reader.rs @@ -363,6 +363,9 @@ impl IntSlice for PersistentCompactIntVec { fn overflow_entries(&self) -> impl Iterator + '_ { (0..self.n_overflow).map(|i| (self.data_slot(i), self.data_value(i))) } + fn iter(&self) -> impl Iterator + '_ { self.iter() } + fn sum(&self) -> u64 { self.sum() } + fn count_nonzero(&self) -> u64 { self.count_nonzero() } } impl<'a> IntoIterator for &'a PersistentCompactIntVec {