--- a/rust/vec2d/src/lib.rs Mon Jan 30 15:50:14 2023 +0100
+++ b/rust/vec2d/src/lib.rs Wed Feb 01 10:58:45 2023 +0100
@@ -1,8 +1,8 @@
+use integral_geometry::Size;
use std::{
ops::{Index, IndexMut},
- slice::SliceIndex
+ slice::SliceIndex,
};
-use integral_geometry::Size;
#[derive(Debug)]
pub struct Vec2D<T> {
@@ -34,7 +34,7 @@
}
}
-impl <T> Vec2D<T> {
+impl<T> Vec2D<T> {
#[inline]
pub fn width(&self) -> usize {
self.size.width
@@ -52,8 +52,11 @@
}
impl<T: Copy> Vec2D<T> {
- pub fn new(size: Size, value: T) -> Self {
- Self { size, data: vec![value; size.area()] }
+ pub fn new(size: &Size, value: T) -> Self {
+ Self {
+ size: *size,
+ data: vec![value; size.area()],
+ }
}
#[inline]
@@ -68,21 +71,41 @@
#[inline]
pub fn get(&self, row: usize, column: usize) -> Option<&<usize as SliceIndex<[T]>>::Output> {
- self.data.get(row * self.width() + column)
+ if row < self.height() && column < self.width() {
+ Some(unsafe { self.data.get_unchecked(row * self.width() + column) })
+ } else {
+ None
+ }
}
#[inline]
- pub fn get_mut(&mut self, row: usize, column: usize) -> Option<&mut <usize as SliceIndex<[T]>>::Output> {
- self.data.get_mut(row * self.size.width + column)
+ pub fn get_mut(
+ &mut self,
+ row: usize,
+ column: usize,
+ ) -> Option<&mut <usize as SliceIndex<[T]>>::Output> {
+ if row < self.height() && column < self.width() {
+ Some(unsafe { self.data.get_unchecked_mut(row * self.size.width + column) })
+ } else {
+ None
+ }
}
#[inline]
- pub unsafe fn get_unchecked(&self, row: usize, column: usize) -> &<usize as SliceIndex<[T]>>::Output {
+ pub unsafe fn get_unchecked(
+ &self,
+ row: usize,
+ column: usize,
+ ) -> &<usize as SliceIndex<[T]>>::Output {
self.data.get_unchecked(row * self.width() + column)
}
#[inline]
- pub unsafe fn get_unchecked_mut(&mut self, row: usize, column: usize) -> &mut <usize as SliceIndex<[T]>>::Output {
+ pub unsafe fn get_unchecked_mut(
+ &mut self,
+ row: usize,
+ column: usize,
+ ) -> &mut <usize as SliceIndex<[T]>>::Output {
self.data.get_unchecked_mut(row * self.size.width + column)
}
@@ -99,10 +122,7 @@
#[inline]
pub unsafe fn as_bytes(&self) -> &[u8] {
- use std::{
- slice,
- mem
- };
+ use std::{mem, slice};
slice::from_raw_parts(
self.data.as_ptr() as *const u8,