1use std::ops::AddAssign;
2
3#[derive(Clone)]
6pub struct Rect<T> {
7 pub data: Vec<T>,
8 pub x_size: usize,
9 pub z_size: usize
10}
11
12impl<T> Rect<T> {
13
14 pub fn new(x_size: usize, z_size: usize, def: T) -> Self
15 where
16 T: Clone
17 {
18 Rect { data: vec![def; x_size * z_size], x_size, z_size }
19 }
20
21 pub fn new_default(x_size: usize, z_size: usize) -> Self
22 where
23 T: Clone + Default
24 {
25 Self::new(x_size, z_size, T::default())
26 }
27
28 pub fn from_raw(data: Vec<T>, x_size: usize, z_size: usize) -> Self {
29 assert_eq!(data.len(), x_size * z_size);
30 Self {
31 data,
32 x_size,
33 z_size
34 }
35 }
36
37 pub fn fill(&mut self, value: T)
38 where
39 T: Clone
40 {
41 for v in &mut self.data {
42 *v = value.clone();
43 }
44 }
45
46 #[inline]
47 fn get_index(&self, x: usize, z: usize) -> usize {
48 debug_assert!(x < self.x_size && z < self.z_size);
49 x + (z * self.x_size)
50 }
51
52 #[inline]
53 pub fn set(&mut self, x: usize, z: usize, value: T) {
54 let idx = self.get_index(x, z);
55 self.data[idx] = value;
56 }
57
58 #[inline]
59 pub fn add(&mut self, x: usize, z: usize, value: T)
60 where
61 T: AddAssign
62 {
63 let idx = self.get_index(x, z);
64 self.data[idx] += value;
65 }
66
67 #[inline]
68 pub fn get(&self, x: usize, z: usize) -> &T {
69 let idx = self.get_index(x, z);
70 &self.data[idx]
71 }
72
73 #[inline]
74 pub fn get_mut(&mut self, x: usize, z: usize) -> &mut T {
75 let idx = self.get_index(x, z);
76 &mut self.data[idx]
77 }
78
79}
80
81#[derive(Clone)]
85pub struct Cube<T> {
86 pub data: Vec<T>,
87 pub x_size: usize,
88 pub y_size: usize,
89 pub z_size: usize
90}
91
92impl<T> Cube<T> {
93
94 pub fn new(x_size: usize, y_size: usize, z_size: usize, def: T) -> Self
95 where
96 T: Clone
97 {
98 Cube { data: vec![def; x_size * y_size * z_size], x_size, y_size, z_size }
99 }
100
101 pub fn new_default(x_size: usize, y_size: usize, z_size: usize) -> Self
102 where
103 T: Clone + Default
104 {
105 Self::new(x_size, y_size, z_size, T::default())
106 }
107
108 pub fn from_raw(data: Vec<T>, x_size: usize, y_size: usize, z_size: usize) -> Self {
109 assert_eq!(data.len(), x_size * y_size * z_size);
110 Self {
111 data,
112 x_size,
113 y_size,
114 z_size
115 }
116 }
117
118 pub fn fill(&mut self, value: T)
119 where
120 T: Clone
121 {
122 for v in &mut self.data {
123 *v = value.clone();
124 }
125 }
126
127 #[inline]
128 fn get_index(&self, x: usize, y: usize, z: usize) -> usize {
129 debug_assert!(x < self.x_size && y < self.y_size && z < self.z_size);
130 (x * self.z_size + z) * self.y_size + y
131 }
132
133 #[inline]
134 pub fn set(&mut self, x: usize, y: usize, z: usize, value: T) {
135 let idx = self.get_index(x, y, z);
136 self.data[idx] = value;
137 }
138
139 #[inline]
140 pub fn add(&mut self, x: usize, y: usize, z: usize, value: T)
141 where
142 T: AddAssign
143 {
144 let idx = self.get_index(x, y, z);
145 self.data[idx] += value;
146 }
147
148 #[inline]
149 pub fn get(&self, x: usize, y: usize, z: usize) -> &T {
150 let idx = self.get_index(x, y, z);
151 &self.data[idx]
152 }
153
154 #[inline]
155 pub fn get_mut(&mut self, x: usize, y: usize, z: usize) -> &mut T {
156 let idx = self.get_index(x, y, z);
157 &mut self.data[idx]
158 }
159
160}