1#![warn(clippy::all, clippy::pedantic)]
2
3#![cfg_attr(not(feature = "std"), no_std)]
37
38#[cfg(all(not(feature = "std")))]
39extern crate alloc;
40#[cfg(all(not(feature = "std")))]
41use alloc::{format, vec, vec::Vec};
42#[cfg(feature = "serde")]
43use serde::{
44 ser::{Serialize, Serializer, SerializeStruct},
45 de::{self, Deserialize, Deserializer, Visitor, SeqAccess, MapAccess}
46};
47
48use core::cmp;
49use core::cmp::Eq;
50use core::fmt;
51use core::iter::StepBy;
52use core::ops::Index;
53use core::ops::IndexMut;
54use core::slice::Iter;
55use core::slice::IterMut;
56
57#[doc(hidden)]
58#[macro_export]
59macro_rules! count {
60 () => (0usize);
61 ( $x:tt $($xs:tt)* ) => (1usize + $crate::count!($($xs)*));
62}
63
64#[macro_export]
92macro_rules! grid {
93 () => {
94 $crate::Grid::from_vec(vec![], 0)
95 };
96 ( [$( $x:expr ),* ]) => { {
97 let vec = vec![$($x),*];
98 let len = vec.len();
99 $crate::Grid::from_vec(vec, len)
100 } };
101 ( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => {
102 {
103 let mut _assert_width0 = [(); $crate::count!($($x0)*)];
104 let cols = $crate::count!($($x0)*);
105 let rows = 1usize;
106
107 $(
108 let _assert_width = [(); $crate::count!($($x)*)];
109 _assert_width0 = _assert_width;
110 let rows = rows + 1usize;
111 )*
112
113 let mut vec = Vec::with_capacity(rows.checked_mul(cols).unwrap());
114
115 $( vec.push($x0); )*
116 $( $( vec.push($x); )* )*
117
118 $crate::Grid::from_vec(vec, cols)
119 }
120 };
121}
122
123pub struct Grid<T> {
132 data: Vec<T>,
133 cols: usize,
134 rows: usize,
135}
136
137#[cfg(feature = "serde")]
138impl<'de, T: Deserialize<'de>> Deserialize<'de> for Grid<T> {
139
140 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
141 where
142 D: Deserializer<'de>,
143 {
144 use std::marker::PhantomData;
145 #[derive(serde::Deserialize)]
146 #[serde(field_identifier, rename_all = "lowercase")]
147 enum Field { Data, Cols }
148
149 struct GridVisitor<T> {
150 _p: PhantomData<T>,
151 }
152
153 impl<'de, T: Deserialize<'de>> Visitor<'de> for GridVisitor<T> {
154 type Value = Grid<T>;
155
156 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
157 formatter.write_str("struct Grid")
158 }
159
160 fn visit_seq<V>(self, mut seq: V) -> Result<Grid<T>, V::Error>
161 where
162 V: SeqAccess<'de>,
163 {
164 let cols = seq.next_element()?
165 .ok_or_else(|| de::Error::invalid_length(0, &self))?;
166 let data = seq.next_element()?
167 .ok_or_else(|| de::Error::invalid_length(1, &self))?;
168 Ok(Grid::from_vec(data, cols))
169 }
170
171 fn visit_map<V>(self, mut map: V) -> Result<Grid<T>, V::Error>
172 where
173 V: MapAccess<'de>,
174 {
175 let mut cols = None;
176 let mut data = None;
177 while let Some(key) = map.next_key()? {
178 match key {
179 Field::Data => {
180 if data.is_some() {
181 return Err(de::Error::duplicate_field("data"));
182 }
183 data = Some(map.next_value()?);
184 }
185 Field::Cols => {
186 if cols.is_some() {
187 return Err(de::Error::duplicate_field("cols"));
188 }
189 cols = Some(map.next_value()?);
190 }
191 }
192 }
193 let cols = cols.ok_or_else(|| de::Error::missing_field("cols"))?;
194 let data = data.ok_or_else(|| de::Error::missing_field("data"))?;
195 Ok(Grid::from_vec(data, cols))
196 }
197 }
198
199 const FIELDS: &'static [&'static str] = &["cols", "data"];
200 deserializer.deserialize_struct("Grid", FIELDS, GridVisitor{ _p: PhantomData})
201 }
202}
203
204#[cfg(feature = "serde")]
205impl<T: Serialize> Serialize for Grid<T> {
206 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
207 where
208 S: Serializer,
209 {
210 let mut state = serializer.serialize_struct("Grid", 3)?;
212 state.serialize_field("cols", &self.cols)?;
213 state.serialize_field("data", &self.data)?;
214 state.end()
215 }
216}
217
218impl<T> Grid<T> {
219 pub fn new(rows: usize, cols: usize) -> Grid<T>
234 where
235 T: Default,
236 {
237 if rows == 0 || cols == 0 {
238 return Grid {
239 data: Vec::new(),
240 rows: 0,
241 cols: 0,
242 };
243 }
244 let mut data = Vec::new();
245 data.resize_with(rows.checked_mul(cols).unwrap(), T::default);
246 Grid { data, cols, rows }
247 }
248
249 pub fn init(rows: usize, cols: usize, data: T) -> Grid<T>
257 where
258 T: Clone,
259 {
260 if rows == 0 || cols == 0 {
261 return Grid {
262 data: Vec::new(),
263 rows: 0,
264 cols: 0,
265 };
266 }
267 Grid {
268 data: vec![data; rows.checked_mul(cols).unwrap()],
269 cols,
270 rows,
271 }
272 }
273
274 #[must_use]
300 pub fn from_vec(vec: Vec<T>, cols: usize) -> Grid<T> {
301 let rows = vec.len().checked_div(cols).unwrap_or(0);
302 assert_eq!(
303 rows * cols,
304 vec.len(),
305 "Vector length {:?} should be a multiple of cols = {:?}",
306 vec.len(),
307 cols
308 );
309 if rows == 0 || cols == 0 {
310 Grid {
311 data: vec,
312 rows: 0,
313 cols: 0,
314 }
315 } else {
316 Grid {
317 data: vec,
318 rows,
319 cols,
320 }
321 }
322 }
323
324 #[inline]
331 #[must_use]
332 pub unsafe fn get_unchecked(&self, row: usize, col: usize) -> &T {
333 self.data.get_unchecked(row * self.cols + col)
334 }
335
336 #[inline]
343 #[must_use]
344 pub unsafe fn get_unchecked_mut(&mut self, row: usize, col: usize) -> &mut T {
345 self.data.get_unchecked_mut(row * self.cols + col)
346 }
347
348 #[must_use]
351 pub fn get(&self, row: usize, col: usize) -> Option<&T> {
352 if row < self.rows && col < self.cols {
353 unsafe { Some(self.get_unchecked(row, col)) }
354 } else {
355 None
356 }
357 }
358
359 #[must_use]
362 pub fn get_mut(&mut self, row: usize, col: usize) -> Option<&mut T> {
363 if row < self.rows && col < self.cols {
364 unsafe { Some(self.get_unchecked_mut(row, col)) }
365 } else {
366 None
367 }
368 }
369
370 #[must_use]
373 pub fn size(&self) -> (usize, usize) {
374 (self.rows, self.cols)
375 }
376
377 #[must_use]
379 pub fn rows(&self) -> usize {
380 self.rows
381 }
382
383 #[must_use]
385 pub fn cols(&self) -> usize {
386 self.cols
387 }
388
389 #[must_use]
397 pub fn is_empty(&self) -> bool {
398 self.data.is_empty()
399 }
400
401 pub fn clear(&mut self) {
403 self.rows = 0;
404 self.cols = 0;
405 self.data.clear();
406 }
407
408 pub fn iter(&self) -> Iter<T> {
420 self.data.iter()
421 }
422
423 pub fn iter_mut(&mut self) -> IterMut<T> {
433 self.data.iter_mut()
434 }
435
436 pub fn iter_col(&self, col: usize) -> StepBy<Iter<T>> {
453 if col < self.cols {
454 return self.data[col..].iter().step_by(self.cols);
455 }
456 panic!(
457 "out of bounds. Column must be less than {:?}, but is {:?}.",
458 self.cols, col
459 )
460 }
461
462 pub fn iter_col_mut(&mut self, col: usize) -> StepBy<IterMut<T>> {
480 let cols = self.cols;
481 if col < cols {
482 return self.data[col..].iter_mut().step_by(cols);
483 }
484 panic!(
485 "out of bounds. Column must be less than {:?}, but is {:?}.",
486 self.cols, col
487 )
488 }
489
490 pub fn iter_row(&self, row: usize) -> Iter<T> {
508 if row < self.rows {
509 let start = row * self.cols;
510 self.data[start..(start + self.cols)].iter()
511 } else {
512 panic!(
513 "out of bounds. Row must be less than {:?}, but is {:?}.",
514 self.rows, row
515 )
516 }
517 }
518
519 pub fn iter_row_mut(&mut self, row: usize) -> IterMut<T> {
536 if row < self.rows {
537 let cols = self.cols;
538 let start = row * cols;
539 self.data[start..(start + cols)].iter_mut()
540 } else {
541 panic!(
542 "out of bounds. Row must be less than {:?}, but is {:?}.",
543 self.rows, row
544 )
545 }
546 }
547
548 pub fn indexed_iter(&self) -> impl Iterator<Item = ((usize, usize), &T)> {
569 self.data
570 .iter()
571 .enumerate()
572 .map(move |(idx, i)| ((idx / self.cols, idx % self.cols), i))
573 }
574
575 pub fn push_row(&mut self, row: Vec<T>) {
606 assert_ne!(row.len(), 0);
607 assert!(
608 !(self.rows > 0 && row.len() != self.cols),
609 "pushed row does not match. Length must be {:?}, but was {:?}.",
610 self.cols,
611 row.len()
612 );
613 self.data.extend(row);
614 self.rows += 1;
615 if self.cols == 0 {
616 self.cols = self.data.len();
617 }
618 }
619
620 pub fn push_col(&mut self, col: Vec<T>) {
654 assert_ne!(col.len(), 0);
655 assert!(
656 !(self.cols > 0 && col.len() != self.rows),
657 "pushed column does not match. Length must be {:?}, but was {:?}.",
658 self.rows,
659 col.len()
660 );
661 self.data.extend(col);
662 for i in (1..self.rows).rev() {
663 let row_idx = i * self.cols;
664 self.data[row_idx..row_idx + self.cols + i].rotate_right(i);
665 }
666 self.cols += 1;
667 if self.rows == 0 {
668 self.rows = self.data.len();
669 }
670 }
671
672 pub fn pop_row(&mut self) -> Option<Vec<T>> {
683 if self.rows == 0 {
684 return None;
685 }
686 let row = self.data.split_off((self.rows - 1) * self.cols);
687 self.rows -= 1;
688 if self.rows == 0 {
689 self.cols = 0;
690 }
691 Some(row)
692 }
693
694 pub fn remove_row(&mut self, row_index: usize) -> Option<Vec<T>> {
706 if self.cols == 0 || self.rows == 0 || row_index >= self.rows {
707 return None;
708 }
709 let residue = self
710 .data
711 .drain((row_index * self.cols)..((row_index + 1) * self.cols));
712
713 self.rows -= 1;
714 if self.rows == 0 {
715 self.cols = 0;
716 }
717 Some(residue.collect())
718 }
719
720 pub fn pop_col(&mut self) -> Option<Vec<T>> {
735 if self.cols == 0 {
736 return None;
737 }
738 for i in 1..self.rows {
739 let row_idx = i * (self.cols - 1);
740 self.data[row_idx..row_idx + self.cols + i - 1].rotate_left(i);
741 }
742 let col = self.data.split_off(self.data.len() - self.rows);
743 self.cols -= 1;
744 if self.cols == 0 {
745 self.rows = 0;
746 }
747 Some(col)
748 }
749
750 pub fn remove_col(&mut self, col_index: usize) -> Option<Vec<T>> {
763 if self.cols == 0 || self.rows == 0 || col_index >= self.cols {
764 return None;
765 }
766 for i in 0..self.rows {
767 let row_idx = col_index + i * (self.cols - 1);
768 let end = cmp::min(row_idx + self.cols + i, self.data.len());
769 self.data[row_idx..end].rotate_left(i + 1);
770 }
771 let col = self.data.split_off(self.data.len() - self.rows);
772 self.cols -= 1;
773 if self.cols == 0 {
774 self.rows = 0;
775 }
776 Some(col)
777 }
778
779 pub fn insert_row(&mut self, index: usize, row: Vec<T>) {
798 let input_len = row.len();
799 assert!(
800 !(self.cols > 0 && input_len != self.cols),
801 "Inserted row must be of length {}, but was {}.",
802 self.cols,
803 row.len()
804 );
805 assert!(
806 index <= self.rows,
807 "Out of range. Index was {}, but must be less or equal to {}.",
808 index,
809 self.rows
810 );
811 let data_idx = index * input_len;
812 self.data.splice(data_idx..data_idx, row.into_iter());
813 self.cols = input_len;
814 self.rows += 1;
815 }
816
817 pub fn insert_col(&mut self, index: usize, col: Vec<T>) {
838 let input_len = col.len();
839 assert!(
840 !(self.rows > 0 && input_len != self.rows),
841 "Inserted col must be of length {}, but was {}.",
842 self.rows,
843 col.len()
844 );
845 assert!(
846 index <= self.cols,
847 "Out of range. Index was {}, but must be less or equal to {}.",
848 index,
849 self.cols
850 );
851 for (row_iter, col_val) in col.into_iter().enumerate() {
852 let data_idx = row_iter * self.cols + index + row_iter;
853 self.data.insert(data_idx, col_val);
854 }
855 self.rows = input_len;
856 self.cols += 1;
857 }
858
859 #[must_use]
872 pub fn flatten(&self) -> &Vec<T> {
873 &self.data
874 }
875
876 #[must_use]
878 pub fn into_vec(self) -> Vec<T> {
879 self.data
880 }
881
882 #[must_use]
884 pub fn transpose(&self) -> Grid<T>
885 where
886 T: Clone,
887 {
888 let mut data = Vec::with_capacity(self.data.len());
889 for c in 0..self.cols {
890 for r in 0..self.rows {
891 data.push(self[r][c].clone());
892 }
893 }
894 Grid {
895 data,
896 cols: self.rows,
897 rows: self.cols,
898 }
899 }
900
901 #[must_use]
911 pub fn rotate_left(&self) -> Grid<T>
912 where
913 T: Clone,
914 {
915 let mut data = Vec::with_capacity(self.data.len());
916 for c in (0..self.cols).rev() {
917 for r in 0..self.rows {
918 data.push(self[r][c].clone());
919 }
920 }
921 Grid {
922 data,
923 cols: self.rows,
924 rows: self.cols,
925 }
926 }
927
928 #[must_use]
938 pub fn rotate_right(&self) -> Grid<T>
939 where
940 T: Clone,
941 {
942 let mut data = Vec::with_capacity(self.data.len());
943 for c in 0..self.cols {
944 for r in (0..self.rows).rev() {
945 data.push(self[r][c].clone());
946 }
947 }
948 Grid {
949 data,
950 cols: self.rows,
951 rows: self.cols,
952 }
953 }
954
955 #[must_use]
965 pub fn rotate_half(&self) -> Grid<T>
966 where
967 T: Clone,
968 {
969 let data: Vec<_> = self.data.iter().rev().cloned().collect();
970 Grid {
971 data,
972 cols: self.cols,
973 rows: self.rows,
974 }
975 }
976
977 pub fn fill(&mut self, value: T)
989 where
990 T: Clone,
991 {
992 self.data.fill(value);
993 }
994
995 pub fn fill_with<F>(&mut self, f: F)
1014 where
1015 F: FnMut() -> T,
1016 {
1017 self.data.fill_with(f);
1018 }
1019
1020 #[must_use]
1035 pub fn iter_rows(&self) -> GridRowIter<'_, T> {
1036 GridRowIter {
1037 grid: self,
1038 row_index: 0,
1039 }
1040 }
1041
1042 #[must_use]
1057 pub fn iter_cols(&self) -> GridColIter<'_, T> {
1058 GridColIter {
1059 grid: self,
1060 col_index: 0,
1061 }
1062 }
1063}
1064
1065impl<T: Clone> Clone for Grid<T> {
1066 fn clone(&self) -> Self {
1067 Grid {
1068 rows: self.rows,
1069 cols: self.cols,
1070 data: self.data.clone(),
1071 }
1072 }
1073}
1074
1075impl<T> Index<usize> for Grid<T> {
1076 type Output = [T];
1077
1078 #[inline]
1079 fn index(&self, idx: usize) -> &[T] {
1080 let start_idx = idx * self.cols;
1081 &self.data[start_idx..start_idx + self.cols]
1082 }
1083}
1084
1085impl<T> IndexMut<usize> for Grid<T> {
1086 #[inline]
1087 fn index_mut(&mut self, idx: usize) -> &mut [T] {
1088 let start_idx = idx * self.cols;
1089 &mut self.data[start_idx..start_idx + self.cols]
1090 }
1091}
1092
1093impl<T> Index<(usize, usize)> for Grid<T> {
1094 type Output = T;
1095
1096 #[inline]
1097 fn index(&self, (row, col): (usize, usize)) -> &T {
1098 assert!(
1099 !(row >= self.rows || col >= self.cols),
1100 "grid index out of bounds: ({row},{col}) out of ({},{})",
1101 self.rows,
1102 self.cols
1103 );
1104 &self.data[row * self.cols + col]
1105 }
1106}
1107
1108impl<T> IndexMut<(usize, usize)> for Grid<T> {
1109 #[inline]
1110 fn index_mut(&mut self, (row, col): (usize, usize)) -> &mut T {
1111 assert!(
1112 !(row >= self.rows || col >= self.cols),
1113 "grid index out of bounds: ({row},{col}) out of ({},{})",
1114 self.rows,
1115 self.cols
1116 );
1117 &mut self.data[row * self.cols + col]
1118 }
1119}
1120
1121impl<T: fmt::Debug> fmt::Debug for Grid<T> {
1122 #[allow(unused_must_use)]
1123 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1124 write!(f, "[");
1125 if self.cols > 0 {
1126 if f.alternate() {
1127 writeln!(f);
1128 let width = f.width().unwrap_or(
1135 self.data
1139 .iter()
1140 .map(|i| format!("{i:?}").len())
1141 .max()
1142 .unwrap(),
1143 );
1144 let precision = f.precision().unwrap_or(2);
1145 for (i, _) in self.data.iter().enumerate().step_by(self.cols) {
1146 let mut row = self.data[i..(i + self.cols)].iter().peekable();
1147 write!(f, " [");
1148 while let Some(item) = row.next() {
1149 write!(
1150 f,
1151 " {item:width$.precision$?}",
1152 );
1155 if row.peek().is_some() {
1156 write!(f, ",");
1157 }
1158 }
1159 writeln!(f, "]");
1160 }
1161 } else {
1162 for (i, _) in self.data.iter().enumerate().step_by(self.cols) {
1163 write!(f, "{:?}", &self.data[i..(i + self.cols)]);
1164 }
1165 }
1166 }
1167 write!(f, "]")
1168 }
1169}
1170
1171impl<T: Eq> PartialEq for Grid<T> {
1172 fn eq(&self, other: &Self) -> bool {
1173 self.rows == other.rows && self.cols == other.cols && self.data == other.data
1174 }
1175}
1176
1177impl<T: Eq> Eq for Grid<T> {}
1178
1179pub struct GridRowIter<'a, T> {
1180 grid: &'a Grid<T>,
1181 row_index: usize,
1182}
1183pub struct GridColIter<'a, T> {
1184 grid: &'a Grid<T>,
1185 col_index: usize,
1186}
1187
1188impl<'a, T> Iterator for GridRowIter<'a, T> {
1189 type Item = Iter<'a, T>;
1190
1191 fn next(&mut self) -> Option<Self::Item> {
1192 let rows = self.grid.rows();
1193 let row_index = self.row_index;
1194
1195 if !(0..rows).contains(&row_index) {
1196 return None;
1197 }
1198
1199 let row_iter = self.grid.iter_row(row_index);
1200 self.row_index += 1;
1201 Some(row_iter)
1202 }
1203}
1204
1205impl<'a, T> Iterator for GridColIter<'a, T> {
1206 type Item = StepBy<Iter<'a, T>>;
1207
1208 fn next(&mut self) -> Option<Self::Item> {
1209 let cols = self.grid.cols();
1210 let col_index = self.col_index;
1211
1212 if !(0..cols).contains(&col_index) {
1213 return None;
1214 }
1215
1216 let row_iter = self.grid.iter_col(col_index);
1217 self.col_index += 1;
1218 Some(row_iter)
1219 }
1220}
1221
1222#[cfg(test)]
1223mod test {
1224 use super::*;
1225 #[cfg(all(not(feature = "std")))]
1226 use alloc::string::String;
1227
1228 #[test]
1229 fn from_vec_zero_with_cols() {
1230 let grid: Grid<u8> = Grid::from_vec(vec![], 1);
1231 assert_eq!(grid.rows(), 0);
1232 assert_eq!(grid.cols(), 0);
1233 }
1234
1235 #[test]
1236 fn from_vec_zero() {
1237 let grid: Grid<u8> = Grid::from_vec(vec![], 0);
1238 let _ = grid.is_empty();
1239 assert_eq!(grid.rows(), 0);
1240 assert_eq!(grid.cols(), 0);
1241 }
1242
1243 #[test]
1244 fn insert_col_at_end() {
1245 let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1246 grid.insert_col(2, vec![5, 6]);
1247 assert_eq!(grid[0], [1, 2, 5]);
1248 assert_eq!(grid[1], [3, 4, 6]);
1249 }
1250
1251 #[test]
1252 #[should_panic]
1253 fn insert_col_out_of_idx() {
1254 let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1255 grid.insert_col(3, vec![4, 5]);
1256 }
1257
1258 #[test]
1259 fn insert_row_at_end() {
1260 let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1261 grid.insert_row(2, vec![5, 6]);
1262 assert_eq!(grid[0], [1, 2]);
1263 assert_eq!(grid[1], [3, 4]);
1264 assert_eq!(grid[2], [5, 6]);
1265 }
1266
1267 #[test]
1268 fn insert_row_empty() {
1269 let mut grid: Grid<u8> = grid![];
1270 grid.insert_row(0, vec![1, 2, 3]);
1271 assert_eq!(grid[0], [1, 2, 3]);
1272 assert_eq!((1, 3), grid.size());
1273 }
1274
1275 #[test]
1276 fn insert_col_empty() {
1277 let mut grid: Grid<u8> = grid![];
1278 grid.insert_col(0, vec![1, 2, 3]);
1279 assert_eq!(grid[0], [1]);
1280 assert_eq!((3, 1), grid.size());
1281 }
1282
1283 #[test]
1284 #[should_panic]
1285 fn insert_row_out_of_idx() {
1286 let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1287 grid.insert_row(3, vec![4, 5]);
1288 }
1289
1290 #[test]
1291 #[should_panic]
1292 fn insert_row_wrong_size_of_idx() {
1293 let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1294 grid.insert_row(1, vec![4, 5, 4]);
1295 }
1296
1297 #[test]
1298 fn insert_row_start() {
1299 let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1300 let new_row = [5, 6];
1301 grid.insert_row(1, new_row.to_vec());
1302 assert_eq!(grid[1], new_row);
1303 }
1304
1305 #[test]
1306 fn pop_col_1x3() {
1307 let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 3);
1308 assert_eq!(grid.pop_col(), Some(vec![3]));
1309 assert_eq!(grid.size(), (1, 2));
1310 assert_eq!(grid.pop_col(), Some(vec![2]));
1311 assert_eq!(grid.size(), (1, 1));
1312 assert_eq!(grid.pop_col(), Some(vec![1]));
1313 assert!(grid.is_empty());
1314 assert_eq!(grid.pop_col(), None);
1315 }
1316
1317 #[test]
1318 fn pop_col_3x1() {
1319 let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 1);
1320 assert_eq!(grid.pop_col(), Some(vec![1, 2, 3]));
1321 assert!(grid.is_empty());
1322 assert_eq!(grid.pop_col(), None);
1323 }
1324
1325 #[test]
1326 fn pop_col_2x2() {
1327 let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1328 assert_eq!(grid.pop_col(), Some(vec![2, 4]));
1329 assert_eq!(grid.size(), (2, 1));
1330 assert_eq!(grid.pop_col(), Some(vec![1, 3]));
1331 assert_eq!(grid.size(), (0, 0));
1332 assert_eq!(grid.pop_col(), None);
1333 }
1334
1335 #[test]
1336 fn pop_col_3x4() {
1337 let mut grid: Grid<u16> =
1338 Grid::from_vec(vec![1, 2, 3, 4, 11, 22, 33, 44, 111, 222, 333, 444], 4);
1339 assert_eq!(grid.pop_col(), Some(vec![4, 44, 444]));
1340 assert_eq!(grid.size(), (3, 3));
1341 assert_eq!(grid.pop_col(), Some(vec![3, 33, 333]));
1342 assert_eq!(grid.size(), (3, 2));
1343 assert_eq!(grid.pop_col(), Some(vec![2, 22, 222]));
1344 assert_eq!(grid.size(), (3, 1));
1345 assert_eq!(grid.pop_col(), Some(vec![1, 11, 111]));
1346 assert_eq!(grid.size(), (0, 0));
1347 assert_eq!(grid.pop_col(), None);
1348 }
1349
1350 #[test]
1351 fn pop_col_empty() {
1352 let mut grid: Grid<u8> = Grid::from_vec(vec![], 0);
1353 assert_eq!(grid.pop_row(), None);
1354 }
1355
1356 #[test]
1357 fn pop_row_2x2() {
1358 let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1359 assert_eq!(grid.pop_row(), Some(vec![3, 4]));
1360 assert_ne!(grid.size(), (1, 4));
1361 assert_eq!(grid.pop_row(), Some(vec![1, 2]));
1362 assert_eq!(grid.size(), (0, 0));
1363 assert_eq!(grid.pop_row(), None);
1364 }
1365
1366 #[test]
1367 fn pop_row_empty() {
1368 let mut grid: Grid<u8> = Grid::from_vec(vec![], 0);
1369 assert_eq!(grid.pop_row(), None);
1370 }
1371
1372 #[test]
1373 fn ne_full_empty() {
1374 let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
1375 let g2: Grid<u8> = grid![];
1376 assert_ne!(g1, g2);
1377 }
1378
1379 #[test]
1380 fn ne() {
1381 let g1 = Grid::from_vec(vec![1, 2, 3, 5], 2);
1382 let g2 = Grid::from_vec(vec![1, 2, 3, 4], 2);
1383 assert_ne!(g1, g2);
1384 }
1385
1386 #[test]
1387 fn ne_dif_rows() {
1388 let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
1389 let g2 = Grid::from_vec(vec![1, 2, 3, 4], 1);
1390 assert_ne!(g1, g2);
1391 }
1392
1393 #[test]
1394 fn equal_empty() {
1395 let grid: Grid<char> = grid![];
1396 let grid2: Grid<char> = grid![];
1397 assert_eq!(grid, grid2);
1398 }
1399 #[test]
1400 fn equal() {
1401 let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
1402 let grid2: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
1403 assert_eq!(grid, grid2);
1404 }
1405
1406 #[test]
1407 #[should_panic]
1408 fn idx_out_of_col_bounds() {
1409 let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
1410 let _ = grid[0][5];
1411 }
1412
1413 #[test]
1414 #[should_panic]
1415 fn idx_tup_out_of_col_bounds() {
1416 let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
1417 let _ = grid[(0, 5)];
1418 }
1419
1420 #[test]
1421 fn push_col_2x3() {
1422 let mut grid: Grid<u8> = grid![
1423 [0, 1, 2]
1424 [10, 11, 12]];
1425 grid.push_col(vec![3, 13]);
1426 assert_eq!(grid.size(), (2, 4));
1427 assert_eq!(
1428 grid.iter_row(0).copied().collect::<Vec<_>>(),
1429 vec![0, 1, 2, 3]
1430 );
1431 assert_eq!(
1432 grid.iter_row(1).copied().collect::<Vec<_>>(),
1433 vec![10, 11, 12, 13]
1434 );
1435 }
1436
1437 #[test]
1438 fn push_col_3x4() {
1439 let mut grid: Grid<char> = grid![
1440 ['a', 'b', 'c', 'd']
1441 ['a', 'b', 'c', 'd']
1442 ['a', 'b', 'c', 'd']];
1443 grid.push_col(vec!['x', 'y', 'z']);
1444 assert_eq!(grid.size(), (3, 5));
1445 assert_eq!(
1446 grid.iter_row(0).copied().collect::<Vec<_>>(),
1447 vec!['a', 'b', 'c', 'd', 'x']
1448 );
1449 assert_eq!(
1450 grid.iter_row(1).copied().collect::<Vec<_>>(),
1451 vec!['a', 'b', 'c', 'd', 'y']
1452 );
1453 assert_eq!(
1454 grid.iter_row(2).copied().collect::<Vec<_>>(),
1455 vec!['a', 'b', 'c', 'd', 'z']
1456 );
1457 }
1458
1459 #[test]
1460 fn push_col_1x3() {
1461 let mut grid: Grid<char> = grid![['a', 'b', 'c']];
1462 grid.push_col(vec!['d']);
1463 assert_eq!(grid.size(), (1, 4));
1464 assert_eq!(grid[0][3], 'd');
1465 }
1466
1467 #[test]
1468 fn push_col_empty() {
1469 let mut grid: Grid<char> = grid![];
1470 grid.push_col(vec!['b', 'b', 'b', 'b']);
1471 assert_eq!(grid.size(), (4, 1));
1472 assert_eq!(grid[0][0], 'b');
1473 }
1474
1475 #[test]
1476 #[should_panic]
1477 fn push_col_wrong_size() {
1478 let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
1479 grid.push_col(vec!['b']);
1480 grid.push_col(vec!['b', 'b']);
1481 }
1482
1483 #[test]
1484 #[should_panic]
1485 fn push_col_zero_len() {
1486 let mut grid: Grid<char> = grid![];
1487 grid.push_col(vec![]);
1488 }
1489
1490 #[test]
1491 fn push_row_empty() {
1492 let mut grid: Grid<char> = grid![];
1493 grid.push_row(vec!['b', 'b', 'b', 'b']);
1494 assert_eq!(grid.size(), (1, 4));
1495 assert_eq!(grid[0][0], 'b');
1496 }
1497
1498 #[test]
1499 #[should_panic]
1500 fn push_empty_row() {
1501 let mut grid = Grid::init(0, 1, 0);
1502 grid.push_row(vec![]);
1503 }
1504
1505 #[test]
1506 #[should_panic]
1507 fn push_row_wrong_size() {
1508 let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
1509 grid.push_row(vec!['b']);
1510 grid.push_row(vec!['b', 'b', 'b', 'b']);
1511 }
1512
1513 #[test]
1514 fn iter_row() {
1515 let grid: Grid<u8> = grid![[1,2,3][1,2,3]];
1516 let mut iter = grid.iter_row(0);
1517 assert_eq!(iter.next(), Some(&1));
1518 assert_eq!(iter.next(), Some(&2));
1519 assert_eq!(iter.next(), Some(&3));
1520 assert_eq!(iter.next(), None);
1521 }
1522
1523 #[test]
1524 #[should_panic]
1525 fn iter_row_empty() {
1526 let grid: Grid<u8> = grid![];
1527 let _ = grid.iter_row(0);
1528 }
1529
1530 #[test]
1531 #[should_panic]
1532 fn iter_row_out_of_bound() {
1533 let grid: Grid<u8> = grid![[1,2,3][1,2,3]];
1534 let _ = grid.iter_row(2);
1535 }
1536
1537 #[test]
1538 #[should_panic]
1539 fn iter_col_out_of_bound() {
1540 let grid: Grid<u8> = grid![[1,2,3][1,2,3]];
1541 let _ = grid.iter_col(3);
1542 }
1543
1544 #[test]
1545 #[should_panic]
1546 fn iter_col_zero() {
1547 let grid: Grid<u8> = grid![];
1548 let _ = grid.iter_col(0);
1549 }
1550
1551 #[test]
1552 fn iter() {
1553 let grid: Grid<u8> = grid![[1,2][3,4]];
1554 let mut iter = grid.iter();
1555 assert_eq!(iter.next(), Some(&1));
1556 assert_eq!(iter.next(), Some(&2));
1557 assert_eq!(iter.next(), Some(&3));
1558 assert_eq!(iter.next(), Some(&4));
1559 assert_eq!(iter.next(), None);
1560 }
1561
1562 #[test]
1563 fn indexed_iter() {
1564 let grid: Grid<u8> = grid![[1,2][3,4]];
1565 let mut iter = grid.indexed_iter();
1566 assert_eq!(iter.next(), Some(((0, 0), &1)));
1567 assert_eq!(iter.next(), Some(((0, 1), &2)));
1568 assert_eq!(iter.next(), Some(((1, 0), &3)));
1569 assert_eq!(iter.next(), Some(((1, 1), &4)));
1570 assert_eq!(iter.next(), None);
1571 }
1572
1573 #[test]
1574 fn indexed_iter_empty() {
1575 let grid: Grid<u8> = Grid::new(0, 0);
1576 let mut iter = grid.indexed_iter();
1577 assert_eq!(iter.next(), None);
1578 }
1579
1580 #[test]
1581 fn clear() {
1582 let mut grid: Grid<u8> = grid![[1, 2, 3]];
1583 assert!(!grid.is_empty());
1584 grid.clear();
1585 assert!(grid.is_empty());
1586 }
1587
1588 #[test]
1589 fn is_empty_false() {
1590 let grid: Grid<u8> = grid![[1, 2, 3]];
1591 assert!(!grid.is_empty());
1592 }
1593
1594 #[test]
1595 fn is_empty() {
1596 let mut g: Grid<u8> = grid![[]];
1597 assert!(g.is_empty());
1598 g = grid![];
1599 assert!(g.is_empty());
1600 g = Grid::from_vec(vec![], 0);
1601 assert!(g.is_empty());
1602 g = Grid::new(0, 0);
1603 assert!(g.is_empty());
1604 g = Grid::new(0, 1);
1605 assert!(g.is_empty());
1606 g = Grid::new(1, 0);
1607 assert!(g.is_empty());
1608 g = Grid::init(0, 0, 10);
1609 assert!(g.is_empty());
1610 }
1611
1612 #[test]
1613 fn fmt_empty() {
1614 let grid: Grid<u8> = grid![];
1615 assert_eq!(format!("{:?}", grid), "[]");
1616 }
1617
1618 #[test]
1619 fn fmt_row() {
1620 let grid: Grid<u8> = grid![[1, 2, 3]];
1621 assert_eq!(format!("{:?}", grid), "[[1, 2, 3]]");
1622 }
1623
1624 #[test]
1625 fn fmt_grid() {
1626 let grid: Grid<u8> = grid![[1,2,3][4,5,6][7,8,9]];
1627 assert_eq!(format!("{:?}", grid), "[[1, 2, 3][4, 5, 6][7, 8, 9]]");
1628 }
1629
1630 #[test]
1631 fn fmt_pretty_empty() {
1632 let grid: Grid<f32> = grid![];
1633 assert_eq!(format!("{:#?}", grid), "[]");
1634 }
1635
1636 #[test]
1637 fn fmt_pretty_int() {
1638 let grid: Grid<u8> = grid![
1639 [1,2,3]
1640 [4,5,6]
1641 [7,8,95]
1642 ];
1643
1644 let expected_output = r#"[
1645 [ 1, 2, 3]
1646 [ 4, 5, 6]
1647 [ 7, 8, 95]
1648]"#;
1649
1650 assert_eq!(format!("{:#?}", grid), expected_output);
1651
1652 let expected_output = r#"[
1653 [ 1, 2, 3]
1654 [ 4, 5, 6]
1655 [ 7, 8, 95]
1656]"#;
1657
1658 assert_eq!(format!("{:#3?}", grid), expected_output);
1659 }
1660
1661 #[test]
1662 fn fmt_pretty_float() {
1663 let grid: Grid<f32> = grid![
1664 [1.5,2.6,3.44]
1665 [4.775,5.,6.]
1666 [7.1,8.23444,95.55]
1667 ];
1668
1669 let expected_output = r#"[
1670 [ 1.5, 2.6, 3.4]
1671 [ 4.8, 5.0, 6.0]
1672 [ 7.1, 8.2, 95.6]
1673]"#;
1674
1675 assert_eq!(format!("{:#5.1?}", grid), expected_output);
1676
1677 let expected_output = r#"[
1678 [ 1.50000, 2.60000, 3.44000]
1679 [ 4.77500, 5.00000, 6.00000]
1680 [ 7.10000, 8.23444, 95.55000]
1681]"#;
1682
1683 assert_eq!(format!("{:#8.5?}", grid), expected_output);
1684 }
1685
1686 #[test]
1687 fn fmt_pretty_tuple() {
1688 let grid: Grid<(i32, i32)> = grid![
1689 [(5,66), (432, 55)]
1690 [(80, 90), (5, 6)]
1691 ];
1692
1693 let expected_output = r#"[
1694 [ ( 5, 66), ( 432, 55)]
1695 [ ( 80, 90), ( 5, 6)]
1696]"#;
1697
1698 assert_eq!(format!("{grid:#?}"), expected_output);
1699
1700 let expected_output = r#"[
1701 [ ( 5, 66), (432, 55)]
1702 [ ( 80, 90), ( 5, 6)]
1703]"#;
1704
1705 assert_eq!(format!("{:#3?}", grid), expected_output);
1706 }
1707
1708 #[test]
1709 fn fmt_pretty_struct_derived() {
1710 #[derive(Debug)]
1711 struct Person {
1712 _name: String,
1713 _precise_age: f32,
1714 }
1715
1716 impl Person {
1717 fn new(name: &str, precise_age: f32) -> Self {
1718 Person {
1719 _name: name.into(),
1720 _precise_age: precise_age,
1721 }
1722 }
1723 }
1724
1725 let grid: Grid<Person> = grid![
1726 [Person::new("Vic", 24.5), Person::new("Mr. Very Long Name", 1955.)]
1727 [Person::new("Sam", 8.9995), Person::new("John Doe", 40.14)]
1728 ];
1729
1730 let expected_output = r#"[
1731 [ Person { _name: "Vic", _precise_age: 24.50000 }, Person { _name: "Mr. Very Long Name", _precise_age: 1955.00000 }]
1732 [ Person { _name: "Sam", _precise_age: 8.99950 }, Person { _name: "John Doe", _precise_age: 40.14000 }]
1733]"#;
1734
1735 assert_eq!(format!("{:#5.5?}", grid), expected_output);
1736 }
1737
1738 #[test]
1739 fn clone() {
1740 let grid = grid![[1, 2, 3][4, 5, 6]];
1741 let mut clone = grid.clone();
1742 clone[0][2] = 10;
1743 assert_eq!(grid[0][2], 3);
1744 assert_eq!(clone[0][2], 10);
1745 }
1746
1747 #[test]
1748 fn macro_init() {
1749 let grid = grid![[1, 2, 3][4, 5, 6]];
1750 assert_eq!(grid[0][0], 1);
1751 assert_eq!(grid[0][1], 2);
1752 assert_eq!(grid[0][2], 3);
1753 assert_eq!(grid[1][0], 4);
1754 assert_eq!(grid[1][1], 5);
1755 assert_eq!(grid[1][2], 6);
1756 }
1757
1758 #[test]
1759 fn macro_init_2() {
1760 let grid = grid![[1, 2, 3]
1761 [4, 5, 6]
1762 [7, 8, 9]];
1763 assert_eq!(grid.size(), (3, 3))
1764 }
1765
1766 #[test]
1767 fn macro_init_char() {
1768 let grid = grid![['a', 'b', 'c']
1769 ['a', 'b', 'c']
1770 ['a', 'b', 'c']];
1771 assert_eq!(grid.size(), (3, 3));
1772 assert_eq!(grid[1][1], 'b');
1773 }
1774
1775 #[test]
1776 fn macro_one_row() {
1777 let grid: Grid<usize> = grid![[1, 2, 3, 4]];
1778 assert_eq!(grid.size(), (1, 4));
1779 assert_eq!(grid[0][0], 1);
1780 assert_eq!(grid[0][1], 2);
1781 assert_eq!(grid[0][2], 3);
1782 }
1783
1784 #[test]
1785 #[should_panic]
1786 fn from_vec_panics_1() {
1787 let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 0);
1788 }
1789
1790 #[test]
1791 #[should_panic]
1792 fn from_vec_panics_2() {
1793 let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 2);
1794 }
1795
1796 #[test]
1797 fn from_vec_uses_original_vec() {
1798 let capacity = 10_000_000;
1799 let vec = Vec::with_capacity(capacity);
1800 let grid: Grid<u8> = Grid::from_vec(vec, 0);
1801 assert!(grid.into_vec().capacity() >= capacity);
1802 }
1803
1804 #[test]
1805 fn init() {
1806 Grid::init(1, 2, 3);
1807 Grid::init(1, 2, 1.2);
1808 Grid::init(1, 2, 'a');
1809 }
1810
1811 #[test]
1812 fn init_empty() {
1813 let grid = Grid::init(0, 1, 0);
1814 assert!(grid.is_empty());
1815 assert_eq!(grid.cols(), 0);
1816 assert_eq!(grid.rows(), 0);
1817 }
1818
1819 #[test]
1820 fn new() {
1821 let grid: Grid<u8> = Grid::new(1, 2);
1822 assert_eq!(grid[0][0], 0);
1823 }
1824
1825 #[test]
1826 #[should_panic]
1827 fn new_panics() {
1828 let _: Grid<u8> = Grid::new(usize::MAX, 2);
1829 }
1830
1831 #[test]
1832 fn new_empty() {
1833 let grid: Grid<u8> = Grid::new(0, 1);
1834 assert!(grid.is_empty());
1835 assert_eq!(grid.cols(), 0);
1836 assert_eq!(grid.rows(), 0);
1837 }
1838
1839 #[test]
1840 #[should_panic]
1841 fn init_panics() {
1842 Grid::init(usize::MAX, 2, 3);
1843 }
1844
1845 #[test]
1846 fn get() {
1847 let grid = Grid::init(1, 2, 3);
1848 assert_eq!(grid.get(0, 0), Some(&3));
1849 }
1850 #[test]
1851 fn get_none() {
1852 let grid = Grid::init(1, 2, 3);
1853 assert_eq!(grid.get(1, 0), None);
1854 }
1855
1856 #[test]
1857 fn get_mut() {
1858 let mut grid = Grid::init(1, 2, 3);
1859 let mut_ref = grid.get_mut(0, 0).unwrap();
1860 *mut_ref = 5;
1861 assert_eq!(grid[0][0], 5);
1862 }
1863
1864 #[test]
1865 fn get_mut_none() {
1866 let mut grid = Grid::init(1, 2, 3);
1867 let mut_ref = grid.get_mut(1, 4);
1868 assert_eq!(mut_ref, None);
1869 }
1870
1871 #[test]
1872 fn idx() {
1873 let grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1874 assert_eq!(grid[0][0], 1);
1875 assert_eq!(grid[0][1], 2);
1876 assert_eq!(grid[1][0], 3);
1877 assert_eq!(grid[1][1], 4);
1878 }
1879
1880 #[test]
1881 fn idx_tup() {
1882 let grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1883 assert_eq!(grid[(0, 0)], 1);
1884 assert_eq!(grid[(0, 1)], 2);
1885 assert_eq!(grid[(1, 0)], 3);
1886 assert_eq!(grid[(1, 1)], 4);
1887 }
1888
1889 #[test]
1890 #[should_panic]
1891 fn idx_panic_1() {
1892 let grid = Grid::init(1, 2, 3);
1893 let _ = grid[20][0];
1894 }
1895
1896 #[test]
1897 #[should_panic]
1898 fn idx_tup_panic_1() {
1899 let grid = Grid::init(1, 2, 3);
1900 let _ = grid[(20, 0)];
1901 }
1902
1903 #[test]
1904 #[should_panic]
1905 fn idx_panic_2() {
1906 let grid = Grid::init(1, 2, 3);
1907 let _ = grid[0][20];
1908 }
1909
1910 #[test]
1911 #[should_panic]
1912 fn idx_tup_panic_2() {
1913 let grid = Grid::init(1, 2, 3);
1914 let _ = grid[(0, 20)];
1915 }
1916
1917 #[test]
1918 fn idx_set() {
1919 let mut grid = Grid::init(1, 2, 3);
1920 grid[0][0] = 4;
1921 assert_eq!(grid[0][0], 4);
1922 }
1923
1924 #[test]
1925 fn idx_tup_set() {
1926 let mut grid = Grid::init(1, 2, 3);
1927 grid[(0, 0)] = 4;
1928 assert_eq!(grid[(0, 0)], 4);
1929 }
1930
1931 #[test]
1932 fn size() {
1933 let grid = Grid::init(1, 2, 3);
1934 assert_eq!(grid.size(), (1, 2));
1935 }
1936
1937 #[test]
1938 fn transpose() {
1939 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
1940 assert_eq!(format!("{:?}", grid.transpose()), "[[1, 4][2, 5][3, 6]]");
1941 }
1942
1943 #[test]
1944 fn fill() {
1945 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
1946 grid.fill(7);
1947 assert_eq!(grid[0], [7, 7, 7]);
1948 assert_eq!(grid[1], [7, 7, 7]);
1949 }
1950
1951 #[test]
1952 fn fill_with() {
1953 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
1954 grid.fill_with(Default::default);
1955 assert_eq!(grid[0], [0, 0, 0]);
1956 assert_eq!(grid[1], [0, 0, 0]);
1957 }
1958
1959 #[test]
1960 fn iter_rows() {
1961 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
1962 let max_by_row: Vec<u8> = grid
1963 .iter_rows()
1964 .map(|row| row.max().unwrap())
1965 .copied()
1966 .collect();
1967 assert_eq!(max_by_row, vec![3, 6]);
1968
1969 let sum_by_row: Vec<u8> = grid.iter_rows().map(|row| row.sum()).collect();
1970 assert_eq!(sum_by_row, vec![1 + 2 + 3, 4 + 5 + 6]);
1971 }
1972
1973 #[test]
1974 fn iter_cols() {
1975 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
1976 let max_by_col: Vec<u8> = grid
1977 .iter_cols()
1978 .map(|col| col.max().unwrap())
1979 .copied()
1980 .collect();
1981
1982 assert_eq!(max_by_col, vec![4, 5, 6]);
1983
1984 let sum_by_col: Vec<u8> = grid.iter_cols().map(|col| col.sum()).collect();
1985 assert_eq!(sum_by_col, vec![1 + 4, 2 + 5, 3 + 6]);
1986 }
1987 #[test]
1988 fn remove_col() {
1989 let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
1990 assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])];
1991 assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])];
1992 assert_eq![grid.remove_col(1), Some(vec![3, 7, 11, 15])];
1993 assert_eq![grid.remove_col(0), Some(vec![2, 6, 10, 14])];
1994 assert_eq![grid.remove_col(0), None];
1995 }
1996 #[test]
1997 fn remove_row() {
1998 let mut grid = grid![[1,2][3,4][5,6]];
1999 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
2000 assert_eq![grid.remove_row(0), Some(vec![1, 2])];
2001 assert_eq![grid.remove_row(0), Some(vec![5, 6])];
2002 assert_eq![grid.remove_row(0), None];
2003 }
2004 #[test]
2005 fn remove_row_out_of_bound() {
2006 let mut grid = grid![[1, 2][3, 4]];
2007 assert_eq![grid.remove_row(5), None];
2008 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
2009 }
2010 #[test]
2011 fn remove_col_out_of_bound() {
2012 let mut grid = grid![[1, 2][3, 4]];
2013 assert_eq!(grid.remove_col(5), None);
2014 assert_eq!(grid.remove_col(1), Some(vec![2, 4]));
2015 }
2016
2017 #[cfg(feature = "serde")]
2018 mod serde_tests {
2019 use super::*;
2020
2021 #[test]
2022 fn serialize() {
2023 let grid: Grid<u8> = grid![[1, 2][3, 4]];
2024 let s = serde_json::to_string(&grid).unwrap();
2025 println!("{s}");
2026 }
2027
2028 #[test]
2029 fn deserialize() {
2030 let s = "{ \"cols\": 2, \"data\": [1, 2, 3, 4] }";
2031 let grid: Grid<u8> = serde_json::from_str(&s).unwrap();
2032 assert_eq!(grid, grid![[1, 2][3, 4]]);
2033 }
2034 }
2035}