mc_core/util/
geom.rs

1use std::ops::AddAssign;
2
3/// A generic rectangle.
4/// Coordinates order: X then Z
5#[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/// A generic cube.
82///
83/// Coordinate ordering: Y then Z then X
84#[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}