diff --git a/crates/cross/src/dim/offset_dim_slice.rs b/crates/cross/src/dim/offset_dim_slice.rs index 34a4983..2de1d52 100644 --- a/crates/cross/src/dim/offset_dim_slice.rs +++ b/crates/cross/src/dim/offset_dim_slice.rs @@ -1,6 +1,6 @@ use core::ops::{Index, IndexMut}; -use crate::dim::DimSlice; +use crate::dim::{DimIter, DimSlice}; use crate::vec::Vec3u; @@ -13,6 +13,9 @@ impl OffsetDimSlice { pub fn new(offset: Vec3u, dim: Vec3u, items: T) -> Self { Self { offset, inner: DimSlice::new(dim, items) } } + pub fn indices(&self) -> OffsetDimIter { + OffsetDimIter::new(self.offset, self.inner.indices()) + } } impl Index for OffsetDimSlice @@ -43,6 +46,26 @@ impl IntoIterator for OffsetDimSlice { } } +pub struct OffsetDimIter { + offset: Vec3u, + inner: DimIter, +} + +impl OffsetDimIter { + fn new(offset: Vec3u, inner: DimIter) -> Self { + Self { offset, inner } + } +} + +#[cfg(feature = "iter")] +impl Iterator for OffsetDimIter { + type Item = Vec3u; + fn next(&mut self) -> Option { + self.inner.next().map(|i| i + self.offset) + } +} + + #[cfg(test)] mod test { use super::*; @@ -87,7 +110,7 @@ mod test { } #[test] - fn dim_slice_into_iter() { + fn offset_dim_slice_into_iter() { let data = [1, 2, 3, 4]; let s = OffsetDimSlice::new(Vec3u::new(1, 2, 3), Vec3u::new(2, 1, 2), &data); let mut i = s.into_iter(); @@ -99,7 +122,7 @@ mod test { } #[test] - fn dim_slice_into_iter_mut() { + fn offset_dim_slice_into_iter_mut() { let mut data = [1, 2, 3, 4]; let s = OffsetDimSlice::new(Vec3u::new(1, 2, 3), Vec3u::new(2, 1, 2), &mut data); let mut i = s.into_iter(); @@ -111,4 +134,16 @@ mod test { assert_eq!(data, [10,2,30,4]); } + + #[test] + fn offset_dim_slice_indices() { + let s = OffsetDimSlice::new(Vec3u::new(10, 20, 30), Vec3u::new(2, 1, 2), &[()]); + let mut i = s.indices(); + assert_eq!(i.next().unwrap(), Vec3u::new(10, 20, 30)); + assert_eq!(i.next().unwrap(), Vec3u::new(11, 20, 30)); + assert_eq!(i.next().unwrap(), Vec3u::new(10, 20, 31)); + assert_eq!(i.next().unwrap(), Vec3u::new(11, 20, 31)); + assert_eq!(i.next(), None); + assert_eq!(i.next(), None); + } }