author | alfadur |
Wed, 07 Nov 2018 18:30:33 +0300 | |
changeset 14156 | 74ca70cb753d |
parent 14121 | 69db1d2e4cec |
child 14160 | c24a76f131d6 |
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 |
|
14121 | 58 |
pub fn raw_data(&self) -> &[T] { |
59 |
&self.data |
|
60 |
} |
|
61 |
||
13916 | 62 |
#[inline] |
13930 | 63 |
pub fn get(&self, row: usize, column: usize) -> Option<&<usize as SliceIndex<[T]>>::Output> { |
14032 | 64 |
self.data.get(row * self.width() + column) |
13930 | 65 |
} |
66 |
||
67 |
#[inline] |
|
13916 | 68 |
pub fn get_mut(&mut self, row: usize, column: usize) -> Option<&mut <usize as SliceIndex<[T]>>::Output> { |
14032 | 69 |
self.data.get_mut(row * self.size.width + column) |
13916 | 70 |
} |
13924 | 71 |
|
72 |
#[inline] |
|
13930 | 73 |
pub unsafe fn get_unchecked(&self, row: usize, column: usize) -> &<usize as SliceIndex<[T]>>::Output { |
14032 | 74 |
self.data.get_unchecked(row * self.width() + column) |
13930 | 75 |
} |
76 |
||
77 |
#[inline] |
|
78 |
pub unsafe fn get_unchecked_mut(&mut self, row: usize, column: usize) -> &mut <usize as SliceIndex<[T]>>::Output { |
|
14032 | 79 |
self.data.get_unchecked_mut(row * self.size.width + column) |
13924 | 80 |
} |
14030 | 81 |
|
82 |
#[inline] |
|
83 |
pub fn rows(&self) -> impl Iterator<Item = &[T]> { |
|
14032 | 84 |
self.data.chunks(self.width()) |
14030 | 85 |
} |
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
86 |
} |
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 |
#[cfg(test)] |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
89 |
mod tests { |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
90 |
use super::*; |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
91 |
|
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
92 |
#[test] |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
93 |
fn basics() { |
14032 | 94 |
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
|
95 |
|
14032 | 96 |
assert_eq!(v.width(), 2); |
97 |
assert_eq!(v.height(), 3); |
|
13911
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
98 |
|
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
99 |
assert_eq!(v[0][0], 0xff); |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
100 |
assert_eq!(v[2][1], 0xff); |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
101 |
|
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
102 |
v[2][1] = 0; |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
103 |
|
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
104 |
assert_eq!(v[2][0], 0xff); |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
105 |
assert_eq!(v[2][1], 0); |
13916 | 106 |
|
107 |
v.get_mut(2, 1).map(|v| *v = 1); |
|
108 |
assert_eq!(v[2][1], 1); |
|
109 |
||
110 |
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
|
111 |
} |
fa9f93393e9c
Implement vec2d library to use for land arrays in the future
unc0rr
parents:
diff
changeset
|
112 |
} |