cross: OffsetDimSlice: impl indices() enumeration

This commit is contained in:
2022-08-17 21:37:40 -07:00
parent 129aaadeac
commit a34363122b

View File

@@ -1,6 +1,6 @@
use core::ops::{Index, IndexMut}; use core::ops::{Index, IndexMut};
use crate::dim::DimSlice; use crate::dim::{DimIter, DimSlice};
use crate::vec::Vec3u; use crate::vec::Vec3u;
@@ -13,6 +13,9 @@ impl<T> OffsetDimSlice<T> {
pub fn new(offset: Vec3u, dim: Vec3u, items: T) -> Self { pub fn new(offset: Vec3u, dim: Vec3u, items: T) -> Self {
Self { offset, inner: DimSlice::new(dim, items) } Self { offset, inner: DimSlice::new(dim, items) }
} }
pub fn indices(&self) -> OffsetDimIter {
OffsetDimIter::new(self.offset, self.inner.indices())
}
} }
impl<T> Index<Vec3u> for OffsetDimSlice<T> impl<T> Index<Vec3u> for OffsetDimSlice<T>
@@ -43,6 +46,26 @@ impl<T: IntoIterator> IntoIterator for OffsetDimSlice<T> {
} }
} }
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::Item> {
self.inner.next().map(|i| i + self.offset)
}
}
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::*; use super::*;
@@ -87,7 +110,7 @@ mod test {
} }
#[test] #[test]
fn dim_slice_into_iter() { fn offset_dim_slice_into_iter() {
let data = [1, 2, 3, 4]; let data = [1, 2, 3, 4];
let s = OffsetDimSlice::new(Vec3u::new(1, 2, 3), Vec3u::new(2, 1, 2), &data); let s = OffsetDimSlice::new(Vec3u::new(1, 2, 3), Vec3u::new(2, 1, 2), &data);
let mut i = s.into_iter(); let mut i = s.into_iter();
@@ -99,7 +122,7 @@ mod test {
} }
#[test] #[test]
fn dim_slice_into_iter_mut() { fn offset_dim_slice_into_iter_mut() {
let mut data = [1, 2, 3, 4]; let mut data = [1, 2, 3, 4];
let s = OffsetDimSlice::new(Vec3u::new(1, 2, 3), Vec3u::new(2, 1, 2), &mut data); let s = OffsetDimSlice::new(Vec3u::new(1, 2, 3), Vec3u::new(2, 1, 2), &mut data);
let mut i = s.into_iter(); let mut i = s.into_iter();
@@ -111,4 +134,16 @@ mod test {
assert_eq!(data, [10,2,30,4]); 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);
}
} }