Skip to main content

duble_vec/
dublevec.rs

1use crate::vec2::Vec2;
2use std::fmt;
3
4/// Fixed 2D vector
5#[derive(Debug, Default, Clone)]
6pub struct DubleVec<T> {
7    scale: Vec2,
8    vector: Vec<T>,
9}
10impl<T: Clone + PartialEq> DubleVec<T> {
11    /// Creates a new `DubleVec`
12    pub fn new(scale: Vec2, fill: T) -> Self {
13        let vector = vec![fill.clone(); scale.x * scale.y];
14        Self { scale, vector }
15    }
16    /// Get clone of raw vector`Vec<T>`
17    pub fn access_vec(&self) -> Vec<T> {
18        self.vector.clone()
19    }
20    pub fn as_slice(&self) -> &[T] {
21        &self.vector
22    }
23    /// Get mutable item`T` on `index` as `Option<&mut T>`
24    pub fn access_mut(&mut self, index: Vec2) -> Option<&mut T> {
25        if index.x < self.scale.x && index.y < self.scale.y {
26            Some(&mut self.vector[index.y * self.scale.x + index.x])
27        } else {
28            None
29        }
30    }
31    /// Get item`T` on `index` as `Option<&T>`
32    pub fn access(&self, index: Vec2) -> Option<&T> {
33        if index.x < self.scale.x && index.y < self.scale.y {
34            Some(&self.vector[index.y * self.scale.x + index.x])
35        } else {
36            None
37        }
38    }
39    /// Set item`T` on `index`
40    pub fn assign(&mut self, item: T, index: Vec2) {
41        if let Some(idx) = self.access_mut(index) {
42            *idx = item;
43        }
44    }
45    /// Flip the vector
46    pub fn reverse(&mut self) {
47        self.vector.reverse();
48    }
49    /// Is vector empty?
50    pub fn is_empty(&self) -> bool {
51        self.vector.is_empty()
52    }
53    /// Return size of `vector`
54    pub fn size(&self) -> usize {
55        self.vector.len()
56    }
57}
58impl<T> From<Vec<Vec<T>>> for DubleVec<T> {
59    /// Converts `Vec<Vec<T>>` to `DubleVec<T>`
60
61    /// MUST BE A RECTANGULAR TYPE!!!
62    fn from(other: Vec<Vec<T>>) -> Self {
63        let h = other.len();
64        let w = other.first().map(|row| row.len()).unwrap_or(0);
65
66        let vector = other.into_iter().flatten().collect();
67
68        let scale = Vec2 { x: w, y: h };
69
70        Self { scale, vector }
71    }
72}
73
74impl<T> IntoIterator for DubleVec<T> {
75    type Item = T;
76    type IntoIter = std::vec::IntoIter<T>;
77
78    fn into_iter(self) -> Self::IntoIter {
79        self.vector.into_iter()
80    }
81}
82
83impl<'a, T> IntoIterator for &'a DubleVec<T> {
84    type Item = &'a T;
85    type IntoIter = std::slice::Iter<'a, T>;
86
87    fn into_iter(self) -> Self::IntoIter {
88        self.vector.iter()
89    }
90}
91
92impl<'a, T> IntoIterator for &'a mut DubleVec<T> {
93    type Item = &'a mut T;
94    type IntoIter = std::slice::IterMut<'a, T>;
95
96    fn into_iter(self) -> Self::IntoIter {
97        self.vector.iter_mut()
98    }
99}
100
101impl<T: fmt::Display> fmt::Display for DubleVec<T> {
102    /// Print a formatted vector
103    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
104        for y in 0..self.scale.y {
105            for x in 0..self.scale.x {
106                let idx = y * self.scale.x + x;
107                write!(f, "{}, ", self.vector[idx])?;
108            }
109            writeln!(f)?;
110        }
111        Ok(())
112    }
113}