1#[cfg(feature = "serde")]
43use serde::{
44 de::{self, Deserialize, Deserializer, MapAccess, SeqAccess, Visitor},
45 ser::{Serialize, SerializeStruct, Serializer},
46};
47
48#[cfg(feature = "bevy_reflect")]
49use bevy_reflect::Reflect;
50
51
52use core::cmp::Eq;
53use core::fmt;
54use core::hash;
55use core::iter::StepBy;
56use core::ops::Index;
57use core::ops::IndexMut;
58use core::slice::Iter;
59use core::slice::IterMut;
60use core::{cmp, convert::TryInto};
61
62#[doc(hidden)]
63#[macro_export]
64macro_rules! count {
65 () => (0usize);
66 ( $x:tt $($xs:tt)* ) => (1usize + $crate::count!($($xs)*));
67}
68
69#[macro_export]
95macro_rules! grid {
96 () => {
97 $crate::Grid::from_vec(vec![], 0)
98 };
99 ( [$( $x:expr ),* ]) => { {
100 let vec = vec![$($x),*];
101 let len = vec.len();
102 $crate::Grid::from_vec(vec, len)
103 } };
104 ( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => {
105 {
106 let mut _assert_width0 = [(); $crate::count!($($x0)*)];
107 let cols = $crate::count!($($x0)*);
108 let rows = 1usize;
109
110 $(
111 let _assert_width = [(); $crate::count!($($x)*)];
112 _assert_width0 = _assert_width;
113 let rows = rows + 1usize;
114 )*
115
116 let mut vec = Vec::with_capacity(rows.checked_mul(cols).unwrap());
117
118 $( vec.push($x0); )*
119 $( $( vec.push($x); )* )*
120
121 $crate::grid::Grid::from_vec(vec, cols)
122 }
123 };
124}
125
126#[macro_export]
152macro_rules! grid_cm {
153 () => {
154 $crate::grid::Grid::from_vec_with_order(vec![], 0, $crate::grid::Order::ColumnMajor)
155 };
156 ( [$( $x:expr ),* ]) => { {
157 let vec = vec![$($x),*];
158 let len = vec.len();
159 $crate::Grid::from_vec_with_order(vec, len, $crate::grid::Order::ColumnMajor)
160 } };
161 ( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => {
162 {
163 let mut _assert_width0 = [(); $crate::count!($($x0)*)];
164 let cols = $crate::count!($($x0)*);
165 let rows = 1usize;
166
167 $(
168 let _assert_width = [(); $crate::count!($($x)*)];
169 _assert_width0 = _assert_width;
170 let rows = rows + 1usize;
171 )*
172
173 let vec = Vec::with_capacity(rows.checked_mul(cols).unwrap());
174 let mut grid = $crate::Grid::from_vec_with_order(vec, cols, $crate::grid::Order::ColumnMajor);
175
176 grid.push_row(vec![$($x0),*]);
177 $( grid.push_row(vec![$($x),*]); )*
178
179 grid
180 }
181 };
182}
183
184pub use grid;
185pub use grid_cm;
186
187#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
189#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
190#[cfg_attr(feature = "bevy_reflect", derive(Reflect))]
191pub enum Order {
192 #[default]
194 RowMajor,
195
196 ColumnMajor,
198}
199
200impl Order {
201 fn counterpart(self) -> Self {
202 match self {
203 Self::RowMajor => Self::ColumnMajor,
204 Self::ColumnMajor => Self::RowMajor,
205 }
206 }
207}
208
209#[cfg_attr(feature = "bevy_reflect", derive(Reflect))]
217pub struct Grid<T> {
218 data: Vec<T>,
219 cols: usize,
220 rows: usize,
221 order: Order,
222}
223
224#[cfg(feature = "serde")]
225impl<'de, T: Deserialize<'de>> Deserialize<'de> for Grid<T> {
226 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
227 where
228 D: Deserializer<'de>,
229 {
230 use std::marker::PhantomData;
231 #[derive(serde::Deserialize)]
232 #[serde(field_identifier, rename_all = "lowercase")]
233 enum Field {
234 Data,
235 Cols,
236 Order,
237 }
238
239 struct GridVisitor<T> {
240 _p: PhantomData<T>,
241 }
242
243 impl<'de, T: Deserialize<'de>> Visitor<'de> for GridVisitor<T> {
244 type Value = Grid<T>;
245
246 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
247 formatter.write_str("struct Grid")
248 }
249
250 fn visit_seq<V>(self, mut seq: V) -> Result<Grid<T>, V::Error>
251 where
252 V: SeqAccess<'de>,
253 {
254 let cols = seq
255 .next_element()?
256 .ok_or_else(|| de::Error::invalid_length(0, &self))?;
257 let data = seq
258 .next_element()?
259 .ok_or_else(|| de::Error::invalid_length(1, &self))?;
260 let order = seq.next_element()?.unwrap_or_default();
261 Ok(Grid::from_vec_with_order(data, cols, order))
262 }
263
264 fn visit_map<V>(self, mut map: V) -> Result<Grid<T>, V::Error>
265 where
266 V: MapAccess<'de>,
267 {
268 let mut cols = None;
269 let mut data = None;
270 let mut order = None;
271 while let Some(key) = map.next_key()? {
272 match key {
273 Field::Data => {
274 if data.is_some() {
275 return Err(de::Error::duplicate_field("data"));
276 }
277 data = Some(map.next_value()?);
278 }
279 Field::Cols => {
280 if cols.is_some() {
281 return Err(de::Error::duplicate_field("cols"));
282 }
283 cols = Some(map.next_value()?);
284 }
285 Field::Order => {
286 if order.is_some() {
287 return Err(de::Error::duplicate_field("order"));
288 }
289 order = Some(map.next_value()?);
290 }
291 }
292 }
293 let cols = cols.ok_or_else(|| de::Error::missing_field("cols"))?;
294 let data = data.ok_or_else(|| de::Error::missing_field("data"))?;
295 let order = order.unwrap_or_default();
296 Ok(Grid::from_vec_with_order(data, cols, order))
297 }
298 }
299
300 const FIELDS: &'static [&'static str] = &["cols", "data", "order"];
301 deserializer.deserialize_struct("Grid", FIELDS, GridVisitor { _p: PhantomData })
302 }
303}
304
305#[cfg(feature = "serde")]
306impl<T: Serialize> Serialize for Grid<T> {
307 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
308 where
309 S: Serializer,
310 {
311 let mut state = serializer.serialize_struct("Grid", 3)?;
313 state.serialize_field("cols", &self.cols)?;
314 state.serialize_field("data", &self.data)?;
315 state.serialize_field("order", &self.order)?;
316 state.end()
317 }
318}
319
320impl<T> Grid<T> {
321 #[must_use]
339 #[inline]
340 pub fn new(rows: usize, cols: usize) -> Self
341 where
342 T: Default,
343 {
344 Self::new_with_order(rows, cols, Order::default())
345 }
346
347 pub fn new_with_order(rows: usize, cols: usize, order: Order) -> Self
353 where
354 T: Default,
355 {
356 if rows == 0 || cols == 0 {
357 return Self {
358 data: Vec::new(),
359 rows: 0,
360 cols: 0,
361 order,
362 };
363 }
364 let mut data = Vec::new();
365 data.resize_with(rows.checked_mul(cols).unwrap(), T::default);
366 Self {
367 data,
368 cols,
369 rows,
370 order,
371 }
372 }
373
374 #[inline]
385 pub fn init(rows: usize, cols: usize, data: T) -> Self
386 where
387 T: Clone,
388 {
389 Self::init_with_order(rows, cols, Order::default(), data)
390 }
391
392 pub fn init_with_order(rows: usize, cols: usize, order: Order, data: T) -> Self
398 where
399 T: Clone,
400 {
401 if rows == 0 || cols == 0 {
402 return Self {
403 data: Vec::new(),
404 rows: 0,
405 cols: 0,
406 order,
407 };
408 }
409 Self {
410 data: vec![data; rows.checked_mul(cols).unwrap()],
411 cols,
412 rows,
413 order,
414 }
415 }
416
417 #[must_use]
446 #[inline]
447 pub fn from_vec(vec: Vec<T>, cols: usize) -> Self {
448 Self::from_vec_with_order(vec, cols, Order::default())
449 }
450
451 #[must_use]
457 pub fn from_vec_with_order(vec: Vec<T>, cols: usize, order: Order) -> Self {
458 let rows = vec.len().checked_div(cols).unwrap_or(0);
459 assert_eq!(
460 rows * cols,
461 vec.len(),
462 "Vector length {:?} should be a multiple of cols = {:?}",
463 vec.len(),
464 cols
465 );
466 if rows == 0 || cols == 0 {
467 Grid {
468 data: vec,
469 rows: 0,
470 cols: 0,
471 order,
472 }
473 } else {
474 Grid {
475 data: vec,
476 rows,
477 cols,
478 order,
479 }
480 }
481 }
482
483 #[inline]
485 #[must_use]
486 fn get_index(&self, row: usize, col: usize) -> usize {
487 match self.order {
488 Order::RowMajor => row * self.cols + col,
489 Order::ColumnMajor => col * self.rows + row,
490 }
491 }
492
493 #[inline]
500 #[must_use]
501 pub unsafe fn get_unchecked(&self, row: impl Into<usize>, col: impl Into<usize>) -> &T {
502 let index = self.get_index(row.into(), col.into());
503 self.data.get_unchecked(index)
504 }
505
506 #[inline]
513 #[must_use]
514 pub unsafe fn get_unchecked_mut(
515 &mut self,
516 row: impl Into<usize>,
517 col: impl Into<usize>,
518 ) -> &mut T {
519 let index = self.get_index(row.into(), col.into());
520 self.data.get_unchecked_mut(index)
521 }
522
523 #[must_use]
526 pub fn get(&self, row: impl TryInto<usize>, col: impl TryInto<usize>) -> Option<&T> {
527 let row_usize = row.try_into().ok()?;
528 let col_usize = col.try_into().ok()?;
529 if row_usize < self.rows && col_usize < self.cols {
530 unsafe { Some(self.get_unchecked(row_usize, col_usize)) }
531 } else {
532 None
533 }
534 }
535
536 #[must_use]
539 pub fn get_mut(
540 &mut self,
541 row: impl TryInto<usize>,
542 col: impl TryInto<usize>,
543 ) -> Option<&mut T> {
544 let row_usize = row.try_into().ok()?;
545 let col_usize = col.try_into().ok()?;
546 if row_usize < self.rows && col_usize < self.cols {
547 unsafe { Some(self.get_unchecked_mut(row_usize, col_usize)) }
548 } else {
549 None
550 }
551 }
552
553 #[must_use]
556 pub fn size(&self) -> (usize, usize) {
557 (self.rows, self.cols)
558 }
559
560 #[must_use]
562 pub fn rows(&self) -> usize {
563 self.rows
564 }
565
566 #[must_use]
568 pub fn cols(&self) -> usize {
569 self.cols
570 }
571
572 #[must_use]
574 pub fn order(&self) -> Order {
575 self.order
576 }
577
578 #[must_use]
586 pub fn is_empty(&self) -> bool {
587 self.data.is_empty()
588 }
589
590 pub fn clear(&mut self) {
594 self.rows = 0;
595 self.cols = 0;
596 self.data.clear();
597 }
598
599 pub fn iter(&self) -> Iter<T> {
616 self.data.iter()
617 }
618
619 pub fn iter_mut(&mut self) -> IterMut<T> {
632 self.data.iter_mut()
633 }
634
635 pub fn iter_col(&self, col: usize) -> StepBy<Iter<T>> {
657 assert!(
658 col < self.cols,
659 "out of bounds. Column must be less than {:?}, but is {:?}",
660 self.cols,
661 col
662 );
663 match self.order {
664 Order::RowMajor => self.data[col..].iter().step_by(self.cols),
665 Order::ColumnMajor => {
666 let start = col * self.rows;
667 self.data[start..(start + self.rows)].iter().step_by(1)
668 }
669 }
670 }
671
672 pub fn iter_col_mut(&mut self, col: usize) -> StepBy<IterMut<T>> {
695 assert!(
696 col < self.cols,
697 "out of bounds. Column must be less than {:?}, but is {:?}",
698 self.cols,
699 col
700 );
701 match self.order {
702 Order::RowMajor => self.data[col..].iter_mut().step_by(self.cols),
703 Order::ColumnMajor => {
704 let start = col * self.rows;
705 self.data[start..(start + self.rows)].iter_mut().step_by(1)
706 }
707 }
708 }
709
710 pub fn iter_row(&self, row: usize) -> StepBy<Iter<T>> {
732 assert!(
733 row < self.rows,
734 "out of bounds. Row must be less than {:?}, but is {:?}",
735 self.rows,
736 row
737 );
738 match self.order {
739 Order::RowMajor => {
740 let start = row * self.cols;
741 self.data[start..(start + self.cols)].iter().step_by(1)
742 }
743 Order::ColumnMajor => self.data[row..].iter().step_by(self.rows),
744 }
745 }
746
747 pub fn iter_row_mut(&mut self, row: usize) -> StepBy<IterMut<T>> {
768 assert!(
769 row < self.rows,
770 "out of bounds. Row must be less than {:?}, but is {:?}",
771 self.rows,
772 row
773 );
774 match self.order {
775 Order::RowMajor => {
776 let start = row * self.cols;
777 self.data[start..(start + self.cols)].iter_mut().step_by(1)
778 }
779 Order::ColumnMajor => self.data[row..].iter_mut().step_by(self.rows),
780 }
781 }
782
783 pub fn indexed_iter(&self) -> impl Iterator<Item = ((usize, usize), &T)> {
807 self.data.iter().enumerate().map(move |(idx, i)| {
808 let position = match self.order {
809 Order::RowMajor => (idx / self.cols, idx % self.cols),
810 Order::ColumnMajor => (idx % self.rows, idx / self.rows),
811 };
812 (position, i)
813 })
814 }
815
816 pub fn indexed_iter_mut(&mut self) -> impl Iterator<Item = ((usize, usize), &mut T)> {
847 let order = self.order;
848 let cols = self.cols;
849 let rows = self.rows;
850
851 self.data.iter_mut().enumerate().map(move |(idx, i)| {
852 let position = match order {
853 Order::RowMajor => (idx / cols, idx % cols),
854 Order::ColumnMajor => (idx % rows, idx / rows),
855 };
856 (position, i)
857 })
858 }
859
860 pub fn into_iter_indexed(self) -> impl Iterator<Item = ((usize, usize), T)> {
862 let order = self.order();
863 let cols = self.cols();
864 let rows = self.rows();
865
866 self.into_vec()
867 .into_iter()
868 .enumerate()
869 .map(move |(idx, i)| {
870 let position = match order {
871 Order::RowMajor => (idx / cols, idx % cols),
872 Order::ColumnMajor => (idx % rows, idx / rows),
873 };
874 (position, i)
875 })
876 }
877
878 pub fn push_row(&mut self, row: Vec<T>) {
913 assert_ne!(row.len(), 0);
914 assert!(
915 !(self.rows > 0 && row.len() != self.cols),
916 "pushed row does not match. Length must be {:?}, but was {:?}.",
917 self.cols,
918 row.len()
919 );
920 self.data.extend(row);
921 if self.order == Order::ColumnMajor {
922 for i in (1..self.cols).rev() {
923 let col_idx = i * self.rows;
924 self.data[col_idx..col_idx + self.rows + i].rotate_right(i);
925 }
926 }
927 self.rows += 1;
928 if self.cols == 0 {
929 self.cols = self.data.len();
930 }
931 }
932
933 pub fn push_col(&mut self, col: Vec<T>) {
968 assert_ne!(col.len(), 0);
969 assert!(
970 !(self.cols > 0 && col.len() != self.rows),
971 "pushed column does not match. Length must be {:?}, but was {:?}.",
972 self.rows,
973 col.len()
974 );
975 self.data.extend(col);
976 if self.order == Order::RowMajor {
977 for i in (1..self.rows).rev() {
978 let row_idx = i * self.cols;
979 self.data[row_idx..row_idx + self.cols + i].rotate_right(i);
980 }
981 }
982 self.cols += 1;
983 if self.rows == 0 {
984 self.rows = self.data.len();
985 }
986 }
987
988 pub fn pop_row(&mut self) -> Option<Vec<T>> {
1003 if self.rows == 0 {
1004 return None;
1005 }
1006 if self.order == Order::ColumnMajor {
1007 for i in 1..self.cols {
1008 let col_idx = i * (self.rows - 1);
1009 self.data[col_idx..col_idx + self.rows + i - 1].rotate_left(i);
1010 }
1011 }
1012 let row = self.data.split_off(self.data.len() - self.cols);
1013 self.rows -= 1;
1014 if self.rows == 0 {
1015 self.cols = 0;
1016 }
1017 Some(row)
1018 }
1019
1020 pub fn remove_row(&mut self, row_index: usize) -> Option<Vec<T>> {
1036 if self.cols == 0 || self.rows == 0 || row_index >= self.rows {
1037 return None;
1038 }
1039 let row = match self.order {
1040 Order::RowMajor => self
1041 .data
1042 .drain((row_index * self.cols)..((row_index + 1) * self.cols))
1043 .collect(),
1044 Order::ColumnMajor => {
1045 for i in 0..self.cols {
1046 let col_idx = row_index + i * (self.rows - 1);
1047 let end = cmp::min(col_idx + self.rows + i, self.data.len());
1048 self.data[col_idx..end].rotate_left(i + 1);
1049 }
1050 self.data.split_off(self.data.len() - self.cols)
1051 }
1052 };
1053 self.rows -= 1;
1054 if self.rows == 0 {
1055 self.cols = 0;
1056 }
1057 Some(row)
1058 }
1059
1060 pub fn pop_col(&mut self) -> Option<Vec<T>> {
1080 if self.cols == 0 {
1081 return None;
1082 }
1083 if self.order == Order::RowMajor {
1084 for i in 1..self.rows {
1085 let row_idx = i * (self.cols - 1);
1086 self.data[row_idx..row_idx + self.cols + i - 1].rotate_left(i);
1087 }
1088 }
1089 let col = self.data.split_off(self.data.len() - self.rows);
1090 self.cols -= 1;
1091 if self.cols == 0 {
1092 self.rows = 0;
1093 }
1094 Some(col)
1095 }
1096
1097 pub fn remove_col(&mut self, col_index: usize) -> Option<Vec<T>> {
1115 if self.cols == 0 || self.rows == 0 || col_index >= self.cols {
1116 return None;
1117 }
1118 let col = match self.order {
1119 Order::RowMajor => {
1120 for i in 0..self.rows {
1121 let row_idx = col_index + i * (self.cols - 1);
1122 let end = cmp::min(row_idx + self.cols + i, self.data.len());
1123 self.data[row_idx..end].rotate_left(i + 1);
1124 }
1125 self.data.split_off(self.data.len() - self.rows)
1126 }
1127 Order::ColumnMajor => self
1128 .data
1129 .drain((col_index * self.rows)..((col_index + 1) * self.rows))
1130 .collect(),
1131 };
1132 self.cols -= 1;
1133 if self.cols == 0 {
1134 self.rows = 0;
1135 }
1136 Some(col)
1137 }
1138
1139 pub fn insert_row(&mut self, index: usize, row: Vec<T>) {
1159 let input_len = row.len();
1160 assert!(
1161 !(self.cols > 0 && input_len != self.cols),
1162 "Inserted row must be of length {}, but was {}.",
1163 self.cols,
1164 row.len()
1165 );
1166 assert!(
1167 index <= self.rows,
1168 "Out of range. Index was {}, but must be less or equal to {}.",
1169 index,
1170 self.rows
1171 );
1172 match self.order {
1173 Order::RowMajor => {
1174 let data_idx = index * input_len;
1175 self.data.splice(data_idx..data_idx, row);
1176 }
1177 Order::ColumnMajor => {
1178 for (col_iter, row_val) in row.into_iter().enumerate() {
1179 let data_idx = col_iter * self.rows + index + col_iter;
1180 self.data.insert(data_idx, row_val);
1181 }
1182 }
1183 }
1184 self.cols = input_len;
1185 self.rows += 1;
1186 }
1187
1188 pub fn insert_col(&mut self, index: usize, col: Vec<T>) {
1212 let input_len = col.len();
1213 assert!(
1214 !(self.rows > 0 && input_len != self.rows),
1215 "Inserted col must be of length {}, but was {}.",
1216 self.rows,
1217 col.len()
1218 );
1219 assert!(
1220 index <= self.cols,
1221 "Out of range. Index was {}, but must be less or equal to {}.",
1222 index,
1223 self.cols
1224 );
1225 match self.order {
1226 Order::RowMajor => {
1227 for (row_iter, col_val) in col.into_iter().enumerate() {
1228 let data_idx = row_iter * self.cols + index + row_iter;
1229 self.data.insert(data_idx, col_val);
1230 }
1231 }
1232 Order::ColumnMajor => {
1233 let data_idx = index * input_len;
1234 self.data.splice(data_idx..data_idx, col);
1235 }
1236 }
1237 self.rows = input_len;
1238 self.cols += 1;
1239 }
1240
1241 #[must_use]
1254 pub fn flatten(&self) -> &Vec<T> {
1255 &self.data
1256 }
1257
1258 #[must_use]
1263 pub fn into_vec(self) -> Vec<T> {
1264 self.data
1265 }
1266
1267 pub fn transpose(&mut self) {
1271 self.order = self.order.counterpart();
1272 core::mem::swap(&mut self.rows, &mut self.cols);
1273 }
1274
1275 pub fn flip_cols(&mut self) {
1290 match self.order {
1291 Order::RowMajor => {
1292 for row in 0..self.rows {
1293 let idx = row * self.cols;
1294 self.data[idx..idx + self.cols].reverse();
1295 }
1296 }
1297 Order::ColumnMajor => {
1298 for col in 0..self.cols / 2 {
1299 for row in 0..self.rows {
1300 let cell1 = self.get_index(row, col);
1301 let cell2 = self.get_index(row, self.cols - col - 1);
1302 self.data.swap(cell1, cell2);
1303 }
1304 }
1305 }
1306 }
1307 }
1308
1309 pub fn flip_rows(&mut self) {
1325 match self.order {
1326 Order::RowMajor => {
1327 for row in 0..self.rows / 2 {
1328 for col in 0..self.cols {
1329 let cell1 = self.get_index(row, col);
1330 let cell2 = self.get_index(self.rows - row - 1, col);
1331 self.data.swap(cell1, cell2);
1332 }
1333 }
1334 }
1335 Order::ColumnMajor => {
1336 for col in 0..self.cols {
1337 let idx = col * self.rows;
1338 self.data[idx..idx + self.rows].reverse();
1339 }
1340 }
1341 }
1342 }
1343
1344 pub fn rotate_left(&mut self) {
1362 self.transpose();
1363 self.flip_rows();
1364 }
1365
1366 pub fn rotate_right(&mut self) {
1384 self.transpose();
1385 self.flip_cols();
1386 }
1387
1388 pub fn rotate_half(&mut self) {
1405 self.data.reverse();
1406 }
1407
1408 pub fn fill(&mut self, value: T)
1419 where
1420 T: Clone,
1421 {
1422 self.data.fill(value);
1423 }
1424
1425 pub fn fill_with<F>(&mut self, f: F)
1443 where
1444 F: FnMut() -> T,
1445 {
1446 self.data.fill_with(f);
1447 }
1448
1449 #[must_use]
1464 pub fn iter_rows(&self) -> GridRowIter<'_, T> {
1465 GridRowIter {
1466 grid: self,
1467 row_start_index: 0,
1468 row_end_index: self.rows,
1469 }
1470 }
1471
1472 #[must_use]
1487 pub fn iter_cols(&self) -> GridColIter<'_, T> {
1488 GridColIter {
1489 grid: self,
1490 col_start_index: 0,
1491 col_end_index: self.cols,
1492 }
1493 }
1494}
1495
1496impl<T> Default for Grid<T> {
1497 fn default() -> Self {
1498 Self {
1499 data: Vec::default(),
1500 cols: 0,
1501 rows: 0,
1502 order: Order::default(),
1503 }
1504 }
1505}
1506
1507impl<T: Clone> Clone for Grid<T> {
1508 fn clone(&self) -> Self {
1509 Grid {
1510 rows: self.rows,
1511 cols: self.cols,
1512 data: self.data.clone(),
1513 order: self.order,
1514 }
1515 }
1516}
1517
1518impl<T: hash::Hash> hash::Hash for Grid<T> {
1519 #[inline]
1520 fn hash<H: hash::Hasher>(&self, state: &mut H) {
1521 self.rows.hash(state);
1522 self.cols.hash(state);
1523 self.order.hash(state);
1524 self.data.hash(state);
1525 }
1526}
1527
1528impl<T> Index<(usize, usize)> for Grid<T> {
1529 type Output = T;
1530
1531 #[inline]
1532 fn index(&self, (row, col): (usize, usize)) -> &T {
1533 assert!(
1534 !(row >= self.rows || col >= self.cols),
1535 "grid index out of bounds: ({row},{col}) out of ({},{})",
1536 self.rows,
1537 self.cols
1538 );
1539 let index = self.get_index(row, col);
1540 &self.data[index]
1541 }
1542}
1543
1544impl<T> IndexMut<(usize, usize)> for Grid<T> {
1545 #[inline]
1546 fn index_mut(&mut self, (row, col): (usize, usize)) -> &mut T {
1547 assert!(
1548 !(row >= self.rows || col >= self.cols),
1549 "grid index out of bounds: ({row},{col}) out of ({},{})",
1550 self.rows,
1551 self.cols
1552 );
1553 let index = self.get_index(row, col);
1554 &mut self.data[index]
1555 }
1556}
1557
1558impl<T: fmt::Debug> fmt::Debug for Grid<T> {
1559 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1560 write!(f, "[")?;
1561 if self.cols > 0 {
1562 if f.alternate() {
1563 writeln!(f)?;
1564 let width = f.width().unwrap_or_else(|| {
1571 self.data
1573 .iter()
1574 .map(|i| format!("{i:?}").len())
1575 .max()
1576 .unwrap()
1577 });
1578 let precision = f.precision().unwrap_or(2);
1579 for mut row in self.iter_rows().map(Iterator::peekable) {
1580 write!(f, " [")?;
1581 while let Some(item) = row.next() {
1582 write!(f, " {item:width$.precision$?}")?;
1583 if row.peek().is_some() {
1584 write!(f, ",")?;
1585 }
1586 }
1587 writeln!(f, "]")?;
1588 }
1589 } else {
1590 for row in self.iter_rows() {
1591 f.debug_list().entries(row).finish()?;
1592 }
1593 }
1594 }
1595 write!(f, "]")
1596 }
1597}
1598
1599impl<T: PartialEq> PartialEq for Grid<T> {
1600 fn eq(&self, other: &Self) -> bool {
1601 if self.rows != other.rows || self.cols != other.cols {
1602 return false;
1603 }
1604 if self.order == other.order {
1605 return self.data == other.data;
1606 }
1607 for (self_row, other_row) in core::iter::zip(self.iter_rows(), other.iter_rows()) {
1608 if self_row.ne(other_row) {
1609 return false;
1610 }
1611 }
1612 true
1613 }
1614}
1615
1616impl<T: Eq> Eq for Grid<T> {}
1617
1618impl<T> From<Vec<Vec<T>>> for Grid<T> {
1619 #[allow(clippy::redundant_closure_for_method_calls)]
1620 fn from(vec: Vec<Vec<T>>) -> Self {
1621 let cols = vec.first().map_or(0, |row| row.len());
1622 Self::from_vec_with_order(vec.into_iter().flatten().collect(), cols, Order::default())
1623 }
1624}
1625
1626impl<T: Clone> From<&Vec<Vec<T>>> for Grid<T> {
1627 #[allow(clippy::redundant_closure_for_method_calls)]
1628 fn from(vec: &Vec<Vec<T>>) -> Self {
1629 let cols = vec.first().map_or(0, |row| row.len());
1630 Self::from_vec_with_order(
1631 vec.clone().into_iter().flatten().collect(),
1632 cols,
1633 Order::default(),
1634 )
1635 }
1636}
1637
1638impl<T: Clone> From<&Vec<&Vec<T>>> for Grid<T> {
1639 #[allow(clippy::redundant_closure_for_method_calls)]
1640 fn from(vec: &Vec<&Vec<T>>) -> Self {
1641 let cols = vec.first().map_or(0, |row| row.len());
1642 Self::from_vec_with_order(
1643 vec.clone()
1644 .into_iter()
1645 .flat_map(|inner| inner.clone())
1646 .collect(),
1647 cols,
1648 Order::default(),
1649 )
1650 }
1651}
1652
1653impl<T> From<(Vec<T>, usize)> for Grid<T> {
1654 fn from(value: (Vec<T>, usize)) -> Self {
1655 Self::from_vec_with_order(value.0, value.1, Order::default())
1656 }
1657}
1658
1659impl<T: Clone> From<(&Vec<T>, usize)> for Grid<T> {
1660 fn from(value: (&Vec<T>, usize)) -> Self {
1661 Self::from_vec_with_order(value.0.clone(), value.1, Order::default())
1662 }
1663}
1664
1665impl<T: Clone> From<(&Vec<T>, &usize)> for Grid<T> {
1666 fn from(value: (&Vec<T>, &usize)) -> Self {
1667 Self::from_vec_with_order(value.0.clone(), *value.1, Order::default())
1668 }
1669}
1670
1671#[derive(Clone)]
1673pub struct GridRowIter<'a, T> {
1674 grid: &'a Grid<T>,
1675 row_start_index: usize,
1676 row_end_index: usize,
1677}
1678
1679#[derive(Clone)]
1681pub struct GridColIter<'a, T> {
1682 grid: &'a Grid<T>,
1683 col_start_index: usize,
1684 col_end_index: usize,
1685}
1686
1687impl<'a, T> Iterator for GridRowIter<'a, T> {
1688 type Item = StepBy<Iter<'a, T>>;
1689
1690 fn next(&mut self) -> Option<Self::Item> {
1691 if self.row_start_index >= self.row_end_index {
1692 return None;
1693 }
1694
1695 let row_iter = self.grid.iter_row(self.row_start_index);
1696 self.row_start_index += 1;
1697 Some(row_iter)
1698 }
1699
1700 fn size_hint(&self) -> (usize, Option<usize>) {
1701 let size = self.row_end_index - self.row_start_index;
1702 (size, Some(size))
1703 }
1704}
1705
1706impl<'a, T> ExactSizeIterator for GridRowIter<'a, T> {}
1707
1708impl<'a, T> DoubleEndedIterator for GridRowIter<'a, T> {
1709 fn next_back(&mut self) -> Option<Self::Item> {
1710 if self.row_start_index >= self.row_end_index {
1711 return None;
1712 }
1713
1714 let row_iter = self.grid.iter_row(self.row_end_index - 1);
1715 self.row_end_index -= 1;
1716 Some(row_iter)
1717 }
1718}
1719
1720impl<'a, T> Iterator for GridColIter<'a, T> {
1721 type Item = StepBy<Iter<'a, T>>;
1722
1723 fn next(&mut self) -> Option<Self::Item> {
1724 if self.col_start_index >= self.col_end_index {
1725 return None;
1726 }
1727
1728 let col_iter = self.grid.iter_col(self.col_start_index);
1729 self.col_start_index += 1;
1730 Some(col_iter)
1731 }
1732
1733 fn size_hint(&self) -> (usize, Option<usize>) {
1734 let size = self.col_end_index - self.col_start_index;
1735 (size, Some(size))
1736 }
1737}
1738
1739impl<'a, T> ExactSizeIterator for GridColIter<'a, T> {}
1740
1741impl<'a, T> DoubleEndedIterator for GridColIter<'a, T> {
1742 fn next_back(&mut self) -> Option<Self::Item> {
1743 if self.col_start_index >= self.col_end_index {
1744 return None;
1745 }
1746
1747 let col_iter = self.grid.iter_col(self.col_end_index - 1);
1748 self.col_end_index -= 1;
1749 Some(col_iter)
1750 }
1751}
1752
1753#[cfg(test)]
1754mod test {
1755 use super::*;
1756
1757 fn test_grid<T>(grid: &Grid<T>, rows: usize, cols: usize, order: Order, data: &[T])
1758 where
1759 T: fmt::Debug + PartialEq,
1760 {
1761 assert_eq!(grid.rows, rows, "number of rows is unexpected");
1762 assert_eq!(grid.cols, cols, "number of cols is unexpected");
1763 assert_eq!(grid.order, order, "grid order is unexpected");
1764 assert_eq!(grid.data, data, "internal data is unexpected");
1765 }
1766
1767 #[test]
1768 fn from_1d_vec() {
1769 let grid: Grid<u8> = Grid::from((vec![1, 2, 3], 1));
1770 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
1771 }
1772
1773 #[test]
1774 #[should_panic]
1775 #[allow(clippy::should_panic_without_expect)]
1776 fn from_1d_vec_panic() {
1777 let _: Grid<u8> = Grid::from((vec![1, 2, 3], 2));
1778 }
1779
1780 #[test]
1781 fn from_1d_vec_reference() {
1782 let vec = vec![1, 2, 3];
1783 let grid: Grid<u8> = Grid::from((&vec, 1));
1784 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
1785 }
1786
1787 #[test]
1788 #[should_panic]
1789 #[allow(clippy::should_panic_without_expect)]
1790 fn from_1d_vec_reference_panic() {
1791 let vec = vec![1, 2, 3];
1792 let _: Grid<u8> = Grid::from((&vec, 2));
1793 }
1794
1795 #[test]
1796 fn from_1d_vec_reference_and_reference() {
1797 let vec = vec![1, 2, 3];
1798 let cols = 1;
1799 let grid: Grid<u8> = Grid::from((&vec, &cols));
1800 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
1801 }
1802
1803 #[test]
1804 #[should_panic]
1805 #[allow(clippy::should_panic_without_expect)]
1806 fn from_1d_vec_reference_and_reference_panic() {
1807 let vec = vec![1, 2, 3];
1808 let cols = 2;
1809 let _: Grid<u8> = Grid::from((&vec, &cols));
1810 }
1811
1812 #[test]
1813 fn from_2d_vec() {
1814 let grid: Grid<u8> = Grid::from(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]);
1815 test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
1816 }
1817
1818 #[test]
1819 #[should_panic]
1820 #[allow(clippy::should_panic_without_expect)]
1821 fn from_2d_vec_panic() {
1822 let _: Grid<u8> = Grid::from(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8]]);
1823 }
1824
1825 #[test]
1826 fn from_2d_vec_reference() {
1827 let vec = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
1828 let grid: Grid<u8> = Grid::from(&vec);
1829 test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
1830 }
1831
1832 #[test]
1833 #[should_panic]
1834 #[allow(clippy::should_panic_without_expect)]
1835 fn from_2d_vec_reference_panic() {
1836 let vec = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8]];
1837 let _: Grid<u8> = Grid::from(&vec);
1838 }
1839
1840 #[test]
1841 fn from_2d_vec_reference_of_references() {
1842 let inner_vec1 = vec![1, 2, 3];
1843 let inner_vec2 = vec![4, 5, 6];
1844 let inner_vec3 = vec![7, 8, 9];
1845 let vec = vec![&inner_vec1, &inner_vec2, &inner_vec3];
1846 let grid: Grid<u8> = Grid::from(&vec);
1847 test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
1848 }
1849
1850 #[test]
1851 #[should_panic]
1852 #[allow(clippy::should_panic_without_expect)]
1853 fn from_2d_vec_reference_of_references_panic() {
1854 let inner_vec1 = vec![1, 2, 3];
1855 let inner_vec2 = vec![4, 5, 6];
1856 let inner_vec3 = vec![7, 8];
1857 let vec = vec![&inner_vec1, &inner_vec2, &inner_vec3];
1858 let _: Grid<u8> = Grid::from(&vec);
1859 }
1860
1861 #[test]
1862 fn from_vec_zero_with_cols() {
1863 let grid: Grid<u8> = Grid::from_vec(vec![], 1);
1864 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
1865 }
1866
1867 #[test]
1868 fn from_vec_zero() {
1869 let grid: Grid<u8> = Grid::from_vec(vec![], 0);
1870 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
1871 }
1872
1873 #[test]
1874 #[should_panic]
1875 #[allow(clippy::should_panic_without_expect)]
1876 fn from_vec_panics_1() {
1877 let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 0);
1878 }
1879
1880 #[test]
1881 #[should_panic]
1882 #[allow(clippy::should_panic_without_expect)]
1883 fn from_vec_panics_2() {
1884 let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 2);
1885 }
1886
1887 #[test]
1888 fn from_vec_uses_original_vec() {
1889 let capacity = 10_000_000;
1890 let vec = Vec::with_capacity(capacity);
1891 let grid: Grid<u8> = Grid::from_vec(vec, 0);
1892 assert!(grid.into_vec().capacity() >= capacity);
1893 }
1894
1895 #[test]
1896 fn from_vec_with_order_zero_with_cols() {
1897 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 1, Order::ColumnMajor);
1898 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
1899 }
1900
1901 #[test]
1902 fn from_vec_with_order_zero() {
1903 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
1904 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
1905 }
1906
1907 #[test]
1908 #[should_panic]
1909 #[allow(clippy::should_panic_without_expect)]
1910 fn from_vec_with_order_panics_1() {
1911 let _: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 0, Order::ColumnMajor);
1912 }
1913
1914 #[test]
1915 #[should_panic]
1916 #[allow(clippy::should_panic_without_expect)]
1917 fn from_vec_with_order_panics_2() {
1918 let _: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 2, Order::ColumnMajor);
1919 }
1920
1921 #[test]
1922 fn from_vec_with_order_uses_original_vec() {
1923 let capacity = 10_000_000;
1924 let vec = Vec::with_capacity(capacity);
1925 let grid: Grid<u8> = Grid::from_vec_with_order(vec, 0, Order::ColumnMajor);
1926 assert!(grid.into_vec().capacity() >= capacity);
1927 }
1928
1929 #[test]
1930 fn insert_col_at_end() {
1931 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
1932 grid.insert_col(2, vec![5, 6]);
1933 test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 5, 3, 4, 6]);
1934 }
1935
1936 #[test]
1937 #[should_panic]
1938 #[allow(clippy::should_panic_without_expect)]
1939 fn insert_col_out_of_idx() {
1940 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
1941 grid.insert_col(3, vec![4, 5]);
1942 }
1943
1944 #[test]
1945 fn insert_col_empty() {
1946 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
1947 grid.insert_col(0, vec![1, 2, 3]);
1948 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
1949 }
1950
1951 #[test]
1952 fn insert_col_at_end_column_major() {
1953 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
1954 grid.insert_col(2, vec![5, 6]);
1955 test_grid(&grid, 2, 3, Order::ColumnMajor, &[1, 3, 2, 4, 5, 6]);
1956 }
1957
1958 #[test]
1959 #[should_panic]
1960 #[allow(clippy::should_panic_without_expect)]
1961 fn insert_col_out_of_idx_column_major() {
1962 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
1963 grid.insert_col(3, vec![4, 5]);
1964 }
1965
1966 #[test]
1967 fn insert_col_empty_column_major() {
1968 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
1969 grid.insert_col(0, vec![1, 2, 3]);
1970 test_grid(&grid, 3, 1, Order::ColumnMajor, &[1, 2, 3]);
1971 }
1972
1973 #[test]
1974 fn insert_row_at_end() {
1975 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
1976 grid.insert_row(2, vec![5, 6]);
1977 test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
1978 }
1979
1980 #[test]
1981 fn insert_row_empty() {
1982 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
1983 grid.insert_row(0, vec![1, 2, 3]);
1984 test_grid(&grid, 1, 3, Order::RowMajor, &[1, 2, 3]);
1985 }
1986
1987 #[test]
1988 #[should_panic]
1989 #[allow(clippy::should_panic_without_expect)]
1990 fn insert_row_out_of_idx() {
1991 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
1992 grid.insert_row(3, vec![4, 5]);
1993 }
1994
1995 #[test]
1996 #[should_panic]
1997 #[allow(clippy::should_panic_without_expect)]
1998 fn insert_row_wrong_size_of_idx() {
1999 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2000 grid.insert_row(1, vec![4, 5, 4]);
2001 }
2002
2003 #[test]
2004 fn insert_row_start() {
2005 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2006 grid.insert_row(1, vec![5, 6]);
2007 test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 5, 6, 3, 4]);
2008 }
2009
2010 #[test]
2011 fn insert_row_at_end_column_major() {
2012 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2013 grid.insert_row(2, vec![5, 6]);
2014 test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 3, 5, 2, 4, 6]);
2015 }
2016
2017 #[test]
2018 fn insert_row_empty_column_major() {
2019 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2020 grid.insert_row(0, vec![1, 2, 3]);
2021 test_grid(&grid, 1, 3, Order::ColumnMajor, &[1, 2, 3]);
2022 }
2023
2024 #[test]
2025 #[should_panic]
2026 #[allow(clippy::should_panic_without_expect)]
2027 fn insert_row_out_of_idx_column_major() {
2028 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::ColumnMajor);
2029 grid.insert_row(3, vec![4, 5]);
2030 }
2031
2032 #[test]
2033 #[should_panic]
2034 #[allow(clippy::should_panic_without_expect)]
2035 fn insert_row_wrong_size_of_idx_column_major() {
2036 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::ColumnMajor);
2037 grid.insert_row(1, vec![4, 5, 4]);
2038 }
2039
2040 #[test]
2041 fn insert_row_start_column_major() {
2042 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2043 grid.insert_row(1, vec![5, 6]);
2044 test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 5, 3, 2, 6, 4]);
2045 }
2046
2047 #[test]
2048 fn pop_col_1x3() {
2049 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 3, Order::RowMajor);
2050 assert_eq!(grid.pop_col(), Some(vec![3]));
2051 test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
2052 assert_eq!(grid.pop_col(), Some(vec![2]));
2053 test_grid(&grid, 1, 1, Order::RowMajor, &[1]);
2054 assert_eq!(grid.pop_col(), Some(vec![1]));
2055 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2056 assert_eq!(grid.pop_col(), None);
2057 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2058 }
2059
2060 #[test]
2061 fn pop_col_3x1() {
2062 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 1, Order::RowMajor);
2063 assert_eq!(grid.pop_col(), Some(vec![1, 2, 3]));
2064 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2065 assert_eq!(grid.pop_col(), None);
2066 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2067 }
2068
2069 #[test]
2070 fn pop_col_2x2() {
2071 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2072 assert_eq!(grid.pop_col(), Some(vec![2, 4]));
2073 assert_eq!(grid.size(), (2, 1));
2074 test_grid(&grid, 2, 1, Order::RowMajor, &[1, 3]);
2075 assert_eq!(grid.pop_col(), Some(vec![1, 3]));
2076 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2077 assert_eq!(grid.pop_col(), None);
2078 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2079 }
2080
2081 #[test]
2082 fn pop_col_3x4() {
2083 let internal = vec![1, 2, 3, 4, 11, 22, 33, 44, 111, 222, 333, 444];
2084 let mut grid: Grid<u16> = Grid::from_vec_with_order(internal, 4, Order::RowMajor);
2085 assert_eq!(grid.pop_col(), Some(vec![4, 44, 444]));
2086 let expected = [1, 2, 3, 11, 22, 33, 111, 222, 333];
2087 test_grid(&grid, 3, 3, Order::RowMajor, &expected);
2088 assert_eq!(grid.pop_col(), Some(vec![3, 33, 333]));
2089 test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 11, 22, 111, 222]);
2090 assert_eq!(grid.pop_col(), Some(vec![2, 22, 222]));
2091 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 11, 111]);
2092 assert_eq!(grid.pop_col(), Some(vec![1, 11, 111]));
2093 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2094 assert_eq!(grid.pop_col(), None);
2095 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2096 }
2097
2098 #[test]
2099 fn pop_col_empty() {
2100 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2101 assert_eq!(grid.pop_col(), None);
2102 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2103 }
2104
2105 #[test]
2106 fn pop_col_1x3_column_major() {
2107 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 3, Order::ColumnMajor);
2108 assert_eq!(grid.pop_col(), Some(vec![3]));
2109 test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
2110 assert_eq!(grid.pop_col(), Some(vec![2]));
2111 test_grid(&grid, 1, 1, Order::ColumnMajor, &[1]);
2112 assert_eq!(grid.pop_col(), Some(vec![1]));
2113 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2114 assert_eq!(grid.pop_col(), None);
2115 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2116 }
2117
2118 #[test]
2119 fn pop_col_3x1_column_major() {
2120 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 1, Order::ColumnMajor);
2121 assert_eq!(grid.pop_col(), Some(vec![1, 2, 3]));
2122 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2123 assert_eq!(grid.pop_col(), None);
2124 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2125 }
2126
2127 #[test]
2128 fn pop_col_2x2_column_major() {
2129 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2130 assert_eq!(grid.pop_col(), Some(vec![2, 4]));
2131 assert_eq!(grid.size(), (2, 1));
2132 test_grid(&grid, 2, 1, Order::ColumnMajor, &[1, 3]);
2133 assert_eq!(grid.pop_col(), Some(vec![1, 3]));
2134 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2135 assert_eq!(grid.pop_col(), None);
2136 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2137 }
2138
2139 #[test]
2140 fn pop_col_3x4_column_major() {
2141 let internal = vec![1, 11, 111, 2, 22, 222, 3, 33, 333, 4, 44, 444];
2142 let mut grid: Grid<u16> = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
2143 assert_eq!(grid.pop_col(), Some(vec![4, 44, 444]));
2144 let expected = [1, 11, 111, 2, 22, 222, 3, 33, 333];
2145 test_grid(&grid, 3, 3, Order::ColumnMajor, &expected);
2146 assert_eq!(grid.pop_col(), Some(vec![3, 33, 333]));
2147 test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 11, 111, 2, 22, 222]);
2148 assert_eq!(grid.pop_col(), Some(vec![2, 22, 222]));
2149 test_grid(&grid, 3, 1, Order::ColumnMajor, &[1, 11, 111]);
2150 assert_eq!(grid.pop_col(), Some(vec![1, 11, 111]));
2151 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2152 assert_eq!(grid.pop_col(), None);
2153 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2154 }
2155
2156 #[test]
2157 fn pop_col_empty_column_major() {
2158 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2159 assert_eq!(grid.pop_col(), None);
2160 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2161 }
2162
2163 #[test]
2164 fn pop_row_2x2() {
2165 let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
2166 assert_eq!(grid.pop_row(), Some(vec![3, 4]));
2167 test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
2168 assert_eq!(grid.pop_row(), Some(vec![1, 2]));
2169 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2170 assert_eq!(grid.pop_row(), None);
2171 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2172 }
2173
2174 #[test]
2175 fn pop_row_empty() {
2176 let mut grid: Grid<u8> = Grid::from_vec(vec![], 0);
2177 assert_eq!(grid.pop_row(), None);
2178 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2179 }
2180
2181 #[test]
2182 fn pop_row_2x2_column_major() {
2183 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2184 assert_eq!(grid.pop_row(), Some(vec![3, 4]));
2185 test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
2186 assert_eq!(grid.pop_row(), Some(vec![1, 2]));
2187 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2188 assert_eq!(grid.pop_row(), None);
2189 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2190 }
2191
2192 #[test]
2193 fn pop_row_empty_column_major() {
2194 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2195 assert_eq!(grid.pop_row(), None);
2196 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2197 }
2198
2199 #[test]
2200 fn ne_full_empty() {
2201 let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2202 let g2: Grid<u8> = grid![];
2203 assert_ne!(g1, g2);
2204 }
2205
2206 #[test]
2207 fn ne() {
2208 let g1 = Grid::from_vec(vec![1, 2, 3, 5], 2);
2209 let g2 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2210 assert_ne!(g1, g2);
2211 }
2212
2213 #[test]
2214 fn ne_dif_rows() {
2215 let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2216 let g2 = Grid::from_vec(vec![1, 2, 3, 4], 1);
2217 assert_ne!(g1, g2);
2218 }
2219
2220 #[test]
2221 fn equal_empty() {
2222 let grid: Grid<char> = grid![];
2223 let grid2: Grid<char> = grid![];
2224 assert_eq!(grid, grid2);
2225 }
2226
2227 #[test]
2228 fn equal() {
2229 let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2230 let grid2: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2231 assert_eq!(grid, grid2);
2232 }
2233
2234 #[test]
2235 fn equal_different_order() {
2236 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2237 let grid2 = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2238 assert_eq!(grid, grid2);
2239 }
2240
2241 #[test]
2242 fn equal_partial_eq() {
2243 let grid = grid![[1.0]];
2244 let grid2 = Grid::from_vec(vec![1.0], 1);
2245 assert_eq!(grid, grid2);
2246 }
2247
2248 #[test]
2249 fn ne_partial_eq() {
2250 let grid = grid![[f64::NAN]];
2251 assert_ne!(grid, grid);
2252 }
2253
2254 #[test]
2255 #[should_panic]
2256 #[allow(clippy::should_panic_without_expect)]
2257 fn idx_tup_out_of_col_bounds() {
2258 let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2259 let _ = grid[(0, 5)];
2260 }
2261
2262 #[test]
2263 fn push_col_2x3() {
2264 let mut grid: Grid<u8> = grid![
2265 [0, 1, 2]
2266 [10, 11, 12]];
2267 grid.push_col(vec![3, 13]);
2268 test_grid(&grid, 2, 4, Order::RowMajor, &[0, 1, 2, 3, 10, 11, 12, 13]);
2269 }
2270
2271 #[test]
2272 fn push_col_3x4() {
2273 let mut grid: Grid<char> = grid![
2274 ['a', 'b', 'c', 'd']
2275 ['a', 'b', 'c', 'd']
2276 ['a', 'b', 'c', 'd']];
2277 grid.push_col(vec!['x', 'y', 'z']);
2278 let expected = [
2279 'a', 'b', 'c', 'd', 'x', 'a', 'b', 'c', 'd', 'y', 'a', 'b', 'c', 'd', 'z',
2280 ];
2281 test_grid(&grid, 3, 5, Order::RowMajor, &expected);
2282 }
2283
2284 #[test]
2285 fn push_col_1x3() {
2286 let mut grid: Grid<char> = grid![['a', 'b', 'c']];
2287 grid.push_col(vec!['d']);
2288 test_grid(&grid, 1, 4, Order::RowMajor, &['a', 'b', 'c', 'd']);
2289 }
2290
2291 #[test]
2292 fn push_col_empty() {
2293 let mut grid: Grid<char> = grid![];
2294 grid.push_col(vec!['b', 'b', 'b', 'b']);
2295 test_grid(&grid, 4, 1, Order::RowMajor, &['b', 'b', 'b', 'b']);
2296 }
2297
2298 #[test]
2299 #[should_panic]
2300 #[allow(clippy::should_panic_without_expect)]
2301 fn push_col_wrong_size() {
2302 let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
2303 grid.push_col(vec!['b']);
2304 grid.push_col(vec!['b', 'b']);
2305 }
2306
2307 #[test]
2308 #[should_panic]
2309 #[allow(clippy::should_panic_without_expect)]
2310 fn push_col_zero_len() {
2311 let mut grid: Grid<char> = grid![];
2312 grid.push_col(vec![]);
2313 }
2314
2315 #[test]
2316 fn push_col_2x3_column_major() {
2317 let internal = vec![0, 10, 1, 11, 2, 12];
2318 let mut grid: Grid<u8> = Grid::from_vec_with_order(internal, 3, Order::ColumnMajor);
2319 grid.push_col(vec![3, 13]);
2320 let expected = [0, 10, 1, 11, 2, 12, 3, 13];
2321 test_grid(&grid, 2, 4, Order::ColumnMajor, &expected);
2322 }
2323
2324 #[test]
2325 fn push_col_3x4_column_major() {
2326 let internal = vec!['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'];
2327 let mut grid: Grid<char> = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
2328 grid.push_col(vec!['x', 'y', 'z']);
2329 let expected = [
2330 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'x', 'y', 'z',
2331 ];
2332 test_grid(&grid, 3, 5, Order::ColumnMajor, &expected);
2333 }
2334
2335 #[test]
2336 fn push_col_1x3_column_major() {
2337 let mut grid: Grid<char> =
2338 Grid::from_vec_with_order(vec!['a', 'b', 'c'], 3, Order::ColumnMajor);
2339 grid.push_col(vec!['d']);
2340 test_grid(&grid, 1, 4, Order::ColumnMajor, &['a', 'b', 'c', 'd']);
2341 }
2342
2343 #[test]
2344 fn push_col_empty_column_major() {
2345 let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2346 grid.push_col(vec!['b', 'b', 'b', 'b']);
2347 test_grid(&grid, 4, 1, Order::ColumnMajor, &['b', 'b', 'b', 'b']);
2348 }
2349
2350 #[test]
2351 #[should_panic]
2352 #[allow(clippy::should_panic_without_expect)]
2353 fn push_col_wrong_size_column_major() {
2354 let mut grid: Grid<char> = Grid::init_with_order(2, 3, Order::ColumnMajor, 'a');
2355 grid.push_col(vec!['b']);
2356 grid.push_col(vec!['b', 'b']);
2357 }
2358
2359 #[test]
2360 #[should_panic]
2361 #[allow(clippy::should_panic_without_expect)]
2362 fn push_col_zero_len_column_major() {
2363 let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2364 grid.push_col(vec![]);
2365 }
2366
2367 #[test]
2368 fn push_row() {
2369 let mut grid: Grid<u8> = grid![[1, 2][3, 4]];
2370 grid.push_row(vec![5, 6]);
2371 test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
2372 }
2373
2374 #[test]
2375 fn push_row_empty() {
2376 let mut grid: Grid<char> = grid![];
2377 grid.push_row(vec!['b', 'b', 'b', 'b']);
2378 test_grid(&grid, 1, 4, Order::RowMajor, &['b', 'b', 'b', 'b']);
2379 }
2380
2381 #[test]
2382 #[should_panic]
2383 #[allow(clippy::should_panic_without_expect)]
2384 fn push_empty_row() {
2385 let mut grid = Grid::init(0, 1, 0);
2386 grid.push_row(vec![]);
2387 }
2388
2389 #[test]
2390 #[should_panic]
2391 #[allow(clippy::should_panic_without_expect)]
2392 fn push_row_wrong_size() {
2393 let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
2394 grid.push_row(vec!['b']);
2395 grid.push_row(vec!['b', 'b', 'b', 'b']);
2396 }
2397
2398 #[test]
2399 fn push_row_column_major() {
2400 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2401 grid.push_row(vec![5, 6]);
2402 test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 3, 5, 2, 4, 6]);
2403 }
2404
2405 #[test]
2406 fn push_row_empty_column_major() {
2407 let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2408 grid.push_row(vec!['b', 'b', 'b', 'b']);
2409 test_grid(&grid, 1, 4, Order::ColumnMajor, &['b', 'b', 'b', 'b']);
2410 }
2411
2412 #[test]
2413 #[should_panic]
2414 #[allow(clippy::should_panic_without_expect)]
2415 fn push_empty_row_column_major() {
2416 let mut grid = Grid::init_with_order(0, 1, Order::ColumnMajor, 0);
2417 grid.push_row(vec![]);
2418 }
2419
2420 #[test]
2421 #[should_panic]
2422 #[allow(clippy::should_panic_without_expect)]
2423 fn push_row_wrong_size_column_major() {
2424 let mut grid: Grid<char> =
2425 Grid::from_vec_with_order(vec!['a', 'a', 'a', 'a', 'a', 'a'], 3, Order::ColumnMajor);
2426 grid.push_row(vec!['b']);
2427 grid.push_row(vec!['b', 'b', 'b', 'b']);
2428 }
2429
2430 #[test]
2431 fn iter_row() {
2432 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2433 let row: Vec<_> = grid.iter_row(1).collect();
2434 assert_eq!(row, [&4, &5, &6]);
2435 }
2436
2437 #[test]
2438 #[should_panic]
2439 #[allow(clippy::should_panic_without_expect)]
2440 fn iter_row_out_of_bound() {
2441 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2442 let _ = grid.iter_row(3);
2443 }
2444
2445 #[test]
2446 #[should_panic]
2447 #[allow(clippy::should_panic_without_expect)]
2448 fn iter_row_zero() {
2449 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2450 let _ = grid.iter_row(0);
2451 }
2452
2453 #[test]
2454 fn iter_row_rowumn_major() {
2455 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2456 let row: Vec<_> = grid.iter_row(1).collect();
2457 assert_eq!(row, [&4, &5, &6]);
2458 }
2459
2460 #[test]
2461 #[should_panic]
2462 #[allow(clippy::should_panic_without_expect)]
2463 fn iter_row_rowumn_major_out_of_bound() {
2464 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2465 let _ = grid.iter_row(3);
2466 }
2467
2468 #[test]
2469 #[should_panic]
2470 #[allow(clippy::should_panic_without_expect)]
2471 fn iter_row_rowumn_major_zero() {
2472 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2473 let _ = grid.iter_row(0);
2474 }
2475
2476 #[test]
2477 fn iter_row_mut() {
2478 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2479 let row: Vec<_> = grid.iter_row_mut(1).collect();
2480 assert_eq!(row, [&mut 4, &mut 5, &mut 6]);
2481 }
2482
2483 #[test]
2484 #[should_panic]
2485 #[allow(clippy::should_panic_without_expect)]
2486 fn iter_row_mut_out_of_bound() {
2487 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2488 let _ = grid.iter_row_mut(3);
2489 }
2490
2491 #[test]
2492 #[should_panic]
2493 #[allow(clippy::should_panic_without_expect)]
2494 fn iter_row_mut_zero() {
2495 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2496 let _ = grid.iter_row_mut(0);
2497 }
2498
2499 #[test]
2500 fn iter_row_mut_rowumn_major() {
2501 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2502 let row: Vec<_> = grid.iter_row_mut(1).collect();
2503 assert_eq!(row, [&mut 4, &mut 5, &mut 6]);
2504 }
2505
2506 #[test]
2507 #[should_panic]
2508 #[allow(clippy::should_panic_without_expect)]
2509 fn iter_row_mut_rowumn_major_out_of_bound() {
2510 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2511 let _ = grid.iter_row_mut(3);
2512 }
2513
2514 #[test]
2515 #[should_panic]
2516 #[allow(clippy::should_panic_without_expect)]
2517 fn iter_row_mut_rowumn_major_zero() {
2518 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2519 let _ = grid.iter_row_mut(0);
2520 }
2521
2522 #[test]
2523 fn iter_col() {
2524 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2525 let col: Vec<_> = grid.iter_col(1).collect();
2526 assert_eq!(col, [&2, &5]);
2527 }
2528
2529 #[test]
2530 #[should_panic]
2531 #[allow(clippy::should_panic_without_expect)]
2532 fn iter_col_out_of_bound() {
2533 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2534 let _ = grid.iter_col(3);
2535 }
2536
2537 #[test]
2538 #[should_panic]
2539 #[allow(clippy::should_panic_without_expect)]
2540 fn iter_col_zero() {
2541 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2542 let _ = grid.iter_col(0);
2543 }
2544
2545 #[test]
2546 fn iter_col_column_major() {
2547 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2548 let col: Vec<_> = grid.iter_col(1).collect();
2549 assert_eq!(col, [&2, &5]);
2550 }
2551
2552 #[test]
2553 #[should_panic]
2554 #[allow(clippy::should_panic_without_expect)]
2555 fn iter_col_column_major_out_of_bound() {
2556 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2557 let _ = grid.iter_col(3);
2558 }
2559
2560 #[test]
2561 #[should_panic]
2562 #[allow(clippy::should_panic_without_expect)]
2563 fn iter_col_column_major_zero() {
2564 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2565 let _ = grid.iter_col(0);
2566 }
2567
2568 #[test]
2569 fn iter_col_mut() {
2570 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2571 let col: Vec<_> = grid.iter_col_mut(1).collect();
2572 assert_eq!(col, [&mut 2, &mut 5]);
2573 }
2574
2575 #[test]
2576 #[should_panic]
2577 #[allow(clippy::should_panic_without_expect)]
2578 fn iter_col_mut_out_of_bound() {
2579 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2580 let _ = grid.iter_col_mut(3);
2581 }
2582
2583 #[test]
2584 #[should_panic]
2585 #[allow(clippy::should_panic_without_expect)]
2586 fn iter_col_mut_zero() {
2587 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2588 let _ = grid.iter_col_mut(0);
2589 }
2590
2591 #[test]
2592 fn iter_col_mut_column_major() {
2593 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2594 let col: Vec<_> = grid.iter_col_mut(1).collect();
2595 assert_eq!(col, [&mut 2, &mut 5]);
2596 }
2597
2598 #[test]
2599 #[should_panic]
2600 #[allow(clippy::should_panic_without_expect)]
2601 fn iter_col_mut_column_major_out_of_bound() {
2602 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2603 let _ = grid.iter_col_mut(3);
2604 }
2605
2606 #[test]
2607 #[should_panic]
2608 #[allow(clippy::should_panic_without_expect)]
2609 fn iter_col_mut_column_major_zero() {
2610 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2611 let _ = grid.iter_col_mut(0);
2612 }
2613
2614 #[test]
2615 fn iter() {
2616 let grid: Grid<u8> = grid![[1,2][3,4]];
2617 let mut iter = grid.iter();
2618 assert_eq!(iter.next(), Some(&1));
2619 assert_eq!(iter.next(), Some(&2));
2620 assert_eq!(iter.next(), Some(&3));
2621 assert_eq!(iter.next(), Some(&4));
2622 assert_eq!(iter.next(), None);
2623 }
2624
2625 #[test]
2626 fn indexed_iter() {
2627 let grid: Grid<u8> = grid![[1,2][3,4]];
2628 let mut iter = grid.indexed_iter();
2629 assert_eq!(iter.next(), Some(((0, 0), &1)));
2630 assert_eq!(iter.next(), Some(((0, 1), &2)));
2631 assert_eq!(iter.next(), Some(((1, 0), &3)));
2632 assert_eq!(iter.next(), Some(((1, 1), &4)));
2633 assert_eq!(iter.next(), None);
2634 }
2635
2636 #[test]
2637 fn indexed_iter_empty() {
2638 let grid: Grid<u8> = Grid::new(0, 0);
2639 let mut iter = grid.indexed_iter();
2640 assert_eq!(iter.next(), None);
2641 }
2642
2643 #[test]
2644 fn indexed_iter_column_major() {
2645 let grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2646 let mut iter = grid.indexed_iter();
2647 assert_eq!(iter.next(), Some(((0, 0), &1)));
2648 assert_eq!(iter.next(), Some(((1, 0), &3)));
2649 assert_eq!(iter.next(), Some(((0, 1), &2)));
2650 assert_eq!(iter.next(), Some(((1, 1), &4)));
2651 assert_eq!(iter.next(), None);
2652 }
2653
2654 #[test]
2655 fn indexed_iter_empty_column_major() {
2656 let grid: Grid<u8> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2657 let mut iter = grid.indexed_iter();
2658 assert_eq!(iter.next(), None);
2659 }
2660
2661 #[test]
2662 fn indexed_iter_mut() {
2663 let mut grid: Grid<u8> = grid![[1,2][3,4]];
2664 let mut iter = grid.indexed_iter_mut();
2665 assert_eq!(iter.next(), Some(((0, 0), &mut 1)));
2666 assert_eq!(iter.next(), Some(((0, 1), &mut 2)));
2667 assert_eq!(iter.next(), Some(((1, 0), &mut 3)));
2668 assert_eq!(iter.next(), Some(((1, 1), &mut 4)));
2669 assert_eq!(iter.next(), None);
2670 }
2671
2672 #[test]
2673 fn indexed_iter_mut_empty() {
2674 let mut grid: Grid<u8> = Grid::new(0, 0);
2675 let mut iter = grid.indexed_iter_mut();
2676 assert_eq!(iter.next(), None);
2677 }
2678
2679 #[test]
2680 fn indexed_iter_mut_column_major() {
2681 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2682 let mut iter = grid.indexed_iter_mut();
2683 assert_eq!(iter.next(), Some(((0, 0), &mut 1)));
2684 assert_eq!(iter.next(), Some(((1, 0), &mut 3)));
2685 assert_eq!(iter.next(), Some(((0, 1), &mut 2)));
2686 assert_eq!(iter.next(), Some(((1, 1), &mut 4)));
2687 assert_eq!(iter.next(), None);
2688 }
2689
2690 #[test]
2691 fn indexed_iter_mut_empty_column_major() {
2692 let mut grid: Grid<u8> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2693 let mut iter = grid.indexed_iter_mut();
2694 assert_eq!(iter.next(), None);
2695 }
2696
2697 #[test]
2698 fn clear() {
2699 let mut grid: Grid<u8> = grid![[1, 2, 3]];
2700 assert!(!grid.is_empty());
2701 grid.clear();
2702 assert!(grid.is_empty());
2703 }
2704
2705 #[test]
2706 fn is_empty_false() {
2707 let grid: Grid<u8> = grid![[1, 2, 3]];
2708 assert!(!grid.is_empty());
2709 }
2710
2711 #[test]
2712 fn is_empty() {
2713 let mut g: Grid<u8> = grid![[]];
2714 assert!(g.is_empty());
2715 g = grid![];
2716 assert!(g.is_empty());
2717 g = Grid::from_vec(vec![], 0);
2718 assert!(g.is_empty());
2719 g = Grid::new(0, 0);
2720 assert!(g.is_empty());
2721 g = Grid::new(0, 1);
2722 assert!(g.is_empty());
2723 g = Grid::new(1, 0);
2724 assert!(g.is_empty());
2725 g = Grid::init(0, 0, 10);
2726 assert!(g.is_empty());
2727 }
2728
2729 #[test]
2730 fn fmt_empty() {
2731 let grid: Grid<u8> = grid![];
2732 assert_eq!(format!("{grid:?}"), "[]");
2733 }
2734
2735 #[test]
2736 fn fmt_row() {
2737 let grid: Grid<u8> = grid![[1, 2, 3]];
2738 assert_eq!(format!("{grid:?}"), "[[1, 2, 3]]");
2739 }
2740
2741 #[test]
2742 fn fmt_grid() {
2743 let grid: Grid<u8> = grid![[1,2,3][4,5,6][7,8,9]];
2744 assert_eq!(format!("{grid:?}"), "[[1, 2, 3][4, 5, 6][7, 8, 9]]");
2745 }
2746
2747 #[test]
2748 fn fmt_column_major() {
2749 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2750 assert_eq!(format!("{grid:?}"), "[[1, 2, 3][4, 5, 6]]");
2751 }
2752
2753 #[test]
2754 fn fmt_pretty_empty() {
2755 let grid: Grid<f32> = grid![];
2756 assert_eq!(format!("{grid:#?}"), "[]");
2757 }
2758
2759 #[test]
2760 fn fmt_pretty_int() {
2761 let grid: Grid<u8> = grid![
2762 [1,2,3]
2763 [4,5,6]
2764 [7,8,95]
2765 ];
2766
2767 let expected_output = r"[
2768 [ 1, 2, 3]
2769 [ 4, 5, 6]
2770 [ 7, 8, 95]
2771]";
2772
2773 assert_eq!(format!("{grid:#?}"), expected_output);
2774
2775 let expected_output = r"[
2776 [ 1, 2, 3]
2777 [ 4, 5, 6]
2778 [ 7, 8, 95]
2779]";
2780
2781 assert_eq!(format!("{grid:#3?}"), expected_output);
2782 }
2783
2784 #[test]
2785 fn fmt_pretty_float() {
2786 let grid: Grid<f32> = grid![
2787 [1.5,2.6,3.44]
2788 [4.775,5.,6.]
2789 [7.1,8.23444,95.55]
2790 ];
2791
2792 let expected_output = r"[
2793 [ 1.5, 2.6, 3.4]
2794 [ 4.8, 5.0, 6.0]
2795 [ 7.1, 8.2, 95.6]
2796]";
2797
2798 assert_eq!(format!("{grid:#5.1?}"), expected_output);
2799
2800 let expected_output = r"[
2801 [ 1.50000, 2.60000, 3.44000]
2802 [ 4.77500, 5.00000, 6.00000]
2803 [ 7.10000, 8.23444, 95.55000]
2804]";
2805
2806 assert_eq!(format!("{grid:#8.5?}"), expected_output);
2807 }
2808
2809 #[test]
2810 fn fmt_pretty_tuple() {
2811 let grid: Grid<(i32, i32)> = grid![
2812 [(5,66), (432, 55)]
2813 [(80, 90), (5, 6)]
2814 ];
2815
2816 let expected_output = r"[
2817 [ ( 5, 66), ( 432, 55)]
2818 [ ( 80, 90), ( 5, 6)]
2819]";
2820
2821 assert_eq!(format!("{grid:#?}"), expected_output);
2822
2823 let expected_output = r"[
2824 [ ( 5, 66), (432, 55)]
2825 [ ( 80, 90), ( 5, 6)]
2826]";
2827
2828 assert_eq!(format!("{grid:#3?}"), expected_output);
2829 }
2830
2831 #[test]
2832 fn fmt_pretty_struct_derived() {
2833 #[derive(Debug)]
2834 struct Person {
2835 _name: String,
2836 _precise_age: f32,
2837 }
2838
2839 impl Person {
2840 fn new(name: &str, precise_age: f32) -> Self {
2841 Person {
2842 _name: name.into(),
2843 _precise_age: precise_age,
2844 }
2845 }
2846 }
2847
2848 let grid: Grid<Person> = grid![
2849 [Person::new("Vic", 24.5), Person::new("Mr. Very Long Name", 1955.)]
2850 [Person::new("Sam", 8.9995), Person::new("John Doe", 40.14)]
2851 ];
2852
2853 let expected_output = r#"[
2854 [ Person { _name: "Vic", _precise_age: 24.50000 }, Person { _name: "Mr. Very Long Name", _precise_age: 1955.00000 }]
2855 [ Person { _name: "Sam", _precise_age: 8.99950 }, Person { _name: "John Doe", _precise_age: 40.14000 }]
2856]"#;
2857
2858 assert_eq!(format!("{grid:#5.5?}"), expected_output);
2859 }
2860
2861 #[test]
2862 fn fmt_pretty_column_major() {
2863 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2864 let expected_output = r"[
2865 [ 1, 2, 3]
2866 [ 4, 5, 6]
2867]";
2868 assert_eq!(format!("{grid:#?}"), expected_output);
2869 }
2870
2871 #[test]
2872 fn clone() {
2873 let grid = grid![[1, 2, 3][4, 5, 6]];
2874 let mut clone = grid.clone();
2875 clone[(0, 2)] = 10;
2876 test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
2877 test_grid(&clone, 2, 3, Order::RowMajor, &[1, 2, 10, 4, 5, 6]);
2878 }
2879
2880 #[test]
2881 fn macro_init() {
2882 let grid = grid![[1, 2, 3][4, 5, 6]];
2883 test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
2884 }
2885
2886 #[test]
2887 fn macro_init_2() {
2888 let grid = grid![[1, 2, 3]
2889 [4, 5, 6]
2890 [7, 8, 9]];
2891 test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
2892 }
2893
2894 #[test]
2895 fn macro_init_char() {
2896 let grid = grid![['a', 'b', 'c']
2897 ['a', 'b', 'c']
2898 ['a', 'b', 'c']];
2899 let expected = ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'];
2900 test_grid(&grid, 3, 3, Order::RowMajor, &expected);
2901 }
2902
2903 #[test]
2904 fn macro_one_row() {
2905 let grid: Grid<usize> = grid![[1, 2, 3, 4]];
2906 test_grid(&grid, 1, 4, Order::RowMajor, &[1, 2, 3, 4]);
2907 }
2908
2909 #[test]
2910 fn macro2_empty() {
2911 let grid: Grid<u8> = grid_cm![];
2912 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2913 }
2914
2915 #[test]
2916 fn macro2_init() {
2917 let grid = grid_cm![[1, 2, 3]
2918 [4, 5, 6]
2919 [7, 8, 9]];
2920 let expected = [1, 4, 7, 2, 5, 8, 3, 6, 9];
2921 test_grid(&grid, 3, 3, Order::ColumnMajor, &expected);
2922 }
2923
2924 #[test]
2925 fn macro2_init_char() {
2926 let grid = grid_cm![['a', 'b']['c', 'd']];
2927 test_grid(&grid, 2, 2, Order::ColumnMajor, &['a', 'c', 'b', 'd']);
2928 }
2929
2930 #[test]
2931 fn macro2_one_row() {
2932 let grid = grid_cm![[1, 2, 3, 4]];
2933 test_grid(&grid, 1, 4, Order::ColumnMajor, &[1, 2, 3, 4]);
2934 }
2935
2936 #[test]
2937 fn init() {
2938 let grid = Grid::init(1, 2, 3);
2939 test_grid(&grid, 1, 2, Order::RowMajor, &[3, 3]);
2940
2941 let grid = Grid::init(1, 2, 1.2);
2942 test_grid(&grid, 1, 2, Order::RowMajor, &[1.2, 1.2]);
2943
2944 let grid = Grid::init(1, 2, 'a');
2945 test_grid(&grid, 1, 2, Order::RowMajor, &['a', 'a']);
2946 }
2947
2948 #[test]
2949 #[should_panic]
2950 #[allow(clippy::should_panic_without_expect)]
2951 fn init_panics() {
2952 Grid::init(usize::MAX, 2, 3);
2953 }
2954
2955 #[test]
2956 fn init_empty() {
2957 let grid = Grid::init(0, 1, 0);
2958 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2959
2960 let grid = Grid::init(1, 0, -1);
2961 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2962 }
2963
2964 #[test]
2965 fn init_with_order() {
2966 let grid = Grid::init_with_order(1, 2, Order::RowMajor, 3);
2967 test_grid(&grid, 1, 2, Order::RowMajor, &[3, 3]);
2968
2969 let grid = Grid::init_with_order(1, 2, Order::ColumnMajor, 1.2);
2970 test_grid(&grid, 1, 2, Order::ColumnMajor, &[1.2, 1.2]);
2971
2972 let grid = Grid::init_with_order(1, 2, Order::ColumnMajor, 'a');
2973 test_grid(&grid, 1, 2, Order::ColumnMajor, &['a', 'a']);
2974 }
2975
2976 #[test]
2977 #[should_panic]
2978 #[allow(clippy::should_panic_without_expect)]
2979 fn init_with_order_panics() {
2980 Grid::init_with_order(usize::MAX, 2, Order::ColumnMajor, 3);
2981 }
2982
2983 #[test]
2984 fn init_with_order_empty() {
2985 let grid = Grid::init_with_order(0, 1, Order::ColumnMajor, 0);
2986 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2987
2988 let grid = Grid::init_with_order(1, 0, Order::RowMajor, -1);
2989 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2990 }
2991
2992 #[test]
2993 fn new() {
2994 let grid: Grid<u8> = Grid::new(1, 2);
2995 test_grid(&grid, 1, 2, Order::RowMajor, &[0, 0]);
2996 }
2997
2998 #[test]
2999 #[should_panic]
3000 #[allow(clippy::should_panic_without_expect)]
3001 fn new_panics() {
3002 let _: Grid<u8> = Grid::new(usize::MAX, 2);
3003 }
3004
3005 #[test]
3006 fn new_empty() {
3007 let grid: Grid<u8> = Grid::new(0, 1);
3008 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3009
3010 let grid: Grid<u8> = Grid::new(1, 0);
3011 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3012 }
3013
3014 #[test]
3015 fn new_with_order() {
3016 let grid: Grid<u8> = Grid::new_with_order(2, 2, Order::ColumnMajor);
3017 test_grid(&grid, 2, 2, Order::ColumnMajor, &[0, 0, 0, 0]);
3018 }
3019
3020 #[test]
3021 #[should_panic]
3022 #[allow(clippy::should_panic_without_expect)]
3023 fn new_with_order_panics() {
3024 let _: Grid<u8> = Grid::new_with_order(usize::MAX, 2, Order::ColumnMajor);
3025 }
3026
3027 #[test]
3028 fn new_with_order_empty() {
3029 let grid: Grid<u8> = Grid::new_with_order(0, 3, Order::RowMajor);
3030 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3031
3032 let grid: Grid<u8> = Grid::new_with_order(3, 0, Order::ColumnMajor);
3033 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3034 }
3035
3036 #[test]
3037 fn get() {
3038 let grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3039 assert_eq!(grid.get(0_i64, 1_i32), Some(&2));
3040 }
3041
3042 #[test]
3043 fn get_column_major() {
3044 let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3045 assert_eq!(grid.get(1, 0), Some(&2));
3046 }
3047
3048 #[test]
3049 fn get_none() {
3050 let grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3051 assert_eq!(grid.get(1, 0), None);
3052 }
3053
3054 #[test]
3055 fn get_none_column_major() {
3056 let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3057 assert_eq!(grid.get(0, 1), None);
3058 }
3059
3060 #[test]
3061 fn get_mut() {
3062 let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3063 assert_eq!(grid.get_mut(0_i64, 1_i32), Some(&mut 2));
3064 }
3065
3066 #[test]
3067 fn get_mut_column_major() {
3068 let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3069 assert_eq!(grid.get_mut(1, 0), Some(&mut 2));
3070 }
3071
3072 #[test]
3073 fn get_mut_none() {
3074 let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3075 assert_eq!(grid.get_mut(1, 0), None);
3076 }
3077
3078 #[test]
3079 fn get_mut_none_column_major() {
3080 let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3081 assert_eq!(grid.get_mut(0, 1), None);
3082 }
3083
3084 #[test]
3085 fn idx_tup() {
3086 let grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
3087 assert_eq!(grid[(0, 0)], 1);
3088 assert_eq!(grid[(0, 1)], 2);
3089 assert_eq!(grid[(1, 0)], 3);
3090 assert_eq!(grid[(1, 1)], 4);
3091 }
3092
3093 #[test]
3094 #[should_panic]
3095 #[allow(clippy::should_panic_without_expect)]
3096 fn idx_tup_panic_1() {
3097 let grid = Grid::init(1, 2, 3);
3098 let _ = grid[(20, 0)];
3099 }
3100
3101 #[test]
3102 #[should_panic]
3103 #[allow(clippy::should_panic_without_expect)]
3104 fn idx_tup_panic_2() {
3105 let grid = Grid::init(1, 2, 3);
3106 let _ = grid[(0, 20)];
3107 }
3108
3109 #[test]
3110 fn idx_tup_set() {
3111 let mut grid = Grid::init(1, 2, 3);
3112 grid[(0, 0)] = 4;
3113 assert_eq!(grid[(0, 0)], 4);
3114 }
3115
3116 #[test]
3117 fn size() {
3118 let grid = Grid::init(1, 2, 3);
3119 assert_eq!(grid.size(), (1, 2));
3120 }
3121
3122 #[test]
3123 fn transpose() {
3124 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3125 grid.transpose();
3126 assert_eq!(grid, grid![[1,4][2,5][3,6]]);
3127 }
3128
3129 #[test]
3130 fn fill() {
3131 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3132 grid.fill(7);
3133 test_grid(&grid, 2, 3, Order::RowMajor, &[7, 7, 7, 7, 7, 7]);
3134 }
3135
3136 #[test]
3137 fn fill_with() {
3138 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3139 grid.fill_with(Default::default);
3140 test_grid(&grid, 2, 3, Order::RowMajor, &[0, 0, 0, 0, 0, 0]);
3141 }
3142
3143 #[test]
3144 #[allow(clippy::redundant_closure_for_method_calls)]
3145 fn iter_rows() {
3146 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3147 let max_by_row: Vec<u8> = grid
3148 .iter_rows()
3149 .map(|row| row.max().unwrap())
3150 .copied()
3151 .collect();
3152 assert_eq!(max_by_row, vec![3, 6]);
3153
3154 let sum_by_row: Vec<u8> = grid.iter_rows().map(|row| row.sum()).collect();
3155 assert_eq!(sum_by_row, vec![1 + 2 + 3, 4 + 5 + 6]);
3156 }
3157
3158 #[test]
3159 #[allow(clippy::redundant_closure_for_method_calls)]
3160 fn iter_rows_rev() {
3161 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3162 let max_by_row: Vec<u8> = grid
3163 .iter_rows()
3164 .rev()
3165 .map(|row| row.max().unwrap())
3166 .copied()
3167 .collect();
3168 assert_eq!(max_by_row, vec![6, 3]);
3169
3170 let sum_by_row: Vec<u8> = grid.iter_rows().rev().map(|row| row.sum()).collect();
3171 assert_eq!(sum_by_row, vec![4 + 5 + 6, 1 + 2 + 3]);
3172 }
3173
3174 #[test]
3175 fn iter_rows_exact_size() {
3176 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3177 let mut row_iter = grid.iter_rows();
3178 assert_eq!(row_iter.len(), 2);
3179 assert!(row_iter.next().is_some());
3180 assert_eq!(row_iter.len(), 1);
3181 assert!(row_iter.next().is_some());
3182 assert_eq!(row_iter.len(), 0);
3183 assert!(row_iter.next().is_none());
3184 }
3185
3186 #[test]
3187 #[allow(clippy::redundant_closure_for_method_calls)]
3188 fn iter_cols() {
3189 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3190 let max_by_col: Vec<u8> = grid
3191 .iter_cols()
3192 .map(|col| col.max().unwrap())
3193 .copied()
3194 .collect();
3195
3196 assert_eq!(max_by_col, vec![4, 5, 6]);
3197
3198 let sum_by_col: Vec<u8> = grid.iter_cols().map(|row| row.sum()).collect();
3199 assert_eq!(sum_by_col, vec![1 + 4, 2 + 5, 3 + 6]);
3200 }
3201
3202 #[test]
3203 #[allow(clippy::redundant_closure_for_method_calls)]
3204 fn iter_cols_rev() {
3205 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3206 let max_by_col: Vec<u8> = grid
3207 .iter_cols()
3208 .rev()
3209 .map(|col| col.max().unwrap())
3210 .copied()
3211 .collect();
3212
3213 assert_eq!(max_by_col, vec![6, 5, 4]);
3214
3215 let sum_by_col: Vec<u8> = grid.iter_cols().rev().map(|row| row.sum()).collect();
3216 assert_eq!(sum_by_col, vec![3 + 6, 2 + 5, 1 + 4]);
3217 }
3218
3219 #[test]
3220 fn iter_cols_exact_size() {
3221 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3222 let mut col_iter = grid.iter_cols();
3223 assert_eq!(col_iter.len(), 3);
3224 assert!(col_iter.next().is_some());
3225 assert_eq!(col_iter.len(), 2);
3226 assert!(col_iter.next().is_some());
3227 assert_eq!(col_iter.len(), 1);
3228 assert!(col_iter.next().is_some());
3229 assert_eq!(col_iter.len(), 0);
3230 assert!(col_iter.next().is_none());
3231 }
3232
3233 #[test]
3234 fn remove_row() {
3235 let mut grid = grid![[1,2][3,4][5,6]];
3236 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
3237 test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 5, 6]);
3238 assert_eq![grid.remove_row(0), Some(vec![1, 2])];
3239 test_grid(&grid, 1, 2, Order::RowMajor, &[5, 6]);
3240 assert_eq![grid.remove_row(0), Some(vec![5, 6])];
3241 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3242 assert_eq![grid.remove_row(0), None];
3243 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3244 }
3245
3246 #[test]
3247 fn remove_row_out_of_bound() {
3248 let mut grid = grid![[1, 2][3, 4]];
3249 assert_eq![grid.remove_row(5), None];
3250 test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
3251 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
3252 test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
3253 }
3254
3255 #[test]
3256 fn remove_row_column_major() {
3257 let mut grid = Grid::from_vec_with_order(vec![1, 3, 5, 2, 4, 6], 2, Order::ColumnMajor);
3258 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
3259 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 5, 2, 6]);
3260 assert_eq![grid.remove_row(0), Some(vec![1, 2])];
3261 test_grid(&grid, 1, 2, Order::ColumnMajor, &[5, 6]);
3262 assert_eq![grid.remove_row(0), Some(vec![5, 6])];
3263 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3264 assert_eq![grid.remove_row(0), None];
3265 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3266 }
3267
3268 #[test]
3269 fn remove_row_out_of_bound_column_major() {
3270 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3271 assert_eq![grid.remove_row(5), None];
3272 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
3273 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
3274 test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
3275 }
3276
3277 #[test]
3278 fn remove_col() {
3279 let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
3280 assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])];
3281 let expected = [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15];
3282 test_grid(&grid, 4, 3, Order::RowMajor, &expected);
3283 assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])];
3284 test_grid(&grid, 4, 2, Order::RowMajor, &[2, 3, 6, 7, 10, 11, 14, 15]);
3285 assert_eq![grid.remove_col(1), Some(vec![3, 7, 11, 15])];
3286 test_grid(&grid, 4, 1, Order::RowMajor, &[2, 6, 10, 14]);
3287 assert_eq![grid.remove_col(0), Some(vec![2, 6, 10, 14])];
3288 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3289 assert_eq![grid.remove_col(0), None];
3290 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3291 }
3292
3293 #[test]
3294 fn remove_col_out_of_bound() {
3295 let mut grid = grid![[1, 2][3, 4]];
3296 assert_eq!(grid.remove_col(5), None);
3297 test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
3298 assert_eq!(grid.remove_col(1), Some(vec![2, 4]));
3299 test_grid(&grid, 2, 1, Order::RowMajor, &[1, 3]);
3300 }
3301
3302 #[test]
3303 fn remove_col_column_major() {
3304 let internal = vec![1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16];
3305 let mut grid = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
3306 assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])];
3307 let expected = [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15];
3308 test_grid(&grid, 4, 3, Order::ColumnMajor, &expected);
3309 assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])];
3310 let expected = [2, 6, 10, 14, 3, 7, 11, 15];
3311 test_grid(&grid, 4, 2, Order::ColumnMajor, &expected);
3312 assert_eq![grid.remove_col(1), Some(vec![3, 7, 11, 15])];
3313 test_grid(&grid, 4, 1, Order::ColumnMajor, &[2, 6, 10, 14]);
3314 assert_eq![grid.remove_col(0), Some(vec![2, 6, 10, 14])];
3315 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3316 assert_eq![grid.remove_col(0), None];
3317 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3318 }
3319
3320 #[test]
3321 fn remove_col_out_of_bound_column_major() {
3322 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3323 assert_eq!(grid.remove_col(5), None);
3324 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
3325 assert_eq!(grid.remove_col(1), Some(vec![2, 4]));
3326 test_grid(&grid, 2, 1, Order::ColumnMajor, &[1, 3]);
3327 }
3328
3329 #[test]
3330 fn flip_cols() {
3331 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
3332 grid.flip_cols();
3333 test_grid(&grid, 2, 2, Order::RowMajor, &[2, 1, 4, 3]);
3334 }
3335
3336 #[test]
3337 fn flip_cols_column_major() {
3338 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3339 grid.flip_cols();
3340 test_grid(&grid, 2, 2, Order::ColumnMajor, &[2, 4, 1, 3]);
3341 }
3342
3343 #[test]
3344 fn flip_rows() {
3345 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
3346 grid.flip_rows();
3347 test_grid(&grid, 2, 2, Order::RowMajor, &[3, 4, 1, 2]);
3348 }
3349
3350 #[test]
3351 fn flip_rows_column_major() {
3352 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3353 grid.flip_rows();
3354 test_grid(&grid, 2, 2, Order::ColumnMajor, &[3, 1, 4, 2]);
3355 }
3356
3357 #[test]
3358 fn rotate_left() {
3359 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3360 grid.rotate_left();
3361 test_grid(&grid, 3, 2, Order::ColumnMajor, &[3, 2, 1, 6, 5, 4]);
3362 assert_eq!(grid, grid![[3,6][2,5][1,4]]);
3363 }
3364
3365 #[test]
3366 fn rotate_left_column_major() {
3367 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3368 grid.rotate_left();
3369 test_grid(&grid, 3, 2, Order::RowMajor, &[3, 6, 2, 5, 1, 4]);
3370 assert_eq!(grid, grid![[3,6][2,5][1,4]]);
3371 }
3372
3373 #[test]
3374 fn rotate_right() {
3375 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3376 grid.rotate_right();
3377 test_grid(&grid, 3, 2, Order::ColumnMajor, &[4, 5, 6, 1, 2, 3]);
3378 assert_eq!(grid, grid![[4,1][5,2][6,3]]);
3379 }
3380
3381 #[test]
3382 fn rotate_right_column_major() {
3383 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3384 grid.rotate_right();
3385 test_grid(&grid, 3, 2, Order::RowMajor, &[4, 1, 5, 2, 6, 3]);
3386 assert_eq!(grid, grid![[4,1][5,2][6,3]]);
3387 }
3388
3389 #[test]
3390 fn iter_cols_clone() {
3391 let grid = grid![[1,2,3][4,5,6]];
3392 let mut cols = grid.iter_cols().skip(1);
3393 let c3: u8 = cols.clone().nth(1).unwrap().sum();
3394 let c2: u8 = cols.next().unwrap().sum();
3395 assert_eq!(c2, 2 + 5);
3396 assert_eq!(c3, 3 + 6);
3397 }
3398
3399 #[test]
3400 fn iter_rows_clone() {
3401 let grid = grid![[1,2,3][4,5,6][7,8,9]];
3402 let mut rows = grid.iter_rows().skip(1);
3403 let r3: u8 = rows.clone().nth(1).unwrap().sum();
3404 let r2: u8 = rows.next().unwrap().sum();
3405 assert_eq!(r2, 4 + 5 + 6);
3406 assert_eq!(r3, 7 + 8 + 9);
3407 }
3408}