From a0d4a39a6688a18356d215fdef1e195d46e6bf6b Mon Sep 17 00:00:00 2001 From: colin Date: Wed, 17 Aug 2022 21:41:26 -0700 Subject: [PATCH] cross: OffsetDimSlice: implement enumeration --- crates/cross/src/dim/dim_slice.rs | 3 ++ crates/cross/src/dim/offset_dim_slice.rs | 48 ++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/crates/cross/src/dim/dim_slice.rs b/crates/cross/src/dim/dim_slice.rs index aa484e9..9858217 100644 --- a/crates/cross/src/dim/dim_slice.rs +++ b/crates/cross/src/dim/dim_slice.rs @@ -17,6 +17,9 @@ impl DimSlice { pub fn indices(&self) -> DimIter { DimIter::new(self.dim) } + pub fn dim(&self) -> Vec3u { + self.dim + } } #[cfg(feature = "iter")] diff --git a/crates/cross/src/dim/offset_dim_slice.rs b/crates/cross/src/dim/offset_dim_slice.rs index 2de1d52..4e15a99 100644 --- a/crates/cross/src/dim/offset_dim_slice.rs +++ b/crates/cross/src/dim/offset_dim_slice.rs @@ -1,3 +1,4 @@ +use core::iter::Zip; use core::ops::{Index, IndexMut}; use crate::dim::{DimIter, DimSlice}; @@ -18,6 +19,13 @@ impl OffsetDimSlice { } } +#[cfg(feature = "iter")] +impl OffsetDimSlice { + pub fn enumerated(self) -> Zip { + self.indices().zip(self.into_iter()) + } +} + impl Index for OffsetDimSlice where DimSlice: Index @@ -144,6 +152,46 @@ mod test { 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); + } + + #[test] + fn offset_dim_slice_enumerated() { + let data = [ + 10, 11, + 20, 21, + 30, 31, + ]; + let s = OffsetDimSlice::new(Vec3u::new(10, 20, 30), Vec3u::new(1, 2, 2), &data); + let mut i = s.enumerated(); + assert_eq!(i.next().unwrap(), (Vec3u::new(10, 20, 30), &10)); + assert_eq!(i.next().unwrap(), (Vec3u::new(10, 21, 30), &11)); + assert_eq!(i.next().unwrap(), (Vec3u::new(10, 20, 31), &20)); + assert_eq!(i.next().unwrap(), (Vec3u::new(10, 21, 31), &21)); assert_eq!(i.next(), None); } + + #[test] + fn offset_dim_slice_enumerated_mut() { + let mut data = [ + 10, 11, + 20, 21, + ]; + let s = OffsetDimSlice::new(Vec3u::new(10, 20, 30), Vec3u::new(2, 1, 2), &mut data); + let mut i = s.enumerated(); + + let (idx, v) = i.next().unwrap(); + assert_eq!(idx, Vec3u::new(10, 20, 30)); + *v = 100; + + i.next().unwrap(); + i.next().unwrap(); + + let (idx, v) = i.next().unwrap(); + assert_eq!(idx, Vec3u::new(11, 20, 31)); + *v = 210; + + assert_eq!(i.next(), None); + + assert_eq!(data, [100, 11, 20, 210]); + } }