diff -r a4cbc6926439 -r 5d302b12d837 rust/vec2d/src/lib.rs --- a/rust/vec2d/src/lib.rs Tue Jan 28 10:37:46 2025 +0100 +++ b/rust/vec2d/src/lib.rs Tue Jan 28 15:49:45 2025 +0100 @@ -4,7 +4,7 @@ slice::SliceIndex, }; -#[derive(Debug)] +#[derive(Debug, Clone)] pub struct Vec2D { data: Vec, size: Size, @@ -30,19 +30,19 @@ let pos = row * self.width(); - &mut self.data[pos..pos + self.size.width] + &mut self.data[pos..pos + self.size.width as usize] } } impl Vec2D { #[inline] pub fn width(&self) -> usize { - self.size.width + self.size.width as usize } #[inline] pub fn height(&self) -> usize { - self.size.height + self.size.height as usize } #[inline] @@ -55,7 +55,7 @@ pub fn new(size: &Size, value: T) -> Self { Self { size: *size, - data: vec![value; size.area()], + data: vec![value; size.area() as usize], } } @@ -85,7 +85,10 @@ column: usize, ) -> Option<&mut >::Output> { if row < self.height() && column < self.width() { - Some(unsafe { self.data.get_unchecked_mut(row * self.size.width + column) }) + Some(unsafe { + self.data + .get_unchecked_mut(row * self.size.width as usize + column) + }) } else { None } @@ -106,7 +109,8 @@ row: usize, column: usize, ) -> &mut >::Output { - self.data.get_unchecked_mut(row * self.size.width + column) + self.data + .get_unchecked_mut(row * self.size.width as usize + column) } #[inline] @@ -146,7 +150,7 @@ impl Vec2D { pub fn from_iter>(iter: I, size: &Size) -> Option> { let data: Vec = iter.into_iter().collect(); - if size.width * size.height == data.len() { + if size.width as usize * size.height as usize == data.len() { Some(Vec2D { data, size: *size }) } else { None @@ -160,7 +164,7 @@ #[test] fn basics() { - let mut v: Vec2D = Vec2D::new(Size::new(2, 3), 0xff); + let mut v: Vec2D = Vec2D::new(&Size::new(2, 3), 0xff); assert_eq!(v.width(), 2); assert_eq!(v.height(), 3); @@ -173,7 +177,7 @@ assert_eq!(v[2][0], 0xff); assert_eq!(v[2][1], 0); - v.get_mut(2, 1).map(|v| *v = 1); + v.get_mut(2, 1).into_iter().for_each(|v| *v = 1); assert_eq!(v[2][1], 1); assert_eq!(v.get_mut(2, 2), None);