author | alfadur |
Tue, 30 Oct 2018 19:05:52 +0300 | |
changeset 14032 | 2869c2ccb1b8 |
parent 14030 | 2ebd505e62c1 |
child 14121 | 69db1d2e4cec |
permissions | -rw-r--r-- |
14032 | 1 |
extern crate integral_geometry; |
2 |
||
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
3 |
use std::ops::{Index, IndexMut}; |
13916 | 4 |
use std::slice::SliceIndex; |
14032 | 5 |
use integral_geometry::Size; |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
6 |
|
13916 | 7 |
pub struct Vec2D<T> { |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
8 |
data: Vec<T>, |
14032 | 9 |
size: Size, |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
10 |
} |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
11 |
|
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
12 |
impl<T> Index<usize> for Vec2D<T> { |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
13 |
type Output = [T]; |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
14 |
|
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
15 |
#[inline] |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
16 |
fn index(&self, row: usize) -> &[T] { |
14032 | 17 |
debug_assert!(row < self.height()); |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
18 |
|
14032 | 19 |
let pos = row * self.width(); |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
20 |
|
14032 | 21 |
&self.data[pos..pos + self.width()] |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
22 |
} |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
23 |
} |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
24 |
|
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
25 |
impl<T> IndexMut<usize> for Vec2D<T> { |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
26 |
#[inline] |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
27 |
fn index_mut(&mut self, row: usize) -> &mut [T] { |
14032 | 28 |
debug_assert!(row < self.height()); |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
29 |
|
14032 | 30 |
let pos = row * self.width(); |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
31 |
|
14032 | 32 |
&mut self.data[pos..pos + self.size.width] |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
33 |
} |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
34 |
} |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
35 |
|
14032 | 36 |
impl <T> Vec2D<T> { |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
37 |
#[inline] |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
38 |
pub fn width(&self) -> usize { |
14032 | 39 |
self.size.width |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
40 |
} |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
41 |
|
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
42 |
#[inline] |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
43 |
pub fn height(&self) -> usize { |
14032 | 44 |
self.size.height |
45 |
} |
|
46 |
||
47 |
#[inline] |
|
48 |
pub fn size(&self) -> Size { |
|
49 |
self.size |
|
50 |
} |
|
51 |
} |
|
52 |
||
53 |
impl<T: Copy> Vec2D<T> { |
|
54 |
pub fn new(size: Size, value: T) -> Self { |
|
55 |
Self { size, data: vec![value; size.area()] } |
|
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
56 |
} |
13916 | 57 |
|
58 |
#[inline] |
|
13930 | 59 |
pub fn get(&self, row: usize, column: usize) -> Option<&<usize as SliceIndex<[T]>>::Output> { |
14032 | 60 |
self.data.get(row * self.width() + column) |
13930 | 61 |
} |
62 |
||
63 |
#[inline] |
|
13916 | 64 |
pub fn get_mut(&mut self, row: usize, column: usize) -> Option<&mut <usize as SliceIndex<[T]>>::Output> { |
14032 | 65 |
self.data.get_mut(row * self.size.width + column) |
13916 | 66 |
} |
13924 | 67 |
|
68 |
#[inline] |
|
13930 | 69 |
pub unsafe fn get_unchecked(&self, row: usize, column: usize) -> &<usize as SliceIndex<[T]>>::Output { |
14032 | 70 |
self.data.get_unchecked(row * self.width() + column) |
13930 | 71 |
} |
72 |
||
73 |
#[inline] |
|
74 |
pub unsafe fn get_unchecked_mut(&mut self, row: usize, column: usize) -> &mut <usize as SliceIndex<[T]>>::Output { |
|
14032 | 75 |
self.data.get_unchecked_mut(row * self.size.width + column) |
13924 | 76 |
} |
14030 | 77 |
|
78 |
#[inline] |
|
79 |
pub fn rows(&self) -> impl Iterator<Item = &[T]> { |
|
14032 | 80 |
self.data.chunks(self.width()) |
14030 | 81 |
} |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
82 |
} |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
83 |
|
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
84 |
#[cfg(test)] |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
85 |
mod tests { |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
86 |
use super::*; |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
87 |
|
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
88 |
#[test] |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
89 |
fn basics() { |
14032 | 90 |
let mut v: Vec2D<u8> = Vec2D::new(Size::new(2, 3), 0xff); |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
91 |
|
14032 | 92 |
assert_eq!(v.width(), 2); |
93 |
assert_eq!(v.height(), 3); |
|
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
94 |
|
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
95 |
assert_eq!(v[0][0], 0xff); |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
96 |
assert_eq!(v[2][1], 0xff); |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
97 |
|
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
98 |
v[2][1] = 0; |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
99 |
|
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
100 |
assert_eq!(v[2][0], 0xff); |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
101 |
assert_eq!(v[2][1], 0); |
13916 | 102 |
|
103 |
v.get_mut(2, 1).map(|v| *v = 1); |
|
104 |
assert_eq!(v[2][1], 1); |
|
105 |
||
106 |
assert_eq!(v.get_mut(2, 2), None); |
|
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
107 |
} |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
108 |
} |