1#![warn(clippy::all, clippy::pedantic, clippy::nursery)]
2#![cfg_attr(not(feature = "std"), no_std)]
44
45#[cfg(all(test, not(feature = "std")))]
46extern crate std;
47
48#[cfg(not(feature = "std"))]
49extern crate alloc;
50#[cfg(not(feature = "std"))]
51use alloc::{format, vec, vec::Vec};
52#[cfg(feature = "serde")]
53use serde::{
54 de::{self, Deserialize, Deserializer, MapAccess, SeqAccess, Visitor},
55 ser::{Serialize, SerializeStruct, Serializer},
56};
57
58use core::cmp::Eq;
59use core::fmt;
60use core::hash;
61use core::iter::StepBy;
62use core::ops::Index;
63use core::ops::IndexMut;
64use core::slice::Iter;
65use core::slice::IterMut;
66use core::{cmp, convert::TryInto};
67
68#[doc(hidden)]
69#[macro_export]
70macro_rules! count {
71 () => (0usize);
72 ( $x:tt $($xs:tt)* ) => (1usize + $crate::count!($($xs)*));
73}
74
75#[macro_export]
101macro_rules! grid {
102 () => {
103 $crate::Grid::from_vec(vec![], 0)
104 };
105 ( [$( $x:expr ),* ]) => { {
106 let vec = vec![$($x),*];
107 let len = vec.len();
108 $crate::Grid::from_vec(vec, len)
109 } };
110 ( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => {
111 {
112 let mut _assert_width0 = [(); $crate::count!($($x0)*)];
113 let cols = $crate::count!($($x0)*);
114 let rows = 1usize;
115
116 $(
117 let _assert_width = [(); $crate::count!($($x)*)];
118 _assert_width0 = _assert_width;
119 let rows = rows + 1usize;
120 )*
121
122 let mut vec = Vec::with_capacity(rows.checked_mul(cols).unwrap());
123
124 $( vec.push($x0); )*
125 $( $( vec.push($x); )* )*
126
127 $crate::Grid::from_vec(vec, cols)
128 }
129 };
130}
131
132#[macro_export]
158macro_rules! grid_cm {
159 () => {
160 $crate::Grid::from_vec_with_order(vec![], 0, $crate::Order::ColumnMajor)
161 };
162 ( [$( $x:expr ),* ]) => { {
163 let vec = vec![$($x),*];
164 let len = vec.len();
165 $crate::Grid::from_vec_with_order(vec, len, $crate::Order::ColumnMajor)
166 } };
167 ( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => {
168 {
169 let mut _assert_width0 = [(); $crate::count!($($x0)*)];
170 let cols = $crate::count!($($x0)*);
171 let rows = 1usize;
172
173 $(
174 let _assert_width = [(); $crate::count!($($x)*)];
175 _assert_width0 = _assert_width;
176 let rows = rows + 1usize;
177 )*
178
179 let vec = Vec::with_capacity(rows.checked_mul(cols).unwrap());
180 let mut grid = $crate::Grid::from_vec_with_order(vec, cols, $crate::Order::ColumnMajor);
181
182 grid.push_row(vec![$($x0),*]);
183 $( grid.push_row(vec![$($x),*]); )*
184
185 grid
186 }
187 };
188}
189
190#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
192#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
193pub enum Order {
194 #[default]
196 RowMajor,
197
198 ColumnMajor,
200}
201
202impl Order {
203 const fn counterpart(self) -> Self {
204 match self {
205 Self::RowMajor => Self::ColumnMajor,
206 Self::ColumnMajor => Self::RowMajor,
207 }
208 }
209}
210
211pub struct Grid<T> {
219 data: Vec<T>,
220 cols: usize,
221 rows: usize,
222 order: Order,
223}
224
225#[cfg(feature = "serde")]
226impl<'de, T: Deserialize<'de>> Deserialize<'de> for Grid<T> {
227 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
228 where
229 D: Deserializer<'de>,
230 {
231 use std::marker::PhantomData;
232 #[derive(serde::Deserialize)]
233 #[serde(field_identifier, rename_all = "lowercase")]
234 enum Field {
235 Data,
236 Cols,
237 Order,
238 }
239
240 struct GridVisitor<T> {
241 _p: PhantomData<T>,
242 }
243
244 impl<'de, T: Deserialize<'de>> Visitor<'de> for GridVisitor<T> {
245 type Value = Grid<T>;
246
247 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
248 formatter.write_str("struct Grid")
249 }
250
251 fn visit_seq<V>(self, mut seq: V) -> Result<Grid<T>, V::Error>
252 where
253 V: SeqAccess<'de>,
254 {
255 let cols = seq
256 .next_element()?
257 .ok_or_else(|| de::Error::invalid_length(0, &self))?;
258 let data = seq
259 .next_element()?
260 .ok_or_else(|| de::Error::invalid_length(1, &self))?;
261 let order = seq.next_element()?.unwrap_or_default();
262 Ok(Grid::from_vec_with_order(data, cols, order))
263 }
264
265 fn visit_map<V>(self, mut map: V) -> Result<Grid<T>, V::Error>
266 where
267 V: MapAccess<'de>,
268 {
269 let mut cols = None;
270 let mut data = None;
271 let mut order = None;
272 while let Some(key) = map.next_key()? {
273 match key {
274 Field::Data => {
275 if data.is_some() {
276 return Err(de::Error::duplicate_field("data"));
277 }
278 data = Some(map.next_value()?);
279 }
280 Field::Cols => {
281 if cols.is_some() {
282 return Err(de::Error::duplicate_field("cols"));
283 }
284 cols = Some(map.next_value()?);
285 }
286 Field::Order => {
287 if order.is_some() {
288 return Err(de::Error::duplicate_field("order"));
289 }
290 order = Some(map.next_value()?);
291 }
292 }
293 }
294 let cols = cols.ok_or_else(|| de::Error::missing_field("cols"))?;
295 let data = data.ok_or_else(|| de::Error::missing_field("data"))?;
296 let order = order.unwrap_or_default();
297 Ok(Grid::from_vec_with_order(data, cols, order))
298 }
299 }
300
301 const FIELDS: &[&str] = &["cols", "data", "order"];
302 deserializer.deserialize_struct("Grid", FIELDS, GridVisitor { _p: PhantomData })
303 }
304}
305
306#[cfg(feature = "serde")]
307impl<T: Serialize> Serialize for Grid<T> {
308 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
309 where
310 S: Serializer,
311 {
312 let mut state = serializer.serialize_struct("Grid", 3)?;
314 state.serialize_field("cols", &self.cols)?;
315 state.serialize_field("data", &self.data)?;
316 state.serialize_field("order", &self.order)?;
317 state.end()
318 }
319}
320
321impl<T> Grid<T> {
322 #[must_use]
340 #[inline]
341 pub fn new(rows: usize, cols: usize) -> Self
342 where
343 T: Default,
344 {
345 Self::new_with_order(rows, cols, Order::default())
346 }
347
348 pub fn new_with_order(rows: usize, cols: usize, order: Order) -> Self
354 where
355 T: Default,
356 {
357 if rows == 0 || cols == 0 {
358 return Self {
359 data: Vec::new(),
360 rows: 0,
361 cols: 0,
362 order,
363 };
364 }
365 let mut data = Vec::new();
366 data.resize_with(rows.checked_mul(cols).unwrap(), T::default);
367 Self {
368 data,
369 cols,
370 rows,
371 order,
372 }
373 }
374
375 #[inline]
386 pub fn init(rows: usize, cols: usize, data: T) -> Self
387 where
388 T: Clone,
389 {
390 Self::init_with_order(rows, cols, Order::default(), data)
391 }
392
393 pub fn init_with_order(rows: usize, cols: usize, order: Order, data: T) -> Self
399 where
400 T: Clone,
401 {
402 if rows == 0 || cols == 0 {
403 return Self {
404 data: Vec::new(),
405 rows: 0,
406 cols: 0,
407 order,
408 };
409 }
410 Self {
411 data: vec![data; rows.checked_mul(cols).unwrap()],
412 cols,
413 rows,
414 order,
415 }
416 }
417
418 #[must_use]
425 pub fn with_capacity(rows: usize, cols: usize) -> Self {
426 Self::with_capacity_and_order(rows, cols, Order::default())
427 }
428
429 #[must_use]
435 pub fn with_capacity_and_order(rows: usize, cols: usize, order: Order) -> Self {
436 Self {
437 data: Vec::with_capacity(rows.checked_mul(cols).unwrap()),
438 cols: 0,
439 rows: 0,
440 order,
441 }
442 }
443
444 #[must_use]
473 #[inline]
474 pub fn from_vec(vec: Vec<T>, cols: usize) -> Self {
475 Self::from_vec_with_order(vec, cols, Order::default())
476 }
477
478 #[must_use]
484 pub fn from_vec_with_order(vec: Vec<T>, cols: usize, order: Order) -> Self {
485 let rows = vec.len().checked_div(cols).unwrap_or(0);
486 assert_eq!(
487 rows * cols,
488 vec.len(),
489 "Vector length {:?} should be a multiple of cols = {:?}",
490 vec.len(),
491 cols
492 );
493 if rows == 0 || cols == 0 {
494 Self {
495 data: vec,
496 rows: 0,
497 cols: 0,
498 order,
499 }
500 } else {
501 Self {
502 data: vec,
503 rows,
504 cols,
505 order,
506 }
507 }
508 }
509
510 #[inline]
511 #[must_use]
512 fn safe_add(lhs: usize, rhs: usize) -> usize {
513 lhs.checked_add(rhs).expect("grid dimensions overflow")
514 }
515
516 #[inline]
517 #[must_use]
518 fn safe_multiply(rows: usize, cols: usize) -> usize {
519 rows.checked_mul(cols).expect("grid dimensions overflow")
520 }
521
522 #[inline]
524 #[must_use]
525 const fn get_index(&self, row: usize, col: usize) -> usize {
526 match self.order {
527 Order::RowMajor => row * self.cols + col,
528 Order::ColumnMajor => col * self.rows + row,
529 }
530 }
531
532 #[inline]
539 #[must_use]
540 pub unsafe fn get_unchecked(&self, row: impl Into<usize>, col: impl Into<usize>) -> &T {
541 let index = self.get_index(row.into(), col.into());
542 self.data.get_unchecked(index)
543 }
544
545 #[inline]
552 #[must_use]
553 pub unsafe fn get_unchecked_mut(
554 &mut self,
555 row: impl Into<usize>,
556 col: impl Into<usize>,
557 ) -> &mut T {
558 let index = self.get_index(row.into(), col.into());
559 self.data.get_unchecked_mut(index)
560 }
561
562 #[must_use]
565 pub fn get(&self, row: impl TryInto<usize>, col: impl TryInto<usize>) -> Option<&T> {
566 let row_usize = row.try_into().ok()?;
567 let col_usize = col.try_into().ok()?;
568 if row_usize < self.rows && col_usize < self.cols {
569 unsafe { Some(self.get_unchecked(row_usize, col_usize)) }
570 } else {
571 None
572 }
573 }
574
575 #[must_use]
578 pub fn get_mut(
579 &mut self,
580 row: impl TryInto<usize>,
581 col: impl TryInto<usize>,
582 ) -> Option<&mut T> {
583 let row_usize = row.try_into().ok()?;
584 let col_usize = col.try_into().ok()?;
585 if row_usize < self.rows && col_usize < self.cols {
586 unsafe { Some(self.get_unchecked_mut(row_usize, col_usize)) }
587 } else {
588 None
589 }
590 }
591
592 #[must_use]
595 pub const fn size(&self) -> (usize, usize) {
596 (self.rows, self.cols)
597 }
598
599 #[must_use]
601 pub const fn rows(&self) -> usize {
602 self.rows
603 }
604
605 #[must_use]
607 pub const fn cols(&self) -> usize {
608 self.cols
609 }
610
611 #[must_use]
613 pub const fn order(&self) -> Order {
614 self.order
615 }
616
617 #[must_use]
625 pub fn is_empty(&self) -> bool {
626 self.data.is_empty()
627 }
628
629 pub fn clear(&mut self) {
633 self.rows = 0;
634 self.cols = 0;
635 self.data.clear();
636 }
637
638 pub fn iter(&self) -> Iter<'_, T> {
655 self.data.iter()
656 }
657
658 pub fn iter_mut(&mut self) -> IterMut<'_, T> {
671 self.data.iter_mut()
672 }
673
674 pub fn iter_col(&self, col: usize) -> StepBy<Iter<'_, T>> {
696 assert!(
697 col < self.cols,
698 "out of bounds. Column must be less than {:?}, but is {:?}",
699 self.cols,
700 col
701 );
702 match self.order {
703 Order::RowMajor => self.data[col..].iter().step_by(self.cols),
704 Order::ColumnMajor => {
705 let start = col * self.rows;
706 self.data[start..(start + self.rows)].iter().step_by(1)
707 }
708 }
709 }
710
711 pub fn iter_col_mut(&mut self, col: usize) -> StepBy<IterMut<'_, T>> {
734 assert!(
735 col < self.cols,
736 "out of bounds. Column must be less than {:?}, but is {:?}",
737 self.cols,
738 col
739 );
740 match self.order {
741 Order::RowMajor => self.data[col..].iter_mut().step_by(self.cols),
742 Order::ColumnMajor => {
743 let start = col * self.rows;
744 self.data[start..(start + self.rows)].iter_mut().step_by(1)
745 }
746 }
747 }
748
749 pub fn iter_row(&self, row: usize) -> StepBy<Iter<'_, T>> {
771 assert!(
772 row < self.rows,
773 "out of bounds. Row must be less than {:?}, but is {:?}",
774 self.rows,
775 row
776 );
777 match self.order {
778 Order::RowMajor => {
779 let start = row * self.cols;
780 self.data[start..(start + self.cols)].iter().step_by(1)
781 }
782 Order::ColumnMajor => self.data[row..].iter().step_by(self.rows),
783 }
784 }
785
786 pub fn iter_row_mut(&mut self, row: usize) -> StepBy<IterMut<'_, T>> {
807 assert!(
808 row < self.rows,
809 "out of bounds. Row must be less than {:?}, but is {:?}",
810 self.rows,
811 row
812 );
813 match self.order {
814 Order::RowMajor => {
815 let start = row * self.cols;
816 self.data[start..(start + self.cols)].iter_mut().step_by(1)
817 }
818 Order::ColumnMajor => self.data[row..].iter_mut().step_by(self.rows),
819 }
820 }
821
822 pub fn indexed_iter(&self) -> impl Iterator<Item = ((usize, usize), &T)> {
846 self.data.iter().enumerate().map(move |(idx, i)| {
847 let position = match self.order {
848 Order::RowMajor => (idx / self.cols, idx % self.cols),
849 Order::ColumnMajor => (idx % self.rows, idx / self.rows),
850 };
851 (position, i)
852 })
853 }
854
855 pub fn indexed_iter_mut(&mut self) -> impl Iterator<Item = ((usize, usize), &mut T)> {
886 let order = self.order;
887 let cols = self.cols;
888 let rows = self.rows;
889
890 self.data.iter_mut().enumerate().map(move |(idx, i)| {
891 let position = match order {
892 Order::RowMajor => (idx / cols, idx % cols),
893 Order::ColumnMajor => (idx % rows, idx / rows),
894 };
895 (position, i)
896 })
897 }
898
899 pub fn indexed_into_iter(self) -> impl Iterator<Item = ((usize, usize), T)> {
927 let Self {
928 data,
929 cols,
930 rows,
931 order,
932 } = self;
933 data.into_iter().enumerate().map(move |(idx, i)| {
934 let position = match order {
935 Order::RowMajor => (idx / cols, idx % cols),
936 Order::ColumnMajor => (idx % rows, idx / rows),
937 };
938 (position, i)
939 })
940 }
941
942 pub fn push_row(&mut self, row: Vec<T>) {
977 assert_ne!(row.len(), 0);
978 assert!(
979 !(self.rows > 0 && row.len() != self.cols),
980 "pushed row does not match. Length must be {:?}, but was {:?}.",
981 self.cols,
982 row.len()
983 );
984 self.data.extend(row);
985 if self.order == Order::ColumnMajor {
986 for i in (1..self.cols).rev() {
987 let col_idx = i * self.rows;
988 self.data[col_idx..col_idx + self.rows + i].rotate_right(i);
989 }
990 }
991 self.rows = Self::safe_add(self.rows, 1);
992 if self.cols == 0 {
993 self.cols = self.data.len();
994 }
995 }
996
997 pub fn push_col(&mut self, col: Vec<T>) {
1032 assert_ne!(col.len(), 0);
1033 assert!(
1034 !(self.cols > 0 && col.len() != self.rows),
1035 "pushed column does not match. Length must be {:?}, but was {:?}.",
1036 self.rows,
1037 col.len()
1038 );
1039 self.data.extend(col);
1040 if self.order == Order::RowMajor {
1041 for i in (1..self.rows).rev() {
1042 let row_idx = i * self.cols;
1043 self.data[row_idx..row_idx + self.cols + i].rotate_right(i);
1044 }
1045 }
1046 self.cols = Self::safe_add(self.cols, 1);
1047 if self.rows == 0 {
1048 self.rows = self.data.len();
1049 }
1050 }
1051
1052 pub fn pop_row(&mut self) -> Option<Vec<T>> {
1067 if self.rows == 0 {
1068 return None;
1069 }
1070 if self.order == Order::ColumnMajor {
1071 for i in 1..self.cols {
1072 let col_idx = i * (self.rows - 1);
1073 self.data[col_idx..col_idx + self.rows + i - 1].rotate_left(i);
1074 }
1075 }
1076 let row = self.data.split_off(self.data.len() - self.cols);
1077 self.rows -= 1;
1078 if self.rows == 0 {
1079 self.cols = 0;
1080 }
1081 Some(row)
1082 }
1083
1084 pub fn remove_row(&mut self, row_index: usize) -> Option<Vec<T>> {
1100 if self.cols == 0 || self.rows == 0 || row_index >= self.rows {
1101 return None;
1102 }
1103 let row = match self.order {
1104 Order::RowMajor => self
1105 .data
1106 .drain((row_index * self.cols)..((row_index + 1) * self.cols))
1107 .collect(),
1108 Order::ColumnMajor => {
1109 for i in 0..self.cols {
1110 let col_idx = row_index + i * (self.rows - 1);
1111 let end = cmp::min(col_idx + self.rows + i, self.data.len());
1112 self.data[col_idx..end].rotate_left(i + 1);
1113 }
1114 self.data.split_off(self.data.len() - self.cols)
1115 }
1116 };
1117 self.rows -= 1;
1118 if self.rows == 0 {
1119 self.cols = 0;
1120 }
1121 Some(row)
1122 }
1123
1124 pub fn pop_col(&mut self) -> Option<Vec<T>> {
1144 if self.cols == 0 {
1145 return None;
1146 }
1147 if self.order == Order::RowMajor {
1148 for i in 1..self.rows {
1149 let row_idx = i * (self.cols - 1);
1150 self.data[row_idx..row_idx + self.cols + i - 1].rotate_left(i);
1151 }
1152 }
1153 let col = self.data.split_off(self.data.len() - self.rows);
1154 self.cols -= 1;
1155 if self.cols == 0 {
1156 self.rows = 0;
1157 }
1158 Some(col)
1159 }
1160
1161 pub fn remove_col(&mut self, col_index: usize) -> Option<Vec<T>> {
1179 if self.cols == 0 || self.rows == 0 || col_index >= self.cols {
1180 return None;
1181 }
1182 let col = match self.order {
1183 Order::RowMajor => {
1184 for i in 0..self.rows {
1185 let row_idx = col_index + i * (self.cols - 1);
1186 let end = cmp::min(row_idx + self.cols + i, self.data.len());
1187 self.data[row_idx..end].rotate_left(i + 1);
1188 }
1189 self.data.split_off(self.data.len() - self.rows)
1190 }
1191 Order::ColumnMajor => self
1192 .data
1193 .drain((col_index * self.rows)..((col_index + 1) * self.rows))
1194 .collect(),
1195 };
1196 self.cols -= 1;
1197 if self.cols == 0 {
1198 self.rows = 0;
1199 }
1200 Some(col)
1201 }
1202
1203 pub fn delete_row(&mut self, row_index: usize) -> bool {
1229 if self.cols == 0 || self.rows == 0 || row_index >= self.rows {
1230 return false;
1231 }
1232 match self.order {
1233 Order::RowMajor => {
1234 let start = row_index * self.cols;
1235 let end = (row_index + 1) * self.cols;
1236 self.data.drain(start..end);
1237 }
1238 Order::ColumnMajor => {
1239 for i in 0..self.cols {
1240 let col_idx = row_index + i * (self.rows - 1);
1241 let end = cmp::min(col_idx + self.rows + i, self.data.len());
1242 self.data[col_idx..end].rotate_left(i + 1);
1243 }
1244 self.data.truncate(self.data.len() - self.cols);
1245 }
1246 }
1247 self.rows -= 1;
1248 if self.rows == 0 {
1249 self.cols = 0;
1250 }
1251 true
1252 }
1253
1254 pub fn delete_col(&mut self, col_index: usize) -> bool {
1278 if self.cols == 0 || self.rows == 0 || col_index >= self.cols {
1279 return false;
1280 }
1281 match self.order {
1282 Order::RowMajor => {
1283 for i in 0..self.rows {
1284 let row_idx = col_index + i * (self.cols - 1);
1285 let end = cmp::min(row_idx + self.cols + i, self.data.len());
1286 self.data[row_idx..end].rotate_left(i + 1);
1287 }
1288 self.data.truncate(self.data.len() - self.rows);
1289 }
1290 Order::ColumnMajor => {
1291 let start = col_index * self.rows;
1292 let end = (col_index + 1) * self.rows;
1293 self.data.drain(start..end);
1294 }
1295 }
1296 self.cols -= 1;
1297 if self.cols == 0 {
1298 self.rows = 0;
1299 }
1300 true
1301 }
1302
1303 pub fn insert_row(&mut self, index: usize, row: Vec<T>) {
1324 let input_len = row.len();
1325 assert_ne!(input_len, 0, "Inserted row must not be empty.");
1326 assert!(
1327 !(self.cols > 0 && input_len != self.cols),
1328 "Inserted row must be of length {}, but was {}.",
1329 self.cols,
1330 row.len()
1331 );
1332 assert!(
1333 index <= self.rows,
1334 "Out of range. Index was {}, but must be less or equal to {}.",
1335 index,
1336 self.rows
1337 );
1338 match self.order {
1339 Order::RowMajor => {
1340 let data_idx = index * input_len;
1341 self.data.splice(data_idx..data_idx, row);
1342 }
1343 Order::ColumnMajor => {
1344 for (col_iter, row_val) in row.into_iter().enumerate() {
1345 let data_idx = col_iter * self.rows + index + col_iter;
1346 self.data.insert(data_idx, row_val);
1347 }
1348 }
1349 }
1350 self.cols = input_len;
1351 self.rows = Self::safe_add(self.rows, 1);
1352 }
1353
1354 pub fn insert_col(&mut self, index: usize, col: Vec<T>) {
1379 let input_len = col.len();
1380 assert_ne!(input_len, 0, "Inserted col must not be empty.");
1381 assert!(
1382 !(self.rows > 0 && input_len != self.rows),
1383 "Inserted col must be of length {}, but was {}.",
1384 self.rows,
1385 col.len()
1386 );
1387 assert!(
1388 index <= self.cols,
1389 "Out of range. Index was {}, but must be less or equal to {}.",
1390 index,
1391 self.cols
1392 );
1393 match self.order {
1394 Order::RowMajor => {
1395 for (row_iter, col_val) in col.into_iter().enumerate() {
1396 let data_idx = row_iter * self.cols + index + row_iter;
1397 self.data.insert(data_idx, col_val);
1398 }
1399 }
1400 Order::ColumnMajor => {
1401 let data_idx = index * input_len;
1402 self.data.splice(data_idx..data_idx, col);
1403 }
1404 }
1405 self.rows = input_len;
1406 self.cols = Self::safe_add(self.cols, 1);
1407 }
1408
1409 #[must_use]
1422 pub const fn flatten(&self) -> &Vec<T> {
1423 &self.data
1424 }
1425
1426 #[must_use]
1431 pub fn into_vec(self) -> Vec<T> {
1432 self.data
1433 }
1434
1435 pub fn transpose(&mut self) {
1439 self.order = self.order.counterpart();
1440 core::mem::swap(&mut self.rows, &mut self.cols);
1441 }
1442
1443 pub fn flip_cols(&mut self) {
1458 match self.order {
1459 Order::RowMajor => {
1460 for row in 0..self.rows {
1461 let idx = row * self.cols;
1462 self.data[idx..idx + self.cols].reverse();
1463 }
1464 }
1465 Order::ColumnMajor => {
1466 for col in 0..self.cols / 2 {
1467 for row in 0..self.rows {
1468 let cell1 = self.get_index(row, col);
1469 let cell2 = self.get_index(row, self.cols - col - 1);
1470 self.data.swap(cell1, cell2);
1471 }
1472 }
1473 }
1474 }
1475 }
1476
1477 pub fn flip_rows(&mut self) {
1493 match self.order {
1494 Order::RowMajor => {
1495 for row in 0..self.rows / 2 {
1496 for col in 0..self.cols {
1497 let cell1 = self.get_index(row, col);
1498 let cell2 = self.get_index(self.rows - row - 1, col);
1499 self.data.swap(cell1, cell2);
1500 }
1501 }
1502 }
1503 Order::ColumnMajor => {
1504 for col in 0..self.cols {
1505 let idx = col * self.rows;
1506 self.data[idx..idx + self.rows].reverse();
1507 }
1508 }
1509 }
1510 }
1511
1512 pub fn rotate_left(&mut self) {
1530 self.transpose();
1531 self.flip_rows();
1532 }
1533
1534 pub fn rotate_right(&mut self) {
1552 self.transpose();
1553 self.flip_cols();
1554 }
1555
1556 pub fn rotate_half(&mut self) {
1573 self.data.reverse();
1574 }
1575
1576 pub fn fill(&mut self, value: T)
1587 where
1588 T: Clone,
1589 {
1590 self.data.fill(value);
1591 }
1592
1593 pub fn fill_with<F>(&mut self, f: F)
1611 where
1612 F: FnMut() -> T,
1613 {
1614 self.data.fill_with(f);
1615 }
1616
1617 pub fn map<U, F>(self, f: F) -> Grid<U>
1632 where
1633 F: FnMut(T) -> U,
1634 {
1635 Grid {
1636 data: self.data.into_iter().map(f).collect(),
1637 cols: self.cols,
1638 rows: self.rows,
1639 order: self.order,
1640 }
1641 }
1642
1643 #[must_use]
1659 pub fn map_ref<U, F>(&self, f: F) -> Grid<U>
1660 where
1661 F: Fn(&T) -> U,
1662 {
1663 Grid {
1664 data: self.data.iter().map(f).collect(),
1665 cols: self.cols,
1666 rows: self.rows,
1667 order: self.order,
1668 }
1669 }
1670
1671 #[must_use]
1686 pub const fn iter_rows(&self) -> GridRowIter<'_, T> {
1687 GridRowIter {
1688 grid: self,
1689 row_start_index: 0,
1690 row_end_index: self.rows,
1691 }
1692 }
1693
1694 #[must_use]
1709 pub const fn iter_cols(&self) -> GridColIter<'_, T> {
1710 GridColIter {
1711 grid: self,
1712 col_start_index: 0,
1713 col_end_index: self.cols,
1714 }
1715 }
1716
1717 pub fn swap(&mut self, (row_a, col_a): (usize, usize), (row_b, col_b): (usize, usize)) {
1724 assert!(
1725 !(row_a >= self.rows || col_a >= self.cols),
1726 "grid index out of bounds: ({row_a},{col_a}) out of ({},{})",
1727 self.rows,
1728 self.cols
1729 );
1730 assert!(
1731 !(row_b >= self.rows || col_b >= self.cols),
1732 "grid index out of bounds: ({row_b},{col_b}) out of ({},{})",
1733 self.rows,
1734 self.cols
1735 );
1736
1737 let a_idx = self.get_index(row_a, col_a);
1738 let b_idx = self.get_index(row_b, col_b);
1739
1740 self.data.swap(a_idx, b_idx);
1741 }
1742}
1743
1744impl<T: Default> Grid<T> {
1745 pub fn expand_rows(&mut self, rows: usize) {
1767 if rows > 0 && self.cols > 0 {
1768 let new_rows = Self::safe_add(self.rows, rows);
1769 let new_len = Self::safe_multiply(new_rows, self.cols);
1770 self.data.resize_with(new_len, T::default);
1771
1772 if self.order == Order::ColumnMajor {
1773 for row_added in 0..rows {
1774 for i in (1..self.cols).rev() {
1775 let total_rows = self.rows + row_added;
1776 let col_idx = i * total_rows;
1777 self.data[col_idx..col_idx + total_rows + i].rotate_right(i);
1778 }
1779 }
1780 }
1781 self.rows = new_rows;
1782 }
1783 }
1784
1785 pub fn expand_cols(&mut self, cols: usize) {
1805 if cols > 0 && self.rows > 0 {
1806 let new_cols = Self::safe_add(self.cols, cols);
1807 let new_len = Self::safe_multiply(self.rows, new_cols);
1808 self.data.resize_with(new_len, T::default);
1809
1810 if self.order == Order::RowMajor {
1811 for col_added in 0..cols {
1812 for i in (1..self.rows).rev() {
1813 let total_cols = self.cols + col_added;
1814 let row_idx = i * total_cols;
1815 self.data[row_idx..row_idx + total_cols + i].rotate_right(i);
1816 }
1817 }
1818 }
1819 self.cols = new_cols;
1820 }
1821 }
1822
1823 pub fn prepend_rows(&mut self, rows: usize) {
1845 if rows > 0 && self.cols > 0 {
1846 let new_rows = Self::safe_add(self.rows, rows);
1847 let new_len = Self::safe_multiply(new_rows, self.cols);
1848 self.data.resize_with(new_len, T::default);
1849
1850 match self.order {
1851 Order::RowMajor => {
1852 for i in (0..self.rows).rev() {
1853 let s = i * self.cols;
1854 let e = (i + rows + 1) * self.cols;
1855 self.data[s..e].rotate_left(self.cols);
1856 }
1857 }
1858 Order::ColumnMajor => {
1859 for row_added in 0..rows {
1860 for i in (0..self.cols).rev() {
1861 let total_rows = self.rows + row_added;
1862 let col_idx = i * total_rows;
1863 self.data[col_idx..=col_idx + total_rows + i].rotate_right(i + 1);
1864 }
1865 }
1866 }
1867 }
1868 self.rows = new_rows;
1869 }
1870 }
1871
1872 pub fn prepend_cols(&mut self, cols: usize) {
1892 if cols > 0 && self.rows > 0 {
1893 let new_cols = Self::safe_add(self.cols, cols);
1894 let new_len = Self::safe_multiply(self.rows, new_cols);
1895 self.data.resize_with(new_len, T::default);
1896
1897 match self.order {
1898 Order::RowMajor => {
1899 for col_added in 0..cols {
1900 for i in (0..self.rows).rev() {
1901 let total_cols = self.cols + col_added;
1902 let row_idx = i * total_cols;
1903 self.data[row_idx..=row_idx + total_cols + i].rotate_right(i + 1);
1904 }
1905 }
1906 }
1907 Order::ColumnMajor => {
1908 for i in (0..self.cols).rev() {
1909 let s = i * self.rows;
1910 let e = (i + cols + 1) * self.rows;
1911 self.data[s..e].rotate_left(self.rows);
1912 }
1913 }
1914 }
1915 self.cols = new_cols;
1916 }
1917 }
1918}
1919
1920impl<T> Default for Grid<T> {
1921 fn default() -> Self {
1922 Self {
1923 data: Vec::default(),
1924 cols: 0,
1925 rows: 0,
1926 order: Order::default(),
1927 }
1928 }
1929}
1930
1931impl<T: Clone> Clone for Grid<T> {
1932 fn clone(&self) -> Self {
1933 Self {
1934 rows: self.rows,
1935 cols: self.cols,
1936 data: self.data.clone(),
1937 order: self.order,
1938 }
1939 }
1940}
1941
1942impl<T: hash::Hash> hash::Hash for Grid<T> {
1943 #[inline]
1944 fn hash<H: hash::Hasher>(&self, state: &mut H) {
1945 self.rows.hash(state);
1946 self.cols.hash(state);
1947 self.order.hash(state);
1948 self.data.hash(state);
1949 }
1950}
1951
1952impl<T> Index<(usize, usize)> for Grid<T> {
1953 type Output = T;
1954
1955 #[inline]
1956 fn index(&self, (row, col): (usize, usize)) -> &T {
1957 assert!(
1958 !(row >= self.rows || col >= self.cols),
1959 "grid index out of bounds: ({row},{col}) out of ({},{})",
1960 self.rows,
1961 self.cols
1962 );
1963 let index = self.get_index(row, col);
1964 &self.data[index]
1965 }
1966}
1967
1968impl<T> IndexMut<(usize, usize)> for Grid<T> {
1969 #[inline]
1970 fn index_mut(&mut self, (row, col): (usize, usize)) -> &mut T {
1971 assert!(
1972 !(row >= self.rows || col >= self.cols),
1973 "grid index out of bounds: ({row},{col}) out of ({},{})",
1974 self.rows,
1975 self.cols
1976 );
1977 let index = self.get_index(row, col);
1978 &mut self.data[index]
1979 }
1980}
1981
1982impl<T> IntoIterator for Grid<T> {
1983 type IntoIter = <Vec<T> as IntoIterator>::IntoIter;
1984 type Item = T;
1985
1986 fn into_iter(self) -> Self::IntoIter {
1987 self.data.into_iter()
1988 }
1989}
1990
1991impl<'a, T> IntoIterator for &'a Grid<T> {
1992 type IntoIter = core::slice::Iter<'a, T>;
1993 type Item = &'a T;
1994
1995 fn into_iter(self) -> Self::IntoIter {
1996 self.iter()
1997 }
1998}
1999
2000impl<'a, T> IntoIterator for &'a mut Grid<T> {
2001 type IntoIter = core::slice::IterMut<'a, T>;
2002 type Item = &'a mut T;
2003
2004 fn into_iter(self) -> Self::IntoIter {
2005 self.iter_mut()
2006 }
2007}
2008
2009impl<T: fmt::Debug> fmt::Debug for Grid<T> {
2010 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2011 write!(f, "[")?;
2012 if self.cols > 0 {
2013 if f.alternate() {
2014 writeln!(f)?;
2015 let width = f.width().unwrap_or_else(|| {
2022 self.data
2024 .iter()
2025 .map(|i| format!("{i:?}").len())
2026 .max()
2027 .unwrap()
2028 });
2029 let precision = f.precision().unwrap_or(2);
2030 for mut row in self.iter_rows().map(Iterator::peekable) {
2031 write!(f, " [")?;
2032 while let Some(item) = row.next() {
2033 write!(f, " {item:width$.precision$?}")?;
2034 if row.peek().is_some() {
2035 write!(f, ",")?;
2036 }
2037 }
2038 writeln!(f, "]")?;
2039 }
2040 } else {
2041 for row in self.iter_rows() {
2042 f.debug_list().entries(row).finish()?;
2043 }
2044 }
2045 }
2046 write!(f, "]")
2047 }
2048}
2049
2050impl<T: PartialEq> PartialEq for Grid<T> {
2051 fn eq(&self, other: &Self) -> bool {
2052 if self.rows != other.rows || self.cols != other.cols {
2053 return false;
2054 }
2055 if self.order == other.order {
2056 return self.data == other.data;
2057 }
2058 for (self_row, other_row) in core::iter::zip(self.iter_rows(), other.iter_rows()) {
2059 if self_row.ne(other_row) {
2060 return false;
2061 }
2062 }
2063 true
2064 }
2065}
2066
2067impl<T: Eq> Eq for Grid<T> {}
2068
2069impl<T> From<Vec<Vec<T>>> for Grid<T> {
2070 #[allow(clippy::redundant_closure_for_method_calls)]
2071 fn from(vec: Vec<Vec<T>>) -> Self {
2072 let cols = vec.first().map_or(0, |row| row.len());
2073 Self::from_vec_with_order(vec.into_iter().flatten().collect(), cols, Order::default())
2074 }
2075}
2076
2077impl<T: Clone> From<&Vec<Vec<T>>> for Grid<T> {
2078 #[allow(clippy::redundant_closure_for_method_calls)]
2079 fn from(vec: &Vec<Vec<T>>) -> Self {
2080 let cols = vec.first().map_or(0, |row| row.len());
2081 Self::from_vec_with_order(
2082 vec.clone().into_iter().flatten().collect(),
2083 cols,
2084 Order::default(),
2085 )
2086 }
2087}
2088
2089impl<T: Clone> From<&Vec<&Vec<T>>> for Grid<T> {
2090 #[allow(clippy::redundant_closure_for_method_calls)]
2091 fn from(vec: &Vec<&Vec<T>>) -> Self {
2092 let cols = vec.first().map_or(0, |row| row.len());
2093 Self::from_vec_with_order(
2094 vec.clone()
2095 .into_iter()
2096 .flat_map(|inner| inner.clone())
2097 .collect(),
2098 cols,
2099 Order::default(),
2100 )
2101 }
2102}
2103
2104impl<T> From<(Vec<T>, usize)> for Grid<T> {
2105 fn from(value: (Vec<T>, usize)) -> Self {
2106 Self::from_vec_with_order(value.0, value.1, Order::default())
2107 }
2108}
2109
2110impl<T: Clone> From<(&Vec<T>, usize)> for Grid<T> {
2111 fn from(value: (&Vec<T>, usize)) -> Self {
2112 Self::from_vec_with_order(value.0.clone(), value.1, Order::default())
2113 }
2114}
2115
2116impl<T: Clone> From<(&Vec<T>, &usize)> for Grid<T> {
2117 fn from(value: (&Vec<T>, &usize)) -> Self {
2118 Self::from_vec_with_order(value.0.clone(), *value.1, Order::default())
2119 }
2120}
2121
2122#[derive(Clone)]
2123pub struct GridRowIter<'a, T> {
2124 grid: &'a Grid<T>,
2125 row_start_index: usize,
2126 row_end_index: usize,
2127}
2128
2129#[derive(Clone)]
2130pub struct GridColIter<'a, T> {
2131 grid: &'a Grid<T>,
2132 col_start_index: usize,
2133 col_end_index: usize,
2134}
2135
2136impl<'a, T> Iterator for GridRowIter<'a, T> {
2137 type Item = StepBy<Iter<'a, T>>;
2138
2139 fn next(&mut self) -> Option<Self::Item> {
2140 if self.row_start_index >= self.row_end_index {
2141 return None;
2142 }
2143
2144 let row_iter = self.grid.iter_row(self.row_start_index);
2145 self.row_start_index += 1;
2146 Some(row_iter)
2147 }
2148
2149 fn size_hint(&self) -> (usize, Option<usize>) {
2150 let size = self.row_end_index - self.row_start_index;
2151 (size, Some(size))
2152 }
2153}
2154
2155impl<T> ExactSizeIterator for GridRowIter<'_, T> {}
2156
2157impl<T> DoubleEndedIterator for GridRowIter<'_, T> {
2158 fn next_back(&mut self) -> Option<Self::Item> {
2159 if self.row_start_index >= self.row_end_index {
2160 return None;
2161 }
2162
2163 let row_iter = self.grid.iter_row(self.row_end_index - 1);
2164 self.row_end_index -= 1;
2165 Some(row_iter)
2166 }
2167}
2168
2169impl<'a, T> Iterator for GridColIter<'a, T> {
2170 type Item = StepBy<Iter<'a, T>>;
2171
2172 fn next(&mut self) -> Option<Self::Item> {
2173 if self.col_start_index >= self.col_end_index {
2174 return None;
2175 }
2176
2177 let col_iter = self.grid.iter_col(self.col_start_index);
2178 self.col_start_index += 1;
2179 Some(col_iter)
2180 }
2181
2182 fn size_hint(&self) -> (usize, Option<usize>) {
2183 let size = self.col_end_index - self.col_start_index;
2184 (size, Some(size))
2185 }
2186}
2187
2188impl<T> ExactSizeIterator for GridColIter<'_, T> {}
2189
2190impl<T> DoubleEndedIterator for GridColIter<'_, T> {
2191 fn next_back(&mut self) -> Option<Self::Item> {
2192 if self.col_start_index >= self.col_end_index {
2193 return None;
2194 }
2195
2196 let col_iter = self.grid.iter_col(self.col_end_index - 1);
2197 self.col_end_index -= 1;
2198 Some(col_iter)
2199 }
2200}
2201
2202#[cfg(test)]
2203mod test {
2204 use super::*;
2205 #[cfg(not(feature = "std"))]
2206 use alloc::string::String;
2207
2208 fn test_grid<T>(grid: &Grid<T>, rows: usize, cols: usize, order: Order, data: &[T])
2209 where
2210 T: fmt::Debug + PartialEq,
2211 {
2212 assert_eq!(grid.rows, rows, "number of rows is unexpected");
2213 assert_eq!(grid.cols, cols, "number of cols is unexpected");
2214 assert_eq!(grid.order, order, "grid order is unexpected");
2215 assert_eq!(grid.data, data, "internal data is unexpected");
2216 }
2217
2218 #[test]
2219 fn from_1d_vec() {
2220 let grid: Grid<u8> = Grid::from((vec![1, 2, 3], 1));
2221 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
2222 }
2223
2224 #[test]
2225 #[should_panic]
2226 #[allow(clippy::should_panic_without_expect)]
2227 fn from_1d_vec_panic() {
2228 let _: Grid<u8> = Grid::from((vec![1, 2, 3], 2));
2229 }
2230
2231 #[test]
2232 fn from_1d_vec_reference() {
2233 let vec = vec![1, 2, 3];
2234 let grid: Grid<u8> = Grid::from((&vec, 1));
2235 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
2236 }
2237
2238 #[test]
2239 #[should_panic]
2240 #[allow(clippy::should_panic_without_expect)]
2241 fn from_1d_vec_reference_panic() {
2242 let vec = vec![1, 2, 3];
2243 let _: Grid<u8> = Grid::from((&vec, 2));
2244 }
2245
2246 #[test]
2247 fn from_1d_vec_reference_and_reference() {
2248 let vec = vec![1, 2, 3];
2249 let cols = 1;
2250 let grid: Grid<u8> = Grid::from((&vec, &cols));
2251 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
2252 }
2253
2254 #[test]
2255 #[should_panic]
2256 #[allow(clippy::should_panic_without_expect)]
2257 fn from_1d_vec_reference_and_reference_panic() {
2258 let vec = vec![1, 2, 3];
2259 let cols = 2;
2260 let _: Grid<u8> = Grid::from((&vec, &cols));
2261 }
2262
2263 #[test]
2264 fn from_2d_vec() {
2265 let grid: Grid<u8> = Grid::from(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]);
2266 test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
2267 }
2268
2269 #[test]
2270 #[should_panic]
2271 #[allow(clippy::should_panic_without_expect)]
2272 fn from_2d_vec_panic() {
2273 let _: Grid<u8> = Grid::from(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8]]);
2274 }
2275
2276 #[test]
2277 fn from_2d_vec_reference() {
2278 let vec = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
2279 let grid: Grid<u8> = Grid::from(&vec);
2280 test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
2281 }
2282
2283 #[test]
2284 #[should_panic]
2285 #[allow(clippy::should_panic_without_expect)]
2286 fn from_2d_vec_reference_panic() {
2287 let vec = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8]];
2288 let _: Grid<u8> = Grid::from(&vec);
2289 }
2290
2291 #[test]
2292 fn from_2d_vec_reference_of_references() {
2293 let inner_vec1 = vec![1, 2, 3];
2294 let inner_vec2 = vec![4, 5, 6];
2295 let inner_vec3 = vec![7, 8, 9];
2296 let vec = vec![&inner_vec1, &inner_vec2, &inner_vec3];
2297 let grid: Grid<u8> = Grid::from(&vec);
2298 test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
2299 }
2300
2301 #[test]
2302 #[should_panic]
2303 #[allow(clippy::should_panic_without_expect)]
2304 fn from_2d_vec_reference_of_references_panic() {
2305 let inner_vec1 = vec![1, 2, 3];
2306 let inner_vec2 = vec![4, 5, 6];
2307 let inner_vec3 = vec![7, 8];
2308 let vec = vec![&inner_vec1, &inner_vec2, &inner_vec3];
2309 let _: Grid<u8> = Grid::from(&vec);
2310 }
2311
2312 #[test]
2313 fn from_vec_zero_with_cols() {
2314 let grid: Grid<u8> = Grid::from_vec(vec![], 1);
2315 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2316 }
2317
2318 #[test]
2319 fn from_vec_zero() {
2320 let grid: Grid<u8> = Grid::from_vec(vec![], 0);
2321 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2322 }
2323
2324 #[test]
2325 #[should_panic]
2326 #[allow(clippy::should_panic_without_expect)]
2327 fn from_vec_panics_1() {
2328 let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 0);
2329 }
2330
2331 #[test]
2332 #[should_panic]
2333 #[allow(clippy::should_panic_without_expect)]
2334 fn from_vec_panics_2() {
2335 let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 2);
2336 }
2337
2338 #[test]
2339 fn from_vec_uses_original_vec() {
2340 let capacity = 10_000_000;
2341 let vec = Vec::with_capacity(capacity);
2342 let grid: Grid<u8> = Grid::from_vec(vec, 0);
2343 assert!(grid.into_vec().capacity() >= capacity);
2344 }
2345
2346 #[test]
2347 fn from_vec_with_order_zero_with_cols() {
2348 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 1, Order::ColumnMajor);
2349 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2350 }
2351
2352 #[test]
2353 fn from_vec_with_order_zero() {
2354 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2355 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2356 }
2357
2358 #[test]
2359 #[should_panic]
2360 #[allow(clippy::should_panic_without_expect)]
2361 fn from_vec_with_order_panics_1() {
2362 let _: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 0, Order::ColumnMajor);
2363 }
2364
2365 #[test]
2366 #[should_panic]
2367 #[allow(clippy::should_panic_without_expect)]
2368 fn from_vec_with_order_panics_2() {
2369 let _: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 2, Order::ColumnMajor);
2370 }
2371
2372 #[test]
2373 fn from_vec_with_order_uses_original_vec() {
2374 let capacity = 10_000_000;
2375 let vec = Vec::with_capacity(capacity);
2376 let grid: Grid<u8> = Grid::from_vec_with_order(vec, 0, Order::ColumnMajor);
2377 assert!(grid.into_vec().capacity() >= capacity);
2378 }
2379
2380 #[test]
2381 fn insert_col_at_end() {
2382 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2383 grid.insert_col(2, vec![5, 6]);
2384 test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 5, 3, 4, 6]);
2385 }
2386
2387 #[test]
2388 #[should_panic]
2389 #[allow(clippy::should_panic_without_expect)]
2390 fn insert_col_out_of_idx() {
2391 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2392 grid.insert_col(3, vec![4, 5]);
2393 }
2394
2395 #[test]
2396 fn insert_col_empty() {
2397 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2398 grid.insert_col(0, vec![1, 2, 3]);
2399 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
2400 }
2401
2402 #[test]
2403 #[should_panic]
2404 #[allow(clippy::should_panic_without_expect)]
2405 fn insert_col_empty_input_panics() {
2406 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2407 grid.insert_col(0, vec![]);
2408 }
2409
2410 #[test]
2411 fn insert_col_at_end_column_major() {
2412 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2413 grid.insert_col(2, vec![5, 6]);
2414 test_grid(&grid, 2, 3, Order::ColumnMajor, &[1, 3, 2, 4, 5, 6]);
2415 }
2416
2417 #[test]
2418 #[should_panic]
2419 #[allow(clippy::should_panic_without_expect)]
2420 fn insert_col_out_of_idx_column_major() {
2421 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2422 grid.insert_col(3, vec![4, 5]);
2423 }
2424
2425 #[test]
2426 fn insert_col_empty_column_major() {
2427 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2428 grid.insert_col(0, vec![1, 2, 3]);
2429 test_grid(&grid, 3, 1, Order::ColumnMajor, &[1, 2, 3]);
2430 }
2431
2432 #[test]
2433 #[should_panic]
2434 #[allow(clippy::should_panic_without_expect)]
2435 fn insert_col_empty_input_panics_column_major() {
2436 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2437 grid.insert_col(0, vec![]);
2438 }
2439
2440 #[test]
2441 fn insert_row_at_end() {
2442 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2443 grid.insert_row(2, vec![5, 6]);
2444 test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
2445 }
2446
2447 #[test]
2448 fn insert_row_empty() {
2449 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2450 grid.insert_row(0, vec![1, 2, 3]);
2451 test_grid(&grid, 1, 3, Order::RowMajor, &[1, 2, 3]);
2452 }
2453
2454 #[test]
2455 #[should_panic]
2456 #[allow(clippy::should_panic_without_expect)]
2457 fn insert_row_empty_input_panics() {
2458 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2459 grid.insert_row(0, vec![]);
2460 }
2461
2462 #[test]
2463 #[should_panic]
2464 #[allow(clippy::should_panic_without_expect)]
2465 fn insert_row_out_of_idx() {
2466 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2467 grid.insert_row(3, vec![4, 5]);
2468 }
2469
2470 #[test]
2471 #[should_panic]
2472 #[allow(clippy::should_panic_without_expect)]
2473 fn insert_row_wrong_size_of_idx() {
2474 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2475 grid.insert_row(1, vec![4, 5, 4]);
2476 }
2477
2478 #[test]
2479 fn insert_row_start() {
2480 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2481 grid.insert_row(1, vec![5, 6]);
2482 test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 5, 6, 3, 4]);
2483 }
2484
2485 #[test]
2486 fn insert_row_at_end_column_major() {
2487 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2488 grid.insert_row(2, vec![5, 6]);
2489 test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 3, 5, 2, 4, 6]);
2490 }
2491
2492 #[test]
2493 fn insert_row_empty_column_major() {
2494 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2495 grid.insert_row(0, vec![1, 2, 3]);
2496 test_grid(&grid, 1, 3, Order::ColumnMajor, &[1, 2, 3]);
2497 }
2498
2499 #[test]
2500 #[should_panic]
2501 #[allow(clippy::should_panic_without_expect)]
2502 fn insert_row_empty_input_panics_column_major() {
2503 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2504 grid.insert_row(0, vec![]);
2505 }
2506
2507 #[test]
2508 #[should_panic]
2509 #[allow(clippy::should_panic_without_expect)]
2510 fn insert_row_out_of_idx_column_major() {
2511 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::ColumnMajor);
2512 grid.insert_row(3, vec![4, 5]);
2513 }
2514
2515 #[test]
2516 #[should_panic]
2517 #[allow(clippy::should_panic_without_expect)]
2518 fn insert_row_wrong_size_of_idx_column_major() {
2519 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::ColumnMajor);
2520 grid.insert_row(1, vec![4, 5, 4]);
2521 }
2522
2523 #[test]
2524 fn insert_row_start_column_major() {
2525 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2526 grid.insert_row(1, vec![5, 6]);
2527 test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 5, 3, 2, 6, 4]);
2528 }
2529
2530 #[test]
2531 fn pop_col_1x3() {
2532 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 3, Order::RowMajor);
2533 assert_eq!(grid.pop_col(), Some(vec![3]));
2534 test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
2535 assert_eq!(grid.pop_col(), Some(vec![2]));
2536 test_grid(&grid, 1, 1, Order::RowMajor, &[1]);
2537 assert_eq!(grid.pop_col(), Some(vec![1]));
2538 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2539 assert_eq!(grid.pop_col(), None);
2540 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2541 }
2542
2543 #[test]
2544 fn pop_col_3x1() {
2545 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 1, Order::RowMajor);
2546 assert_eq!(grid.pop_col(), Some(vec![1, 2, 3]));
2547 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2548 assert_eq!(grid.pop_col(), None);
2549 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2550 }
2551
2552 #[test]
2553 fn pop_col_2x2() {
2554 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2555 assert_eq!(grid.pop_col(), Some(vec![2, 4]));
2556 assert_eq!(grid.size(), (2, 1));
2557 test_grid(&grid, 2, 1, Order::RowMajor, &[1, 3]);
2558 assert_eq!(grid.pop_col(), Some(vec![1, 3]));
2559 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2560 assert_eq!(grid.pop_col(), None);
2561 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2562 }
2563
2564 #[test]
2565 fn pop_col_3x4() {
2566 let internal = vec![1, 2, 3, 4, 11, 22, 33, 44, 111, 222, 333, 444];
2567 let mut grid: Grid<u16> = Grid::from_vec_with_order(internal, 4, Order::RowMajor);
2568 assert_eq!(grid.pop_col(), Some(vec![4, 44, 444]));
2569 let expected = [1, 2, 3, 11, 22, 33, 111, 222, 333];
2570 test_grid(&grid, 3, 3, Order::RowMajor, &expected);
2571 assert_eq!(grid.pop_col(), Some(vec![3, 33, 333]));
2572 test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 11, 22, 111, 222]);
2573 assert_eq!(grid.pop_col(), Some(vec![2, 22, 222]));
2574 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 11, 111]);
2575 assert_eq!(grid.pop_col(), Some(vec![1, 11, 111]));
2576 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2577 assert_eq!(grid.pop_col(), None);
2578 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2579 }
2580
2581 #[test]
2582 fn pop_col_empty() {
2583 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2584 assert_eq!(grid.pop_col(), None);
2585 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2586 }
2587
2588 #[test]
2589 fn pop_col_1x3_column_major() {
2590 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 3, Order::ColumnMajor);
2591 assert_eq!(grid.pop_col(), Some(vec![3]));
2592 test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
2593 assert_eq!(grid.pop_col(), Some(vec![2]));
2594 test_grid(&grid, 1, 1, Order::ColumnMajor, &[1]);
2595 assert_eq!(grid.pop_col(), Some(vec![1]));
2596 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2597 assert_eq!(grid.pop_col(), None);
2598 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2599 }
2600
2601 #[test]
2602 fn pop_col_3x1_column_major() {
2603 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 1, Order::ColumnMajor);
2604 assert_eq!(grid.pop_col(), Some(vec![1, 2, 3]));
2605 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2606 assert_eq!(grid.pop_col(), None);
2607 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2608 }
2609
2610 #[test]
2611 fn pop_col_2x2_column_major() {
2612 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2613 assert_eq!(grid.pop_col(), Some(vec![2, 4]));
2614 assert_eq!(grid.size(), (2, 1));
2615 test_grid(&grid, 2, 1, Order::ColumnMajor, &[1, 3]);
2616 assert_eq!(grid.pop_col(), Some(vec![1, 3]));
2617 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2618 assert_eq!(grid.pop_col(), None);
2619 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2620 }
2621
2622 #[test]
2623 fn pop_col_3x4_column_major() {
2624 let internal = vec![1, 11, 111, 2, 22, 222, 3, 33, 333, 4, 44, 444];
2625 let mut grid: Grid<u16> = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
2626 assert_eq!(grid.pop_col(), Some(vec![4, 44, 444]));
2627 let expected = [1, 11, 111, 2, 22, 222, 3, 33, 333];
2628 test_grid(&grid, 3, 3, Order::ColumnMajor, &expected);
2629 assert_eq!(grid.pop_col(), Some(vec![3, 33, 333]));
2630 test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 11, 111, 2, 22, 222]);
2631 assert_eq!(grid.pop_col(), Some(vec![2, 22, 222]));
2632 test_grid(&grid, 3, 1, Order::ColumnMajor, &[1, 11, 111]);
2633 assert_eq!(grid.pop_col(), Some(vec![1, 11, 111]));
2634 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2635 assert_eq!(grid.pop_col(), None);
2636 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2637 }
2638
2639 #[test]
2640 fn pop_col_empty_column_major() {
2641 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2642 assert_eq!(grid.pop_col(), None);
2643 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2644 }
2645
2646 #[test]
2647 fn pop_row_2x2() {
2648 let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
2649 assert_eq!(grid.pop_row(), Some(vec![3, 4]));
2650 test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
2651 assert_eq!(grid.pop_row(), Some(vec![1, 2]));
2652 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2653 assert_eq!(grid.pop_row(), None);
2654 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2655 }
2656
2657 #[test]
2658 fn pop_row_empty() {
2659 let mut grid: Grid<u8> = Grid::from_vec(vec![], 0);
2660 assert_eq!(grid.pop_row(), None);
2661 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2662 }
2663
2664 #[test]
2665 fn pop_row_2x2_column_major() {
2666 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2667 assert_eq!(grid.pop_row(), Some(vec![3, 4]));
2668 test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
2669 assert_eq!(grid.pop_row(), Some(vec![1, 2]));
2670 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2671 assert_eq!(grid.pop_row(), None);
2672 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2673 }
2674
2675 #[test]
2676 fn pop_row_empty_column_major() {
2677 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2678 assert_eq!(grid.pop_row(), None);
2679 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2680 }
2681
2682 #[test]
2683 fn ne_full_empty() {
2684 let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2685 let g2: Grid<u8> = grid![];
2686 assert_ne!(g1, g2);
2687 }
2688
2689 #[test]
2690 fn ne() {
2691 let g1 = Grid::from_vec(vec![1, 2, 3, 5], 2);
2692 let g2 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2693 assert_ne!(g1, g2);
2694 }
2695
2696 #[test]
2697 fn ne_dif_rows() {
2698 let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2699 let g2 = Grid::from_vec(vec![1, 2, 3, 4], 1);
2700 assert_ne!(g1, g2);
2701 }
2702
2703 #[test]
2704 fn equal_empty() {
2705 let grid: Grid<char> = grid![];
2706 let grid2: Grid<char> = grid![];
2707 assert_eq!(grid, grid2);
2708 }
2709
2710 #[test]
2711 fn equal() {
2712 let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2713 let grid2: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2714 assert_eq!(grid, grid2);
2715 }
2716
2717 #[test]
2718 fn equal_different_order() {
2719 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2720 let grid2 = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2721 assert_eq!(grid, grid2);
2722 }
2723
2724 #[test]
2725 fn equal_partial_eq() {
2726 let grid = grid![[1.0]];
2727 let grid2 = Grid::from_vec(vec![1.0], 1);
2728 assert_eq!(grid, grid2);
2729 }
2730
2731 #[test]
2732 fn ne_partial_eq() {
2733 let grid = grid![[f64::NAN]];
2734 assert_ne!(grid, grid);
2735 }
2736
2737 #[test]
2738 #[should_panic]
2739 #[allow(clippy::should_panic_without_expect)]
2740 fn idx_tup_out_of_col_bounds() {
2741 let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2742 let _ = grid[(0, 5)];
2743 }
2744
2745 #[test]
2746 fn push_col_2x3() {
2747 let mut grid: Grid<u8> = grid![
2748 [0, 1, 2]
2749 [10, 11, 12]];
2750 grid.push_col(vec![3, 13]);
2751 test_grid(&grid, 2, 4, Order::RowMajor, &[0, 1, 2, 3, 10, 11, 12, 13]);
2752 }
2753
2754 #[test]
2755 fn push_col_3x4() {
2756 let mut grid: Grid<char> = grid![
2757 ['a', 'b', 'c', 'd']
2758 ['a', 'b', 'c', 'd']
2759 ['a', 'b', 'c', 'd']];
2760 grid.push_col(vec!['x', 'y', 'z']);
2761 let expected = [
2762 'a', 'b', 'c', 'd', 'x', 'a', 'b', 'c', 'd', 'y', 'a', 'b', 'c', 'd', 'z',
2763 ];
2764 test_grid(&grid, 3, 5, Order::RowMajor, &expected);
2765 }
2766
2767 #[test]
2768 fn push_col_1x3() {
2769 let mut grid: Grid<char> = grid![['a', 'b', 'c']];
2770 grid.push_col(vec!['d']);
2771 test_grid(&grid, 1, 4, Order::RowMajor, &['a', 'b', 'c', 'd']);
2772 }
2773
2774 #[test]
2775 fn push_col_empty() {
2776 let mut grid: Grid<char> = grid![];
2777 grid.push_col(vec!['b', 'b', 'b', 'b']);
2778 test_grid(&grid, 4, 1, Order::RowMajor, &['b', 'b', 'b', 'b']);
2779 }
2780
2781 #[test]
2782 #[should_panic]
2783 #[allow(clippy::should_panic_without_expect)]
2784 fn push_col_wrong_size() {
2785 let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
2786 grid.push_col(vec!['b']);
2787 grid.push_col(vec!['b', 'b']);
2788 }
2789
2790 #[test]
2791 #[should_panic]
2792 #[allow(clippy::should_panic_without_expect)]
2793 fn push_col_zero_len() {
2794 let mut grid: Grid<char> = grid![];
2795 grid.push_col(vec![]);
2796 }
2797
2798 #[test]
2799 fn push_col_2x3_column_major() {
2800 let internal = vec![0, 10, 1, 11, 2, 12];
2801 let mut grid: Grid<u8> = Grid::from_vec_with_order(internal, 3, Order::ColumnMajor);
2802 grid.push_col(vec![3, 13]);
2803 let expected = [0, 10, 1, 11, 2, 12, 3, 13];
2804 test_grid(&grid, 2, 4, Order::ColumnMajor, &expected);
2805 }
2806
2807 #[test]
2808 fn push_col_3x4_column_major() {
2809 let internal = vec!['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'];
2810 let mut grid: Grid<char> = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
2811 grid.push_col(vec!['x', 'y', 'z']);
2812 let expected = [
2813 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'x', 'y', 'z',
2814 ];
2815 test_grid(&grid, 3, 5, Order::ColumnMajor, &expected);
2816 }
2817
2818 #[test]
2819 fn push_col_1x3_column_major() {
2820 let mut grid: Grid<char> =
2821 Grid::from_vec_with_order(vec!['a', 'b', 'c'], 3, Order::ColumnMajor);
2822 grid.push_col(vec!['d']);
2823 test_grid(&grid, 1, 4, Order::ColumnMajor, &['a', 'b', 'c', 'd']);
2824 }
2825
2826 #[test]
2827 fn push_col_empty_column_major() {
2828 let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2829 grid.push_col(vec!['b', 'b', 'b', 'b']);
2830 test_grid(&grid, 4, 1, Order::ColumnMajor, &['b', 'b', 'b', 'b']);
2831 }
2832
2833 #[test]
2834 #[should_panic]
2835 #[allow(clippy::should_panic_without_expect)]
2836 fn push_col_wrong_size_column_major() {
2837 let mut grid: Grid<char> = Grid::init_with_order(2, 3, Order::ColumnMajor, 'a');
2838 grid.push_col(vec!['b']);
2839 grid.push_col(vec!['b', 'b']);
2840 }
2841
2842 #[test]
2843 #[should_panic]
2844 #[allow(clippy::should_panic_without_expect)]
2845 fn push_col_zero_len_column_major() {
2846 let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2847 grid.push_col(vec![]);
2848 }
2849
2850 #[test]
2851 fn push_row() {
2852 let mut grid: Grid<u8> = grid![[1, 2][3, 4]];
2853 grid.push_row(vec![5, 6]);
2854 test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
2855 }
2856
2857 #[test]
2858 fn push_row_empty() {
2859 let mut grid: Grid<char> = grid![];
2860 grid.push_row(vec!['b', 'b', 'b', 'b']);
2861 test_grid(&grid, 1, 4, Order::RowMajor, &['b', 'b', 'b', 'b']);
2862 }
2863
2864 #[test]
2865 #[should_panic]
2866 #[allow(clippy::should_panic_without_expect)]
2867 fn push_empty_row() {
2868 let mut grid = Grid::init(0, 1, 0);
2869 grid.push_row(vec![]);
2870 }
2871
2872 #[test]
2873 #[should_panic]
2874 #[allow(clippy::should_panic_without_expect)]
2875 fn push_row_wrong_size() {
2876 let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
2877 grid.push_row(vec!['b']);
2878 grid.push_row(vec!['b', 'b', 'b', 'b']);
2879 }
2880
2881 #[test]
2882 fn push_row_column_major() {
2883 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2884 grid.push_row(vec![5, 6]);
2885 test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 3, 5, 2, 4, 6]);
2886 }
2887
2888 #[test]
2889 fn push_row_empty_column_major() {
2890 let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2891 grid.push_row(vec!['b', 'b', 'b', 'b']);
2892 test_grid(&grid, 1, 4, Order::ColumnMajor, &['b', 'b', 'b', 'b']);
2893 }
2894
2895 #[test]
2896 #[should_panic]
2897 #[allow(clippy::should_panic_without_expect)]
2898 fn push_empty_row_column_major() {
2899 let mut grid = Grid::init_with_order(0, 1, Order::ColumnMajor, 0);
2900 grid.push_row(vec![]);
2901 }
2902
2903 #[test]
2904 #[should_panic]
2905 #[allow(clippy::should_panic_without_expect)]
2906 fn push_row_wrong_size_column_major() {
2907 let mut grid: Grid<char> =
2908 Grid::from_vec_with_order(vec!['a', 'a', 'a', 'a', 'a', 'a'], 3, Order::ColumnMajor);
2909 grid.push_row(vec!['b']);
2910 grid.push_row(vec!['b', 'b', 'b', 'b']);
2911 }
2912
2913 #[test]
2914 fn expand_rows() {
2915 let mut grid = Grid::from_vec_with_order(vec![1, 1, 1, 2, 2, 2], 3, Order::RowMajor);
2916 grid.expand_rows(2);
2917
2918 assert_eq!(grid.size(), (4, 3));
2919 assert_eq!(grid.order, Order::RowMajor);
2920 assert_eq!(grid.rows(), 4);
2921 assert_eq!(grid.cols(), 3);
2922 assert_eq!(grid.into_vec(), vec![1, 1, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0]);
2923 }
2924
2925 #[test]
2926 fn expand_rows_column_major() {
2927 let mut grid = Grid::from_vec_with_order(vec![1, 2, 1, 2, 1, 2], 3, Order::ColumnMajor);
2928 grid.expand_rows(2);
2929
2930 assert_eq!(grid.size(), (4, 3));
2931 assert_eq!(grid.order, Order::ColumnMajor);
2932 assert_eq!(grid.rows(), 4);
2933 assert_eq!(grid.cols(), 3);
2934 assert_eq!(grid.into_vec(), vec![1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0]);
2935 }
2936
2937 #[test]
2938 fn expand_rows_zero() {
2939 let mut grid = Grid::from_vec_with_order(vec![1, 1, 1], 3, Order::RowMajor);
2940 grid.expand_rows(0);
2941
2942 assert_eq!(grid.size(), (1, 3));
2943 assert_eq!(grid.order, Order::RowMajor);
2944 assert_eq!(grid.rows(), 1);
2945 assert_eq!(grid.cols(), 3);
2946 assert_eq!(grid.into_vec(), vec![1, 1, 1]);
2947 }
2948
2949 fn assert_growth_overflow_keeps_grid_valid(grow: impl FnOnce(&mut Grid<u8>)) {
2950 let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
2951
2952 let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| grow(&mut grid)));
2953
2954 assert!(result.is_err());
2955 assert_eq!(grid.size(), (1, 2));
2956 assert_eq!(grid.get(0, 0), Some(&1));
2957 assert_eq!(grid.get(0, 1), Some(&2));
2958 assert_eq!(grid.get(1, 0), None);
2959 }
2960
2961 #[test]
2962 fn expand_rows_overflow_keeps_grid_valid() {
2963 assert_growth_overflow_keeps_grid_valid(|grid| grid.expand_rows(usize::MAX / 2));
2964 }
2965
2966 #[test]
2967 fn expand_rows_overflow_safe_get_regression() {
2968 let mut grid = Grid::from_vec(vec![1_u8, 2_u8], 2);
2969
2970 let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
2971 grid.expand_rows(usize::MAX / 2);
2972 }));
2973
2974 assert!(result.is_err());
2975 assert_eq!(grid.get(0, 0), Some(&1));
2976 }
2977
2978 #[test]
2979 fn expand_cols_overflow_keeps_grid_valid() {
2980 assert_growth_overflow_keeps_grid_valid(|grid| grid.expand_cols(usize::MAX));
2981 }
2982
2983 #[test]
2984 fn prepend_rows_overflow_keeps_grid_valid() {
2985 assert_growth_overflow_keeps_grid_valid(|grid| grid.prepend_rows(usize::MAX / 2));
2986 }
2987
2988 #[test]
2989 fn prepend_cols_overflow_keeps_grid_valid() {
2990 assert_growth_overflow_keeps_grid_valid(|grid| grid.prepend_cols(usize::MAX));
2991 }
2992
2993 fn assert_failed_insert_row_keeps_grid_valid<T>(mut grid: Grid<T>)
2994 where
2995 T: fmt::Debug + PartialEq,
2996 {
2997 let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
2998 grid.insert_row(0, vec![]);
2999 }));
3000
3001 assert!(result.is_err());
3002 assert_eq!(grid.size(), (0, 0));
3003 assert!(grid.is_empty());
3004 assert_eq!(grid.get(0, 0), None);
3005 }
3006
3007 fn assert_failed_insert_col_keeps_grid_valid<T>(mut grid: Grid<T>)
3008 where
3009 T: fmt::Debug + PartialEq,
3010 {
3011 let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
3012 grid.insert_col(0, vec![]);
3013 }));
3014
3015 assert!(result.is_err());
3016 assert_eq!(grid.size(), (0, 0));
3017 assert!(grid.is_empty());
3018 assert_eq!(grid.get(0, 0), None);
3019 }
3020
3021 #[test]
3022 fn insert_row_empty_input_keeps_empty_grid_valid() {
3023 assert_failed_insert_row_keeps_grid_valid(Grid::<u8>::new(0, 0));
3024 }
3025
3026 #[test]
3027 fn insert_col_empty_input_keeps_empty_grid_valid() {
3028 assert_failed_insert_col_keeps_grid_valid(Grid::<u8>::new(0, 0));
3029 }
3030
3031 #[test]
3032 fn insert_row_empty_input_keeps_zst_grid_valid() {
3033 assert_failed_insert_row_keeps_grid_valid(Grid::<()>::new(0, 0));
3034 }
3035
3036 #[test]
3037 fn insert_col_empty_input_keeps_zst_grid_valid() {
3038 assert_failed_insert_col_keeps_grid_valid(Grid::<()>::new(0, 0));
3039 }
3040
3041 #[test]
3042 fn expand_rows_empty_grid() {
3043 let mut grid: Grid<u8> = Grid::init(0, 0, 0);
3044 grid.expand_rows(2);
3045
3046 assert_eq!(grid.size(), (0, 0));
3047 assert_eq!(grid.order, Order::RowMajor);
3048 assert_eq!(grid.rows(), 0);
3049 assert_eq!(grid.cols(), 0);
3050 assert_eq!(grid.into_vec(), Vec::<u8>::new());
3051 }
3052
3053 #[test]
3054 fn expand_cols() {
3055 let mut grid = Grid::from_vec_with_order(vec![1, 1, 1, 2, 2, 2], 3, Order::RowMajor);
3056 grid.expand_cols(2);
3057
3058 assert_eq!(grid.size(), (2, 5));
3059 assert_eq!(grid.order, Order::RowMajor);
3060 assert_eq!(grid.rows(), 2);
3061 assert_eq!(grid.cols(), 5);
3062 assert_eq!(grid.into_vec(), vec![1, 1, 1, 0, 0, 2, 2, 2, 0, 0]);
3063 }
3064
3065 #[test]
3066 fn expand_cols_column_major() {
3067 let mut grid = Grid::from_vec_with_order(vec![1, 2, 1, 2, 1, 2], 3, Order::ColumnMajor);
3068 grid.expand_cols(2);
3069
3070 assert_eq!(grid.size(), (2, 5));
3071 assert_eq!(grid.order, Order::ColumnMajor);
3072 assert_eq!(grid.rows(), 2);
3073 assert_eq!(grid.cols(), 5);
3074 assert_eq!(grid.into_vec(), vec![1, 2, 1, 2, 1, 2, 0, 0, 0, 0]);
3075 }
3076
3077 #[test]
3078 fn expand_cols_zero() {
3079 let mut grid = Grid::from_vec_with_order(vec![1, 2, 1, 2], 2, Order::RowMajor);
3080 grid.expand_cols(0);
3081
3082 assert_eq!(grid.size(), (2, 2));
3083 assert_eq!(grid.order, Order::RowMajor);
3084 assert_eq!(grid.rows(), 2);
3085 assert_eq!(grid.cols(), 2);
3086 assert_eq!(grid.into_vec(), vec![1, 2, 1, 2]);
3087 }
3088
3089 #[test]
3090 fn expand_cols_empty_grid() {
3091 let mut grid: Grid<u8> = Grid::init(0, 0, 0);
3092 grid.expand_cols(2);
3093
3094 assert_eq!(grid.size(), (0, 0));
3095 assert_eq!(grid.order, Order::RowMajor);
3096 assert_eq!(grid.rows(), 0);
3097 assert_eq!(grid.cols(), 0);
3098 assert_eq!(grid.into_vec(), Vec::<u8>::new());
3099 }
3100
3101 #[test]
3102 fn prepend_rows() {
3103 let mut grid = Grid::from_vec_with_order(vec![1, 1, 1, 2, 2, 2], 3, Order::RowMajor);
3104 grid.prepend_rows(2);
3105
3106 assert_eq!(grid.size(), (4, 3));
3107 assert_eq!(grid.order, Order::RowMajor);
3108 assert_eq!(grid.rows(), 4);
3109 assert_eq!(grid.cols(), 3);
3110 assert_eq!(grid.into_vec(), vec![0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2]);
3111 }
3112
3113 #[test]
3114 fn prepend_rows_column_major() {
3115 let mut grid = Grid::from_vec_with_order(vec![1, 2, 1, 2, 1, 2], 3, Order::ColumnMajor);
3116 grid.prepend_rows(2);
3117
3118 assert_eq!(grid.size(), (4, 3));
3119 assert_eq!(grid.order, Order::ColumnMajor);
3120 assert_eq!(grid.rows(), 4);
3121 assert_eq!(grid.cols(), 3);
3122 assert_eq!(grid.into_vec(), vec![0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2]);
3123 }
3124
3125 #[test]
3126 fn prepend_rows_zero() {
3127 let mut grid = Grid::from_vec_with_order(vec![1, 1, 1], 3, Order::RowMajor);
3128 grid.prepend_rows(0);
3129
3130 assert_eq!(grid.size(), (1, 3));
3131 assert_eq!(grid.order, Order::RowMajor);
3132 assert_eq!(grid.rows(), 1);
3133 assert_eq!(grid.cols(), 3);
3134 assert_eq!(grid.into_vec(), vec![1, 1, 1]);
3135 }
3136
3137 #[test]
3138 fn prepend_rows_empty_grid() {
3139 let mut grid: Grid<u8> = Grid::init(0, 0, 0);
3140 grid.prepend_rows(2);
3141
3142 assert_eq!(grid.size(), (0, 0));
3143 assert_eq!(grid.order, Order::RowMajor);
3144 assert_eq!(grid.rows(), 0);
3145 assert_eq!(grid.cols(), 0);
3146 assert_eq!(grid.into_vec(), Vec::<u8>::new());
3147 }
3148
3149 #[test]
3150 fn prepend_cols() {
3151 let mut grid = Grid::from_vec_with_order(vec![1, 1, 1, 2, 2, 2], 3, Order::RowMajor);
3152 grid.prepend_cols(2);
3153
3154 assert_eq!(grid.size(), (2, 5));
3155 assert_eq!(grid.order, Order::RowMajor);
3156 assert_eq!(grid.rows(), 2);
3157 assert_eq!(grid.cols(), 5);
3158 assert_eq!(grid.into_vec(), vec![0, 0, 1, 1, 1, 0, 0, 2, 2, 2]);
3159 }
3160
3161 #[test]
3162 fn prepend_cols_column_major() {
3163 let mut grid = Grid::from_vec_with_order(vec![1, 2, 1, 2, 1, 2], 3, Order::ColumnMajor);
3164 grid.prepend_cols(2);
3165
3166 assert_eq!(grid.size(), (2, 5));
3167 assert_eq!(grid.order, Order::ColumnMajor);
3168 assert_eq!(grid.rows(), 2);
3169 assert_eq!(grid.cols(), 5);
3170 assert_eq!(grid.into_vec(), vec![0, 0, 0, 0, 1, 2, 1, 2, 1, 2]);
3171 }
3172
3173 #[test]
3174 fn prepend_cols_zero() {
3175 let mut grid = Grid::from_vec_with_order(vec![1, 2, 1, 2], 2, Order::RowMajor);
3176 grid.prepend_cols(0);
3177
3178 assert_eq!(grid.size(), (2, 2));
3179 assert_eq!(grid.order, Order::RowMajor);
3180 assert_eq!(grid.rows(), 2);
3181 assert_eq!(grid.cols(), 2);
3182 assert_eq!(grid.into_vec(), vec![1, 2, 1, 2]);
3183 }
3184
3185 #[test]
3186 fn prepend_cols_empty_grid() {
3187 let mut grid: Grid<u8> = Grid::init(0, 0, 0);
3188 grid.prepend_cols(2);
3189
3190 assert_eq!(grid.size(), (0, 0));
3191 assert_eq!(grid.order, Order::RowMajor);
3192 assert_eq!(grid.rows(), 0);
3193 assert_eq!(grid.cols(), 0);
3194 assert_eq!(grid.into_vec(), Vec::<u8>::new());
3195 }
3196
3197 #[test]
3198 fn iter_row() {
3199 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3200 let row: Vec<_> = grid.iter_row(1).collect();
3201 assert_eq!(row, [&4, &5, &6]);
3202 }
3203
3204 #[test]
3205 #[should_panic]
3206 #[allow(clippy::should_panic_without_expect)]
3207 fn iter_row_out_of_bound() {
3208 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3209 let _ = grid.iter_row(3);
3210 }
3211
3212 #[test]
3213 #[should_panic]
3214 #[allow(clippy::should_panic_without_expect)]
3215 fn iter_row_zero() {
3216 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
3217 let _ = grid.iter_row(0);
3218 }
3219
3220 #[test]
3221 fn iter_row_rowumn_major() {
3222 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3223 let row: Vec<_> = grid.iter_row(1).collect();
3224 assert_eq!(row, [&4, &5, &6]);
3225 }
3226
3227 #[test]
3228 #[should_panic]
3229 #[allow(clippy::should_panic_without_expect)]
3230 fn iter_row_rowumn_major_out_of_bound() {
3231 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3232 let _ = grid.iter_row(3);
3233 }
3234
3235 #[test]
3236 #[should_panic]
3237 #[allow(clippy::should_panic_without_expect)]
3238 fn iter_row_rowumn_major_zero() {
3239 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
3240 let _ = grid.iter_row(0);
3241 }
3242
3243 #[test]
3244 fn iter_row_mut() {
3245 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3246 let row: Vec<_> = grid.iter_row_mut(1).collect();
3247 assert_eq!(row, [&mut 4, &mut 5, &mut 6]);
3248 }
3249
3250 #[test]
3251 #[should_panic]
3252 #[allow(clippy::should_panic_without_expect)]
3253 fn iter_row_mut_out_of_bound() {
3254 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3255 let _ = grid.iter_row_mut(3);
3256 }
3257
3258 #[test]
3259 #[should_panic]
3260 #[allow(clippy::should_panic_without_expect)]
3261 fn iter_row_mut_zero() {
3262 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
3263 let _ = grid.iter_row_mut(0);
3264 }
3265
3266 #[test]
3267 fn iter_row_mut_rowumn_major() {
3268 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3269 let row: Vec<_> = grid.iter_row_mut(1).collect();
3270 assert_eq!(row, [&mut 4, &mut 5, &mut 6]);
3271 }
3272
3273 #[test]
3274 #[should_panic]
3275 #[allow(clippy::should_panic_without_expect)]
3276 fn iter_row_mut_rowumn_major_out_of_bound() {
3277 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3278 let _ = grid.iter_row_mut(3);
3279 }
3280
3281 #[test]
3282 #[should_panic]
3283 #[allow(clippy::should_panic_without_expect)]
3284 fn iter_row_mut_rowumn_major_zero() {
3285 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
3286 let _ = grid.iter_row_mut(0);
3287 }
3288
3289 #[test]
3290 fn iter_col() {
3291 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3292 let col: Vec<_> = grid.iter_col(1).collect();
3293 assert_eq!(col, [&2, &5]);
3294 }
3295
3296 #[test]
3297 #[should_panic]
3298 #[allow(clippy::should_panic_without_expect)]
3299 fn iter_col_out_of_bound() {
3300 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3301 let _ = grid.iter_col(3);
3302 }
3303
3304 #[test]
3305 #[should_panic]
3306 #[allow(clippy::should_panic_without_expect)]
3307 fn iter_col_zero() {
3308 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
3309 let _ = grid.iter_col(0);
3310 }
3311
3312 #[test]
3313 fn iter_col_column_major() {
3314 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3315 let col: Vec<_> = grid.iter_col(1).collect();
3316 assert_eq!(col, [&2, &5]);
3317 }
3318
3319 #[test]
3320 #[should_panic]
3321 #[allow(clippy::should_panic_without_expect)]
3322 fn iter_col_column_major_out_of_bound() {
3323 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3324 let _ = grid.iter_col(3);
3325 }
3326
3327 #[test]
3328 #[should_panic]
3329 #[allow(clippy::should_panic_without_expect)]
3330 fn iter_col_column_major_zero() {
3331 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
3332 let _ = grid.iter_col(0);
3333 }
3334
3335 #[test]
3336 fn iter_col_mut() {
3337 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3338 let col: Vec<_> = grid.iter_col_mut(1).collect();
3339 assert_eq!(col, [&mut 2, &mut 5]);
3340 }
3341
3342 #[test]
3343 #[should_panic]
3344 #[allow(clippy::should_panic_without_expect)]
3345 fn iter_col_mut_out_of_bound() {
3346 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3347 let _ = grid.iter_col_mut(3);
3348 }
3349
3350 #[test]
3351 #[should_panic]
3352 #[allow(clippy::should_panic_without_expect)]
3353 fn iter_col_mut_zero() {
3354 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
3355 let _ = grid.iter_col_mut(0);
3356 }
3357
3358 #[test]
3359 fn iter_col_mut_column_major() {
3360 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3361 let col: Vec<_> = grid.iter_col_mut(1).collect();
3362 assert_eq!(col, [&mut 2, &mut 5]);
3363 }
3364
3365 #[test]
3366 #[should_panic]
3367 #[allow(clippy::should_panic_without_expect)]
3368 fn iter_col_mut_column_major_out_of_bound() {
3369 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3370 let _ = grid.iter_col_mut(3);
3371 }
3372
3373 #[test]
3374 #[should_panic]
3375 #[allow(clippy::should_panic_without_expect)]
3376 fn iter_col_mut_column_major_zero() {
3377 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
3378 let _ = grid.iter_col_mut(0);
3379 }
3380
3381 #[test]
3382 fn iter() {
3383 let grid: Grid<u8> = grid![[1,2][3,4]];
3384 let mut iter = grid.iter();
3385 assert_eq!(iter.next(), Some(&1));
3386 assert_eq!(iter.next(), Some(&2));
3387 assert_eq!(iter.next(), Some(&3));
3388 assert_eq!(iter.next(), Some(&4));
3389 assert_eq!(iter.next(), None);
3390 }
3391
3392 #[test]
3393 fn into_iter() {
3394 let grid: Grid<u8> = grid![[1,1][1,1]];
3395 for val in grid {
3396 assert_eq!(val, 1);
3397 }
3398 }
3399
3400 #[test]
3401 fn into_iter_ref() {
3402 let grid: Grid<u8> = grid![[1,1][1,1]];
3403 for val in &grid {
3404 assert_eq!(val, &1);
3405 }
3406 }
3407
3408 #[test]
3409 fn into_iter_mut() {
3410 let mut grid: Grid<u8> = grid![[1,1][1,1]];
3411 grid.fill(2);
3412 assert_eq!(grid, grid![[2, 2][2, 2]]);
3413 }
3414
3415 #[test]
3416 fn indexed_iter() {
3417 let grid: Grid<u8> = grid![[1,2][3,4]];
3418 let mut iter = grid.indexed_iter();
3419 assert_eq!(iter.next(), Some(((0, 0), &1)));
3420 assert_eq!(iter.next(), Some(((0, 1), &2)));
3421 assert_eq!(iter.next(), Some(((1, 0), &3)));
3422 assert_eq!(iter.next(), Some(((1, 1), &4)));
3423 assert_eq!(iter.next(), None);
3424 }
3425
3426 #[test]
3427 fn indexed_iter_empty() {
3428 let grid: Grid<u8> = Grid::new(0, 0);
3429 let mut iter = grid.indexed_iter();
3430 assert_eq!(iter.next(), None);
3431 }
3432
3433 #[test]
3434 fn indexed_into_iter() {
3435 let grid: Grid<u8> = grid![[1,2][3,4]];
3436 let mut iter = grid.indexed_into_iter();
3437 assert_eq!(iter.next(), Some(((0, 0), 1)));
3438 assert_eq!(iter.next(), Some(((0, 1), 2)));
3439 assert_eq!(iter.next(), Some(((1, 0), 3)));
3440 assert_eq!(iter.next(), Some(((1, 1), 4)));
3441 assert_eq!(iter.next(), None);
3442 }
3443
3444 #[test]
3445 fn indexed_iter_column_major() {
3446 let grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3447 let mut iter = grid.indexed_iter();
3448 assert_eq!(iter.next(), Some(((0, 0), &1)));
3449 assert_eq!(iter.next(), Some(((1, 0), &3)));
3450 assert_eq!(iter.next(), Some(((0, 1), &2)));
3451 assert_eq!(iter.next(), Some(((1, 1), &4)));
3452 assert_eq!(iter.next(), None);
3453 }
3454
3455 #[test]
3456 fn indexed_iter_empty_column_major() {
3457 let grid: Grid<u8> = Grid::new_with_order(0, 0, Order::ColumnMajor);
3458 let mut iter = grid.indexed_iter();
3459 assert_eq!(iter.next(), None);
3460 }
3461
3462 #[test]
3463 fn indexed_iter_mut() {
3464 let mut grid: Grid<u8> = grid![[1,2][3,4]];
3465 let mut iter = grid.indexed_iter_mut();
3466 assert_eq!(iter.next(), Some(((0, 0), &mut 1)));
3467 assert_eq!(iter.next(), Some(((0, 1), &mut 2)));
3468 assert_eq!(iter.next(), Some(((1, 0), &mut 3)));
3469 assert_eq!(iter.next(), Some(((1, 1), &mut 4)));
3470 assert_eq!(iter.next(), None);
3471 }
3472
3473 #[test]
3474 fn indexed_iter_mut_empty() {
3475 let mut grid: Grid<u8> = Grid::new(0, 0);
3476 let mut iter = grid.indexed_iter_mut();
3477 assert_eq!(iter.next(), None);
3478 }
3479
3480 #[test]
3481 fn indexed_iter_mut_column_major() {
3482 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3483 let mut iter = grid.indexed_iter_mut();
3484 assert_eq!(iter.next(), Some(((0, 0), &mut 1)));
3485 assert_eq!(iter.next(), Some(((1, 0), &mut 3)));
3486 assert_eq!(iter.next(), Some(((0, 1), &mut 2)));
3487 assert_eq!(iter.next(), Some(((1, 1), &mut 4)));
3488 assert_eq!(iter.next(), None);
3489 }
3490
3491 #[test]
3492 fn indexed_iter_mut_empty_column_major() {
3493 let mut grid: Grid<u8> = Grid::new_with_order(0, 0, Order::ColumnMajor);
3494 let mut iter = grid.indexed_iter_mut();
3495 assert_eq!(iter.next(), None);
3496 }
3497
3498 #[test]
3499 fn clear() {
3500 let mut grid: Grid<u8> = grid![[1, 2, 3]];
3501 assert!(!grid.is_empty());
3502 grid.clear();
3503 assert!(grid.is_empty());
3504 }
3505
3506 #[test]
3507 fn is_empty_false() {
3508 let grid: Grid<u8> = grid![[1, 2, 3]];
3509 assert!(!grid.is_empty());
3510 }
3511
3512 #[test]
3513 fn is_empty() {
3514 let mut g: Grid<u8> = grid![[]];
3515 assert!(g.is_empty());
3516 g = grid![];
3517 assert!(g.is_empty());
3518 g = Grid::from_vec(vec![], 0);
3519 assert!(g.is_empty());
3520 g = Grid::new(0, 0);
3521 assert!(g.is_empty());
3522 g = Grid::new(0, 1);
3523 assert!(g.is_empty());
3524 g = Grid::new(1, 0);
3525 assert!(g.is_empty());
3526 g = Grid::init(0, 0, 10);
3527 assert!(g.is_empty());
3528 }
3529
3530 #[test]
3531 fn fmt_empty() {
3532 let grid: Grid<u8> = grid![];
3533 assert_eq!(format!("{grid:?}"), "[]");
3534 }
3535
3536 #[test]
3537 fn fmt_row() {
3538 let grid: Grid<u8> = grid![[1, 2, 3]];
3539 assert_eq!(format!("{grid:?}"), "[[1, 2, 3]]");
3540 }
3541
3542 #[test]
3543 fn fmt_grid() {
3544 let grid: Grid<u8> = grid![[1,2,3][4,5,6][7,8,9]];
3545 assert_eq!(format!("{grid:?}"), "[[1, 2, 3][4, 5, 6][7, 8, 9]]");
3546 }
3547
3548 #[test]
3549 fn fmt_column_major() {
3550 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3551 assert_eq!(format!("{grid:?}"), "[[1, 2, 3][4, 5, 6]]");
3552 }
3553
3554 #[test]
3555 fn fmt_pretty_empty() {
3556 let grid: Grid<f32> = grid![];
3557 assert_eq!(format!("{grid:#?}"), "[]");
3558 }
3559
3560 #[test]
3561 fn fmt_pretty_int() {
3562 let grid: Grid<u8> = grid![
3563 [1,2,3]
3564 [4,5,6]
3565 [7,8,95]
3566 ];
3567
3568 let expected_output = r"[
3569 [ 1, 2, 3]
3570 [ 4, 5, 6]
3571 [ 7, 8, 95]
3572]";
3573
3574 assert_eq!(format!("{grid:#?}"), expected_output);
3575
3576 let expected_output = r"[
3577 [ 1, 2, 3]
3578 [ 4, 5, 6]
3579 [ 7, 8, 95]
3580]";
3581
3582 assert_eq!(format!("{grid:#3?}"), expected_output);
3583 }
3584
3585 #[test]
3586 fn fmt_pretty_float() {
3587 let grid: Grid<f32> = grid![
3588 [1.5,2.6,3.44]
3589 [4.775,5.,6.]
3590 [7.1,8.23444,95.55]
3591 ];
3592
3593 let expected_output = r"[
3594 [ 1.5, 2.6, 3.4]
3595 [ 4.8, 5.0, 6.0]
3596 [ 7.1, 8.2, 95.6]
3597]";
3598
3599 assert_eq!(format!("{grid:#5.1?}"), expected_output);
3600
3601 let expected_output = r"[
3602 [ 1.50000, 2.60000, 3.44000]
3603 [ 4.77500, 5.00000, 6.00000]
3604 [ 7.10000, 8.23444, 95.55000]
3605]";
3606
3607 assert_eq!(format!("{grid:#8.5?}"), expected_output);
3608 }
3609
3610 #[test]
3611 fn fmt_pretty_tuple() {
3612 let grid: Grid<(i32, i32)> = grid![
3613 [(5,66), (432, 55)]
3614 [(80, 90), (5, 6)]
3615 ];
3616
3617 let expected_output = r"[
3618 [ ( 5, 66), ( 432, 55)]
3619 [ ( 80, 90), ( 5, 6)]
3620]";
3621
3622 assert_eq!(format!("{grid:#?}"), expected_output);
3623
3624 let expected_output = r"[
3625 [ ( 5, 66), (432, 55)]
3626 [ ( 80, 90), ( 5, 6)]
3627]";
3628
3629 assert_eq!(format!("{grid:#3?}"), expected_output);
3630 }
3631
3632 #[test]
3633 fn fmt_pretty_struct_derived() {
3634 #[derive(Debug)]
3635 struct Person {
3636 _name: String,
3637 _precise_age: f32,
3638 }
3639
3640 impl Person {
3641 fn new(name: &str, precise_age: f32) -> Self {
3642 Self {
3643 _name: name.into(),
3644 _precise_age: precise_age,
3645 }
3646 }
3647 }
3648
3649 let grid: Grid<Person> = grid![
3650 [Person::new("Vic", 24.5), Person::new("Mr. Very Long Name", 1955.)]
3651 [Person::new("Sam", 8.9995), Person::new("John Doe", 40.14)]
3652 ];
3653
3654 let expected_output = r#"[
3655 [ Person { _name: "Vic", _precise_age: 24.50000 }, Person { _name: "Mr. Very Long Name", _precise_age: 1955.00000 }]
3656 [ Person { _name: "Sam", _precise_age: 8.99950 }, Person { _name: "John Doe", _precise_age: 40.14000 }]
3657]"#;
3658
3659 assert_eq!(format!("{grid:#5.5?}"), expected_output);
3660 }
3661
3662 #[test]
3663 fn fmt_pretty_column_major() {
3664 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3665 let expected_output = r"[
3666 [ 1, 2, 3]
3667 [ 4, 5, 6]
3668]";
3669 assert_eq!(format!("{grid:#?}"), expected_output);
3670 }
3671
3672 #[test]
3673 fn clone() {
3674 let grid = grid![[1, 2, 3][4, 5, 6]];
3675 let mut clone = grid.clone();
3676 clone[(0, 2)] = 10;
3677 test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
3678 test_grid(&clone, 2, 3, Order::RowMajor, &[1, 2, 10, 4, 5, 6]);
3679 }
3680
3681 #[cfg(feature = "std")]
3682 #[test]
3683 fn hash_std() {
3684 let mut set = std::collections::HashSet::new();
3685 set.insert(grid![[1,2,3][4,5,6]]);
3686 set.insert(grid![[1,3,3][4,5,6]]);
3687 set.insert(grid![[1,2,3][4,5,6]]);
3688 assert_eq!(set.len(), 2);
3689 }
3690
3691 #[test]
3692 fn macro_init() {
3693 let grid = grid![[1, 2, 3][4, 5, 6]];
3694 test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
3695 }
3696
3697 #[test]
3698 fn macro_init_2() {
3699 let grid = grid![[1, 2, 3]
3700 [4, 5, 6]
3701 [7, 8, 9]];
3702 test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
3703 }
3704
3705 #[test]
3706 fn macro_init_char() {
3707 let grid = grid![['a', 'b', 'c']
3708 ['a', 'b', 'c']
3709 ['a', 'b', 'c']];
3710 let expected = ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'];
3711 test_grid(&grid, 3, 3, Order::RowMajor, &expected);
3712 }
3713
3714 #[test]
3715 fn macro_one_row() {
3716 let grid: Grid<usize> = grid![[1, 2, 3, 4]];
3717 test_grid(&grid, 1, 4, Order::RowMajor, &[1, 2, 3, 4]);
3718 }
3719
3720 #[test]
3721 fn macro2_empty() {
3722 let grid: Grid<u8> = grid_cm![];
3723 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3724 }
3725
3726 #[test]
3727 fn macro2_init() {
3728 let grid = grid_cm![[1, 2, 3]
3729 [4, 5, 6]
3730 [7, 8, 9]];
3731 let expected = [1, 4, 7, 2, 5, 8, 3, 6, 9];
3732 test_grid(&grid, 3, 3, Order::ColumnMajor, &expected);
3733 }
3734
3735 #[test]
3736 fn macro2_init_char() {
3737 let grid = grid_cm![['a', 'b']['c', 'd']];
3738 test_grid(&grid, 2, 2, Order::ColumnMajor, &['a', 'c', 'b', 'd']);
3739 }
3740
3741 #[test]
3742 fn macro2_one_row() {
3743 let grid = grid_cm![[1, 2, 3, 4]];
3744 test_grid(&grid, 1, 4, Order::ColumnMajor, &[1, 2, 3, 4]);
3745 }
3746
3747 #[test]
3748 fn init() {
3749 let grid = Grid::init(1, 2, 3);
3750 test_grid(&grid, 1, 2, Order::RowMajor, &[3, 3]);
3751
3752 let grid = Grid::init(1, 2, 1.2);
3753 test_grid(&grid, 1, 2, Order::RowMajor, &[1.2, 1.2]);
3754
3755 let grid = Grid::init(1, 2, 'a');
3756 test_grid(&grid, 1, 2, Order::RowMajor, &['a', 'a']);
3757 }
3758
3759 #[test]
3760 #[should_panic]
3761 #[allow(clippy::should_panic_without_expect)]
3762 fn init_panics() {
3763 Grid::init(usize::MAX, 2, 3);
3764 }
3765
3766 #[test]
3767 fn init_empty() {
3768 let grid = Grid::init(0, 1, 0);
3769 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3770
3771 let grid = Grid::init(1, 0, -1);
3772 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3773 }
3774
3775 #[test]
3776 fn init_with_order() {
3777 let grid = Grid::init_with_order(1, 2, Order::RowMajor, 3);
3778 test_grid(&grid, 1, 2, Order::RowMajor, &[3, 3]);
3779
3780 let grid = Grid::init_with_order(1, 2, Order::ColumnMajor, 1.2);
3781 test_grid(&grid, 1, 2, Order::ColumnMajor, &[1.2, 1.2]);
3782
3783 let grid = Grid::init_with_order(1, 2, Order::ColumnMajor, 'a');
3784 test_grid(&grid, 1, 2, Order::ColumnMajor, &['a', 'a']);
3785 }
3786
3787 #[test]
3788 #[should_panic]
3789 #[allow(clippy::should_panic_without_expect)]
3790 fn init_with_order_panics() {
3791 Grid::init_with_order(usize::MAX, 2, Order::ColumnMajor, 3);
3792 }
3793
3794 #[test]
3795 fn init_with_order_empty() {
3796 let grid = Grid::init_with_order(0, 1, Order::ColumnMajor, 0);
3797 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3798
3799 let grid = Grid::init_with_order(1, 0, Order::RowMajor, -1);
3800 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3801 }
3802
3803 #[test]
3804 fn new() {
3805 let grid: Grid<u8> = Grid::new(1, 2);
3806 test_grid(&grid, 1, 2, Order::RowMajor, &[0, 0]);
3807 }
3808
3809 #[test]
3810 #[should_panic]
3811 #[allow(clippy::should_panic_without_expect)]
3812 fn new_panics() {
3813 let _: Grid<u8> = Grid::new(usize::MAX, 2);
3814 }
3815
3816 #[test]
3817 fn new_empty() {
3818 let grid: Grid<u8> = Grid::new(0, 1);
3819 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3820
3821 let grid: Grid<u8> = Grid::new(1, 0);
3822 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3823 }
3824
3825 #[test]
3826 fn new_with_order() {
3827 let grid: Grid<u8> = Grid::new_with_order(2, 2, Order::ColumnMajor);
3828 test_grid(&grid, 2, 2, Order::ColumnMajor, &[0, 0, 0, 0]);
3829 }
3830
3831 #[test]
3832 #[should_panic]
3833 #[allow(clippy::should_panic_without_expect)]
3834 fn new_with_order_panics() {
3835 let _: Grid<u8> = Grid::new_with_order(usize::MAX, 2, Order::ColumnMajor);
3836 }
3837
3838 #[test]
3839 fn new_with_order_empty() {
3840 let grid: Grid<u8> = Grid::new_with_order(0, 3, Order::RowMajor);
3841 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3842
3843 let grid: Grid<u8> = Grid::new_with_order(3, 0, Order::ColumnMajor);
3844 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3845 }
3846
3847 #[test]
3848 fn with_capacity() {
3849 struct Foo();
3851
3852 let grid: Grid<Foo> = Grid::with_capacity(20, 20);
3853 assert!(grid.is_empty());
3854 assert_eq!(grid.order(), Order::default());
3855 }
3856
3857 #[test]
3858 fn with_capacity_and_order() {
3859 struct Foo();
3861
3862 let grid: Grid<Foo> = Grid::with_capacity_and_order(20, 20, Order::ColumnMajor);
3863 assert!(grid.is_empty());
3864 assert_eq!(grid.order(), Order::ColumnMajor);
3865 }
3866
3867 #[test]
3868 #[should_panic]
3869 #[allow(clippy::should_panic_without_expect)]
3870 fn with_capacity_panics_internal() {
3871 struct Foo();
3873
3874 let _grid: Grid<Foo> = Grid::with_capacity_and_order(usize::MAX, 2, Order::RowMajor);
3875 }
3876
3877 #[test]
3878 #[should_panic]
3879 #[allow(clippy::should_panic_without_expect)]
3880 fn with_capacity_panics_vec() {
3881 let rows: usize = isize::MAX.try_into().expect("isize::MAX is positive");
3882 assert!(
3883 core::mem::size_of::<u8>() * rows < usize::MAX,
3884 "shows that panic is from Vec::with_capacity, not internal check"
3885 );
3886
3887 let _grid: Grid<u8> = Grid::with_capacity_and_order(rows, 2, Order::RowMajor);
3888 }
3889
3890 #[test]
3891 fn get() {
3892 let grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3893 assert_eq!(grid.get(0_i64, 1_i32), Some(&2));
3894 }
3895
3896 #[test]
3897 fn get_column_major() {
3898 let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3899 assert_eq!(grid.get(1, 0), Some(&2));
3900 }
3901
3902 #[test]
3903 fn get_none() {
3904 let grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3905 assert_eq!(grid.get(1, 0), None);
3906 }
3907
3908 #[test]
3909 fn get_none_column_major() {
3910 let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3911 assert_eq!(grid.get(0, 1), None);
3912 }
3913
3914 #[test]
3915 fn get_mut() {
3916 let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3917 assert_eq!(grid.get_mut(0_i64, 1_i32), Some(&mut 2));
3918 }
3919
3920 #[test]
3921 fn get_mut_column_major() {
3922 let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3923 assert_eq!(grid.get_mut(1, 0), Some(&mut 2));
3924 }
3925
3926 #[test]
3927 fn get_mut_none() {
3928 let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3929 assert_eq!(grid.get_mut(1, 0), None);
3930 }
3931
3932 #[test]
3933 fn get_mut_none_column_major() {
3934 let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3935 assert_eq!(grid.get_mut(0, 1), None);
3936 }
3937
3938 #[test]
3939 fn idx_tup() {
3940 let grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
3941 assert_eq!(grid[(0, 0)], 1);
3942 assert_eq!(grid[(0, 1)], 2);
3943 assert_eq!(grid[(1, 0)], 3);
3944 assert_eq!(grid[(1, 1)], 4);
3945 }
3946
3947 #[test]
3948 #[should_panic]
3949 #[allow(clippy::should_panic_without_expect)]
3950 fn idx_tup_panic_1() {
3951 let grid = Grid::init(1, 2, 3);
3952 let _ = grid[(20, 0)];
3953 }
3954
3955 #[test]
3956 #[should_panic]
3957 #[allow(clippy::should_panic_without_expect)]
3958 fn idx_tup_panic_2() {
3959 let grid = Grid::init(1, 2, 3);
3960 let _ = grid[(0, 20)];
3961 }
3962
3963 #[test]
3964 fn idx_tup_set() {
3965 let mut grid = Grid::init(1, 2, 3);
3966 grid[(0, 0)] = 4;
3967 assert_eq!(grid[(0, 0)], 4);
3968 }
3969
3970 #[test]
3971 fn size() {
3972 let grid = Grid::init(1, 2, 3);
3973 assert_eq!(grid.size(), (1, 2));
3974 }
3975
3976 #[test]
3977 fn transpose() {
3978 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3979 grid.transpose();
3980 assert_eq!(grid, grid![[1,4][2,5][3,6]]);
3981 }
3982
3983 #[test]
3984 fn fill() {
3985 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3986 grid.fill(7);
3987 test_grid(&grid, 2, 3, Order::RowMajor, &[7, 7, 7, 7, 7, 7]);
3988 }
3989
3990 #[test]
3991 fn fill_with() {
3992 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3993 grid.fill_with(Default::default);
3994 test_grid(&grid, 2, 3, Order::RowMajor, &[0, 0, 0, 0, 0, 0]);
3995 }
3996
3997 #[test]
3998 fn map() {
3999 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4000 let mapped = grid.map(|x| x * 2);
4001 test_grid(&mapped, 2, 3, Order::RowMajor, &[2, 4, 6, 8, 10, 12]);
4002 }
4003
4004 #[test]
4005 fn map_ref() {
4006 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4007 let mapped = grid.map_ref(|x| *x * 2);
4008 test_grid(&mapped, 2, 3, Order::RowMajor, &[2, 4, 6, 8, 10, 12]);
4009 }
4010
4011 #[test]
4012 #[allow(clippy::redundant_closure_for_method_calls)]
4013 fn iter_rows() {
4014 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4015 let max_by_row: Vec<u8> = grid
4016 .iter_rows()
4017 .map(|row| row.max().unwrap())
4018 .copied()
4019 .collect();
4020 assert_eq!(max_by_row, vec![3, 6]);
4021
4022 let sum_by_row: Vec<u8> = grid.iter_rows().map(|row| row.sum()).collect();
4023 assert_eq!(sum_by_row, vec![1 + 2 + 3, 4 + 5 + 6]);
4024 }
4025
4026 #[test]
4027 #[allow(clippy::redundant_closure_for_method_calls)]
4028 fn iter_rows_rev() {
4029 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4030 let max_by_row: Vec<u8> = grid
4031 .iter_rows()
4032 .rev()
4033 .map(|row| row.max().unwrap())
4034 .copied()
4035 .collect();
4036 assert_eq!(max_by_row, vec![6, 3]);
4037
4038 let sum_by_row: Vec<u8> = grid.iter_rows().rev().map(|row| row.sum()).collect();
4039 assert_eq!(sum_by_row, vec![4 + 5 + 6, 1 + 2 + 3]);
4040 }
4041
4042 #[test]
4043 fn iter_rows_exact_size() {
4044 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4045 let mut row_iter = grid.iter_rows();
4046 assert_eq!(row_iter.len(), 2);
4047 assert!(row_iter.next().is_some());
4048 assert_eq!(row_iter.len(), 1);
4049 assert!(row_iter.next().is_some());
4050 assert_eq!(row_iter.len(), 0);
4051 assert!(row_iter.next().is_none());
4052 }
4053
4054 #[test]
4055 #[allow(clippy::redundant_closure_for_method_calls)]
4056 fn iter_cols() {
4057 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4058 let max_by_col: Vec<u8> = grid
4059 .iter_cols()
4060 .map(|col| col.max().unwrap())
4061 .copied()
4062 .collect();
4063
4064 assert_eq!(max_by_col, vec![4, 5, 6]);
4065
4066 let sum_by_col: Vec<u8> = grid.iter_cols().map(|row| row.sum()).collect();
4067 assert_eq!(sum_by_col, vec![1 + 4, 2 + 5, 3 + 6]);
4068 }
4069
4070 #[test]
4071 #[allow(clippy::redundant_closure_for_method_calls)]
4072 fn iter_cols_rev() {
4073 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4074 let max_by_col: Vec<u8> = grid
4075 .iter_cols()
4076 .rev()
4077 .map(|col| col.max().unwrap())
4078 .copied()
4079 .collect();
4080
4081 assert_eq!(max_by_col, vec![6, 5, 4]);
4082
4083 let sum_by_col: Vec<u8> = grid.iter_cols().rev().map(|row| row.sum()).collect();
4084 assert_eq!(sum_by_col, vec![3 + 6, 2 + 5, 1 + 4]);
4085 }
4086
4087 #[test]
4088 fn iter_cols_exact_size() {
4089 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4090 let mut col_iter = grid.iter_cols();
4091 assert_eq!(col_iter.len(), 3);
4092 assert!(col_iter.next().is_some());
4093 assert_eq!(col_iter.len(), 2);
4094 assert!(col_iter.next().is_some());
4095 assert_eq!(col_iter.len(), 1);
4096 assert!(col_iter.next().is_some());
4097 assert_eq!(col_iter.len(), 0);
4098 assert!(col_iter.next().is_none());
4099 }
4100
4101 #[test]
4102 fn remove_row() {
4103 let mut grid = grid![[1,2][3,4][5,6]];
4104 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
4105 test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 5, 6]);
4106 assert_eq![grid.remove_row(0), Some(vec![1, 2])];
4107 test_grid(&grid, 1, 2, Order::RowMajor, &[5, 6]);
4108 assert_eq![grid.remove_row(0), Some(vec![5, 6])];
4109 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4110 assert_eq![grid.remove_row(0), None];
4111 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4112 }
4113
4114 #[test]
4115 fn remove_row_out_of_bound() {
4116 let mut grid = grid![[1, 2][3, 4]];
4117 assert_eq![grid.remove_row(5), None];
4118 test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
4119 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
4120 test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
4121 }
4122
4123 #[test]
4124 fn remove_row_column_major() {
4125 let mut grid = Grid::from_vec_with_order(vec![1, 3, 5, 2, 4, 6], 2, Order::ColumnMajor);
4126 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
4127 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 5, 2, 6]);
4128 assert_eq![grid.remove_row(0), Some(vec![1, 2])];
4129 test_grid(&grid, 1, 2, Order::ColumnMajor, &[5, 6]);
4130 assert_eq![grid.remove_row(0), Some(vec![5, 6])];
4131 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4132 assert_eq![grid.remove_row(0), None];
4133 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4134 }
4135
4136 #[test]
4137 fn remove_row_out_of_bound_column_major() {
4138 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
4139 assert_eq![grid.remove_row(5), None];
4140 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
4141 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
4142 test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
4143 }
4144
4145 #[test]
4146 fn remove_col() {
4147 let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
4148 assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])];
4149 let expected = [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15];
4150 test_grid(&grid, 4, 3, Order::RowMajor, &expected);
4151 assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])];
4152 test_grid(&grid, 4, 2, Order::RowMajor, &[2, 3, 6, 7, 10, 11, 14, 15]);
4153 assert_eq![grid.remove_col(1), Some(vec![3, 7, 11, 15])];
4154 test_grid(&grid, 4, 1, Order::RowMajor, &[2, 6, 10, 14]);
4155 assert_eq![grid.remove_col(0), Some(vec![2, 6, 10, 14])];
4156 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4157 assert_eq![grid.remove_col(0), None];
4158 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4159 }
4160
4161 #[test]
4162 fn remove_col_out_of_bound() {
4163 let mut grid = grid![[1, 2][3, 4]];
4164 assert_eq!(grid.remove_col(5), None);
4165 test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
4166 assert_eq!(grid.remove_col(1), Some(vec![2, 4]));
4167 test_grid(&grid, 2, 1, Order::RowMajor, &[1, 3]);
4168 }
4169
4170 #[test]
4171 fn remove_col_column_major() {
4172 let internal = vec![1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16];
4173 let mut grid = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
4174 assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])];
4175 let expected = [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15];
4176 test_grid(&grid, 4, 3, Order::ColumnMajor, &expected);
4177 assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])];
4178 let expected = [2, 6, 10, 14, 3, 7, 11, 15];
4179 test_grid(&grid, 4, 2, Order::ColumnMajor, &expected);
4180 assert_eq![grid.remove_col(1), Some(vec![3, 7, 11, 15])];
4181 test_grid(&grid, 4, 1, Order::ColumnMajor, &[2, 6, 10, 14]);
4182 assert_eq![grid.remove_col(0), Some(vec![2, 6, 10, 14])];
4183 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4184 assert_eq![grid.remove_col(0), None];
4185 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4186 }
4187
4188 #[test]
4189 fn remove_col_out_of_bound_column_major() {
4190 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
4191 assert_eq!(grid.remove_col(5), None);
4192 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
4193 assert_eq!(grid.remove_col(1), Some(vec![2, 4]));
4194 test_grid(&grid, 2, 1, Order::ColumnMajor, &[1, 3]);
4195 }
4196
4197 #[test]
4198 fn delete_row() {
4199 let mut grid = grid![[1,2][3,4][5,6]];
4200 assert!(grid.delete_row(1));
4201 test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 5, 6]);
4202 assert!(grid.delete_row(0));
4203 test_grid(&grid, 1, 2, Order::RowMajor, &[5, 6]);
4204 assert!(grid.delete_row(0));
4205 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4206 assert!(!grid.delete_row(0));
4207 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4208 }
4209
4210 #[test]
4211 fn delete_row_out_of_bound() {
4212 let mut grid = grid![[1, 2][3, 4]];
4213 assert!(!grid.delete_row(5));
4214 test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
4215 assert!(grid.delete_row(1));
4216 test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
4217 }
4218
4219 #[test]
4220 fn delete_row_column_major() {
4221 let mut grid = Grid::from_vec_with_order(vec![1, 3, 5, 2, 4, 6], 2, Order::ColumnMajor);
4222 assert!(grid.delete_row(1));
4223 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 5, 2, 6]);
4224 assert!(grid.delete_row(0));
4225 test_grid(&grid, 1, 2, Order::ColumnMajor, &[5, 6]);
4226 assert!(grid.delete_row(0));
4227 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4228 assert!(!grid.delete_row(0));
4229 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4230 }
4231
4232 #[test]
4233 fn delete_row_out_of_bound_column_major() {
4234 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
4235 assert!(!grid.delete_row(5));
4236 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
4237 assert!(grid.delete_row(1));
4238 test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
4239 }
4240
4241 #[test]
4242 fn delete_col() {
4243 let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
4244 assert!(grid.delete_col(3));
4245 let expected = [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15];
4246 test_grid(&grid, 4, 3, Order::RowMajor, &expected);
4247 assert!(grid.delete_col(0));
4248 test_grid(&grid, 4, 2, Order::RowMajor, &[2, 3, 6, 7, 10, 11, 14, 15]);
4249 assert!(grid.delete_col(1));
4250 test_grid(&grid, 4, 1, Order::RowMajor, &[2, 6, 10, 14]);
4251 assert!(grid.delete_col(0));
4252 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4253 assert!(!grid.delete_col(0));
4254 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4255 }
4256
4257 #[test]
4258 fn delete_col_out_of_bound() {
4259 let mut grid = grid![[1, 2][3, 4]];
4260 assert!(!grid.delete_col(5));
4261 test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
4262 assert!(grid.delete_col(1));
4263 test_grid(&grid, 2, 1, Order::RowMajor, &[1, 3]);
4264 }
4265
4266 #[test]
4267 fn delete_col_column_major() {
4268 let internal = vec![1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16];
4269 let mut grid = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
4270 assert!(grid.delete_col(3));
4271 let expected = [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15];
4272 test_grid(&grid, 4, 3, Order::ColumnMajor, &expected);
4273 assert!(grid.delete_col(0));
4274 let expected = [2, 6, 10, 14, 3, 7, 11, 15];
4275 test_grid(&grid, 4, 2, Order::ColumnMajor, &expected);
4276 assert!(grid.delete_col(1));
4277 test_grid(&grid, 4, 1, Order::ColumnMajor, &[2, 6, 10, 14]);
4278 assert!(grid.delete_col(0));
4279 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4280 assert!(!grid.delete_col(0));
4281 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4282 }
4283
4284 #[test]
4285 fn delete_col_out_of_bound_column_major() {
4286 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
4287 assert!(!grid.delete_col(5));
4288 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
4289 assert!(grid.delete_col(1));
4290 test_grid(&grid, 2, 1, Order::ColumnMajor, &[1, 3]);
4291 }
4292
4293 #[test]
4294 fn delete_row_multiple() {
4295 let mut grid = grid![[1,2,3][4,5,6][7,8,9][10,11,12]];
4297 assert!(grid.delete_row(2));
4298 test_grid(
4299 &grid,
4300 3,
4301 3,
4302 Order::RowMajor,
4303 &[1, 2, 3, 4, 5, 6, 10, 11, 12],
4304 );
4305 assert!(grid.delete_row(1));
4306 test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 3, 10, 11, 12]);
4307 assert!(grid.delete_row(0));
4308 test_grid(&grid, 1, 3, Order::RowMajor, &[10, 11, 12]);
4309 }
4310
4311 #[test]
4312 fn delete_col_multiple() {
4313 let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12]];
4315 assert!(grid.delete_col(2));
4316 test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 4, 5, 6, 8, 9, 10, 12]);
4317 assert!(grid.delete_col(1));
4318 test_grid(&grid, 3, 2, Order::RowMajor, &[1, 4, 5, 8, 9, 12]);
4319 assert!(grid.delete_col(0));
4320 test_grid(&grid, 3, 1, Order::RowMajor, &[4, 8, 12]);
4321 }
4322
4323 #[test]
4324 fn delete_row_vs_remove_row_equivalence() {
4325 let mut grid1 = grid![[1,2][3,4][5,6]];
4327 let mut grid2 = grid![[1,2][3,4][5,6]];
4328
4329 grid1.delete_row(1);
4330 let _ = grid2.remove_row(1);
4331 assert_eq!(grid1, grid2);
4332 }
4333
4334 #[test]
4335 fn delete_col_vs_remove_col_equivalence() {
4336 let mut grid1 = grid![[1,2,3][4,5,6][7,8,9]];
4338 let mut grid2 = grid![[1,2,3][4,5,6][7,8,9]];
4339
4340 grid1.delete_col(1);
4341 let _ = grid2.remove_col(1);
4342 assert_eq!(grid1, grid2);
4343 }
4344
4345 #[test]
4346 fn flip_cols() {
4347 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
4348 grid.flip_cols();
4349 test_grid(&grid, 2, 2, Order::RowMajor, &[2, 1, 4, 3]);
4350 }
4351
4352 #[test]
4353 fn flip_cols_column_major() {
4354 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
4355 grid.flip_cols();
4356 test_grid(&grid, 2, 2, Order::ColumnMajor, &[2, 4, 1, 3]);
4357 }
4358
4359 #[test]
4360 fn flip_rows() {
4361 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
4362 grid.flip_rows();
4363 test_grid(&grid, 2, 2, Order::RowMajor, &[3, 4, 1, 2]);
4364 }
4365
4366 #[test]
4367 fn flip_rows_column_major() {
4368 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
4369 grid.flip_rows();
4370 test_grid(&grid, 2, 2, Order::ColumnMajor, &[3, 1, 4, 2]);
4371 }
4372
4373 #[test]
4374 fn rotate_left() {
4375 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
4376 grid.rotate_left();
4377 test_grid(&grid, 3, 2, Order::ColumnMajor, &[3, 2, 1, 6, 5, 4]);
4378 assert_eq!(grid, grid![[3,6][2,5][1,4]]);
4379 }
4380
4381 #[test]
4382 fn rotate_left_column_major() {
4383 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
4384 grid.rotate_left();
4385 test_grid(&grid, 3, 2, Order::RowMajor, &[3, 6, 2, 5, 1, 4]);
4386 assert_eq!(grid, grid![[3,6][2,5][1,4]]);
4387 }
4388
4389 #[test]
4390 fn rotate_right() {
4391 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
4392 grid.rotate_right();
4393 test_grid(&grid, 3, 2, Order::ColumnMajor, &[4, 5, 6, 1, 2, 3]);
4394 assert_eq!(grid, grid![[4,1][5,2][6,3]]);
4395 }
4396
4397 #[test]
4398 fn rotate_right_column_major() {
4399 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
4400 grid.rotate_right();
4401 test_grid(&grid, 3, 2, Order::RowMajor, &[4, 1, 5, 2, 6, 3]);
4402 assert_eq!(grid, grid![[4,1][5,2][6,3]]);
4403 }
4404
4405 #[test]
4406 fn iter_cols_clone() {
4407 let grid = grid![[1,2,3][4,5,6]];
4408 let mut cols = grid.iter_cols().skip(1);
4409 let c3: u8 = cols.clone().nth(1).unwrap().sum();
4410 let c2: u8 = cols.next().unwrap().sum();
4411 assert_eq!(c2, 2 + 5);
4412 assert_eq!(c3, 3 + 6);
4413 }
4414
4415 #[test]
4416 fn iter_rows_clone() {
4417 let grid = grid![[1,2,3][4,5,6][7,8,9]];
4418 let mut rows = grid.iter_rows().skip(1);
4419 let r3: u8 = rows.clone().nth(1).unwrap().sum();
4420 let r2: u8 = rows.next().unwrap().sum();
4421 assert_eq!(r2, 4 + 5 + 6);
4422 assert_eq!(r3, 7 + 8 + 9);
4423 }
4424
4425 #[test]
4426 fn swap() {
4427 let mut grid = grid![[1,2][4,5]];
4428 grid.swap((0, 0), (1, 0));
4429 let end_grid = grid![[4,2][1,5]];
4430 assert_eq!(grid, end_grid);
4431 }
4432
4433 #[test]
4434 #[should_panic(expected = "grid index out of bounds: (2,0) out of (2,2)")]
4435 fn swap_out_of_bounds() {
4436 let mut grid = grid![[1,2][4,5]];
4437 grid.swap((0, 0), (2, 0));
4438 }
4439
4440 #[cfg(feature = "serde")]
4441 mod serde_tests {
4442 use super::*;
4443
4444 #[test]
4445 fn serialize() {
4446 let grid: Grid<u8> = grid![[1, 2][3, 4]];
4447 let s = serde_json::to_string(&grid).unwrap();
4448 assert_eq!(s, r#"{"cols":2,"data":[1,2,3,4],"order":"RowMajor"}"#);
4449 }
4450
4451 #[test]
4452 fn deserialize() {
4453 let s = "{ \"cols\": 2, \"data\": [1, 2, 3, 4] }";
4454 let grid: Grid<u8> = serde_json::from_str(s).unwrap();
4455 assert_eq!(grid, grid![[1, 2][3, 4]]);
4456 }
4457
4458 #[test]
4459 fn deserialize_with_order() {
4460 let s = "{ \"cols\": 2, \"data\": [1, 3, 2, 4], \"order\": \"ColumnMajor\" }";
4461 let grid: Grid<u8> = serde_json::from_str(s).unwrap();
4462 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
4463 }
4464 }
4465}