1use crate::vec2::Vec2;
2use std::fmt;
3
4#[derive(Debug, Default, Clone)]
6pub struct DubleVec<T> {
7 scale: Vec2,
8 vector: Vec<T>,
9}
10impl<T: Clone + PartialEq> DubleVec<T> {
11 pub fn new(scale: Vec2, fill: T) -> Self {
13 let vector = vec![fill.clone(); scale.x * scale.y];
14 Self { scale, vector }
15 }
16 pub fn access_vec(&self) -> Vec<T> {
18 self.vector.clone()
19 }
20 pub fn as_slice(&self) -> &[T] {
21 &self.vector
22 }
23 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 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 pub fn assign(&mut self, item: T, index: Vec2) {
41 if let Some(idx) = self.access_mut(index) {
42 *idx = item;
43 }
44 }
45 pub fn reverse(&mut self) {
47 self.vector.reverse();
48 }
49 pub fn is_empty(&self) -> bool {
51 self.vector.is_empty()
52 }
53 pub fn size(&self) -> usize {
55 self.vector.len()
56 }
57}
58impl<T> From<Vec<Vec<T>>> for DubleVec<T> {
59 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 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}