add OffsetDimensionedSlice, with basic indexing operations
This commit is contained in:
@@ -1,5 +1,7 @@
|
|||||||
mod dim_slice;
|
mod dim_slice;
|
||||||
|
mod offset_dim_slice;
|
||||||
pub use dim_slice::{
|
pub use dim_slice::{
|
||||||
DimensionedSlice,
|
DimensionedSlice,
|
||||||
DimIter,
|
DimIter,
|
||||||
};
|
};
|
||||||
|
pub use offset_dim_slice::OffsetDimensionedSlice;
|
||||||
|
80
crates/cross/src/dim/offset_dim_slice.rs
Normal file
80
crates/cross/src/dim/offset_dim_slice.rs
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
use core::ops::{Index, IndexMut};
|
||||||
|
|
||||||
|
use crate::dim::DimensionedSlice;
|
||||||
|
use crate::vec::Vec3u;
|
||||||
|
|
||||||
|
|
||||||
|
pub struct OffsetDimensionedSlice<T> {
|
||||||
|
offset: Vec3u,
|
||||||
|
inner: DimensionedSlice<T>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> OffsetDimensionedSlice<T> {
|
||||||
|
pub fn new(offset: Vec3u, dim: Vec3u, items: T) -> Self {
|
||||||
|
Self { offset, inner: DimensionedSlice::new(dim, items) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> Index<Vec3u> for OffsetDimensionedSlice<T>
|
||||||
|
where
|
||||||
|
DimensionedSlice<T>: Index<Vec3u>
|
||||||
|
{
|
||||||
|
type Output=<DimensionedSlice<T> as Index<Vec3u>>::Output;
|
||||||
|
|
||||||
|
fn index(&self, idx: Vec3u) -> &Self::Output {
|
||||||
|
&self.inner[idx - self.offset]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> IndexMut<Vec3u> for OffsetDimensionedSlice<T>
|
||||||
|
where
|
||||||
|
DimensionedSlice<T>: IndexMut<Vec3u>
|
||||||
|
{
|
||||||
|
fn index_mut(&mut self, idx: Vec3u) -> &mut Self::Output {
|
||||||
|
&mut self.inner[idx - self.offset]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn offset_dim_slice_index() {
|
||||||
|
let data = [
|
||||||
|
0, 1, 2,
|
||||||
|
3, 4, 5,
|
||||||
|
|
||||||
|
0, 10,20,
|
||||||
|
30,40,50,
|
||||||
|
];
|
||||||
|
let s = OffsetDimensionedSlice::new(Vec3u::new(1, 2, 3), Vec3u::new(3, 2, 2), &data);
|
||||||
|
assert_eq!(s[Vec3u::new(1, 2, 3)], 0);
|
||||||
|
assert_eq!(s[Vec3u::new(2, 2, 3)], 1);
|
||||||
|
assert_eq!(s[Vec3u::new(2, 3, 3)], 4);
|
||||||
|
assert_eq!(s[Vec3u::new(2, 3, 4)], 40);
|
||||||
|
assert_eq!(s[Vec3u::new(3, 3, 4)], 50);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn offset_dim_slice_index_mut() {
|
||||||
|
let mut data = [
|
||||||
|
0, 1, 2,
|
||||||
|
3, 4, 5,
|
||||||
|
|
||||||
|
0, 10,20,
|
||||||
|
30,40,50,
|
||||||
|
];
|
||||||
|
let mut s = OffsetDimensionedSlice::new(Vec3u::new(1, 2, 3), Vec3u::new(3, 2, 2), &mut data);
|
||||||
|
s[Vec3u::new(1, 2, 3)] = 100;
|
||||||
|
s[Vec3u::new(1, 3, 4)] = 300;
|
||||||
|
|
||||||
|
assert_eq!(data, [
|
||||||
|
100,1, 2,
|
||||||
|
3, 4, 5,
|
||||||
|
|
||||||
|
0, 10, 20,
|
||||||
|
300,40,50,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user