1#![warn(clippy::all, clippy::pedantic)]
2#![cfg_attr(not(feature = "std"), no_std)]
44
45#[cfg(not(feature = "std"))]
46extern crate alloc;
47#[cfg(not(feature = "std"))]
48use alloc::{format, vec, vec::Vec};
49#[cfg(feature = "serde")]
50use serde::{
51 de::{self, Deserialize, Deserializer, MapAccess, SeqAccess, Visitor},
52 ser::{Serialize, SerializeStruct, Serializer},
53};
54
55use core::{
56 cmp::{self, Eq},
57 convert::TryInto,
58 fmt, hash,
59 iter::StepBy,
60 ops::{Index, IndexMut},
61 slice::{ChunksExact, ChunksExactMut, Iter, IterMut},
62};
63
64#[doc(hidden)]
65#[macro_export]
66macro_rules! count {
67 () => (0usize);
68 ( $x:tt $($xs:tt)* ) => (1usize + $crate::count!($($xs)*));
69}
70
71#[macro_export]
97macro_rules! grid {
98 () => {
99 $crate::Grid::from_vec(vec![], 0)
100 };
101 ( [$( $x:expr ),* ]) => { {
102 let vec = vec![$($x),*];
103 let len = vec.len();
104 $crate::Grid::from_vec(vec, len)
105 } };
106 ( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => {
107 {
108 let mut _assert_width0 = [(); $crate::count!($($x0)*)];
109 let cols = $crate::count!($($x0)*);
110 let rows = 1usize;
111
112 $(
113 let _assert_width = [(); $crate::count!($($x)*)];
114 _assert_width0 = _assert_width;
115 let rows = rows + 1usize;
116 )*
117
118 let mut vec = Vec::with_capacity(rows.checked_mul(cols).unwrap());
119
120 $( vec.push($x0); )*
121 $( $( vec.push($x); )* )*
122
123 $crate::Grid::from_vec(vec, cols)
124 }
125 };
126}
127
128#[macro_export]
154macro_rules! grid_cm {
155 () => {
156 $crate::Grid::from_vec_with_order(vec![], 0, $crate::Order::ColumnMajor)
157 };
158 ( [$( $x:expr ),* ]) => { {
159 let vec = vec![$($x),*];
160 let len = vec.len();
161 $crate::Grid::from_vec_with_order(vec, len, $crate::Order::ColumnMajor)
162 } };
163 ( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => {
164 {
165 let mut _assert_width0 = [(); $crate::count!($($x0)*)];
166 let cols = $crate::count!($($x0)*);
167 let rows = 1usize;
168
169 $(
170 let _assert_width = [(); $crate::count!($($x)*)];
171 _assert_width0 = _assert_width;
172 let rows = rows + 1usize;
173 )*
174
175 let vec = Vec::with_capacity(rows.checked_mul(cols).unwrap());
176 let mut grid = $crate::Grid::from_vec_with_order(vec, cols, $crate::Order::ColumnMajor);
177
178 grid.push_row(vec![$($x0),*]);
179 $( grid.push_row(vec![$($x),*]); )*
180
181 grid
182 }
183 };
184}
185
186#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
188#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
189pub enum Order {
190 #[default]
192 RowMajor,
193
194 ColumnMajor,
196}
197
198impl Order {
199 fn counterpart(self) -> Self {
200 match self {
201 Self::RowMajor => Self::ColumnMajor,
202 Self::ColumnMajor => Self::RowMajor,
203 }
204 }
205}
206
207pub struct Grid<T> {
215 data: Vec<T>,
216 cols: usize,
217 rows: usize,
218 order: Order,
219}
220
221#[cfg(feature = "serde")]
222impl<'de, T: Deserialize<'de>> Deserialize<'de> for Grid<T> {
223 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
224 where
225 D: Deserializer<'de>,
226 {
227 use std::marker::PhantomData;
228 #[derive(serde::Deserialize)]
229 #[serde(field_identifier, rename_all = "lowercase")]
230 enum Field {
231 Data,
232 Cols,
233 Order,
234 }
235
236 struct GridVisitor<T> {
237 _p: PhantomData<T>,
238 }
239
240 impl<'de, T: Deserialize<'de>> Visitor<'de> for GridVisitor<T> {
241 type Value = Grid<T>;
242
243 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
244 formatter.write_str("struct Grid")
245 }
246
247 fn visit_seq<V>(self, mut seq: V) -> Result<Grid<T>, V::Error>
248 where
249 V: SeqAccess<'de>,
250 {
251 let cols = seq
252 .next_element()?
253 .ok_or_else(|| de::Error::invalid_length(0, &self))?;
254 let data = seq
255 .next_element()?
256 .ok_or_else(|| de::Error::invalid_length(1, &self))?;
257 let order = seq.next_element()?.unwrap_or_default();
258 Ok(Grid::from_vec_with_order(data, cols, order))
259 }
260
261 fn visit_map<V>(self, mut map: V) -> Result<Grid<T>, V::Error>
262 where
263 V: MapAccess<'de>,
264 {
265 let mut cols = None;
266 let mut data = None;
267 let mut order = None;
268 while let Some(key) = map.next_key()? {
269 match key {
270 Field::Data => {
271 if data.is_some() {
272 return Err(de::Error::duplicate_field("data"));
273 }
274 data = Some(map.next_value()?);
275 }
276 Field::Cols => {
277 if cols.is_some() {
278 return Err(de::Error::duplicate_field("cols"));
279 }
280 cols = Some(map.next_value()?);
281 }
282 Field::Order => {
283 if order.is_some() {
284 return Err(de::Error::duplicate_field("order"));
285 }
286 order = Some(map.next_value()?);
287 }
288 }
289 }
290 let cols = cols.ok_or_else(|| de::Error::missing_field("cols"))?;
291 let data = data.ok_or_else(|| de::Error::missing_field("data"))?;
292 let order = order.unwrap_or_default();
293 Ok(Grid::from_vec_with_order(data, cols, order))
294 }
295 }
296
297 const FIELDS: &'static [&'static str] = &["cols", "data", "order"];
298 deserializer.deserialize_struct("Grid", FIELDS, GridVisitor { _p: PhantomData })
299 }
300}
301
302#[cfg(feature = "serde")]
303impl<T: Serialize> Serialize for Grid<T> {
304 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
305 where
306 S: Serializer,
307 {
308 let mut state = serializer.serialize_struct("Grid", 3)?;
310 state.serialize_field("cols", &self.cols)?;
311 state.serialize_field("data", &self.data)?;
312 state.serialize_field("order", &self.order)?;
313 state.end()
314 }
315}
316
317impl<T> Grid<T> {
318 #[must_use]
336 #[inline]
337 pub fn new(rows: usize, cols: usize) -> Self
338 where
339 T: Default,
340 {
341 Self::new_with_order(rows, cols, Order::default())
342 }
343
344 pub fn new_with_order(rows: usize, cols: usize, order: Order) -> Self
350 where
351 T: Default,
352 {
353 if rows == 0 || cols == 0 {
354 return Self {
355 data: Vec::new(),
356 rows: 0,
357 cols: 0,
358 order,
359 };
360 }
361 let mut data = Vec::new();
362 data.resize_with(rows.checked_mul(cols).unwrap(), T::default);
363 Self {
364 data,
365 cols,
366 rows,
367 order,
368 }
369 }
370
371 #[inline]
382 pub fn init(rows: usize, cols: usize, data: T) -> Self
383 where
384 T: Clone,
385 {
386 Self::init_with_order(rows, cols, Order::default(), data)
387 }
388
389 pub fn init_with_order(rows: usize, cols: usize, order: Order, data: T) -> Self
395 where
396 T: Clone,
397 {
398 if rows == 0 || cols == 0 {
399 return Self {
400 data: Vec::new(),
401 rows: 0,
402 cols: 0,
403 order,
404 };
405 }
406 Self {
407 data: vec![data; rows.checked_mul(cols).unwrap()],
408 cols,
409 rows,
410 order,
411 }
412 }
413
414 #[must_use]
443 #[inline]
444 pub fn from_vec(vec: Vec<T>, cols: usize) -> Self {
445 Self::from_vec_with_order(vec, cols, Order::default())
446 }
447
448 #[must_use]
454 pub fn from_vec_with_order(vec: Vec<T>, cols: usize, order: Order) -> Self {
455 let rows = vec.len().checked_div(cols).unwrap_or(0);
456 assert_eq!(
457 rows * cols,
458 vec.len(),
459 "Vector length {:?} should be a multiple of cols = {:?}",
460 vec.len(),
461 cols
462 );
463 if rows == 0 || cols == 0 {
464 Grid {
465 data: vec,
466 rows: 0,
467 cols: 0,
468 order,
469 }
470 } else {
471 Grid {
472 data: vec,
473 rows,
474 cols,
475 order,
476 }
477 }
478 }
479
480 #[inline]
482 #[must_use]
483 fn get_index(&self, row: usize, col: usize) -> usize {
484 match self.order {
485 Order::RowMajor => row * self.cols + col,
486 Order::ColumnMajor => col * self.rows + row,
487 }
488 }
489
490 #[inline]
498 #[must_use]
499 pub unsafe fn get_unchecked(&self, row: impl Into<usize>, col: impl Into<usize>) -> &T {
500 let index = self.get_index(row.into(), col.into());
501 self.data.get_unchecked(index)
502 }
503
504 #[inline]
512 #[must_use]
513 pub unsafe fn get_unchecked_mut(
514 &mut self,
515 row: impl Into<usize>,
516 col: impl Into<usize>,
517 ) -> &mut T {
518 let index = self.get_index(row.into(), col.into());
519 self.data.get_unchecked_mut(index)
520 }
521
522 #[must_use]
525 pub fn get(&self, row: impl TryInto<usize>, col: impl TryInto<usize>) -> Option<&T> {
526 let row_usize = row.try_into().ok()?;
527 let col_usize = col.try_into().ok()?;
528 if row_usize < self.rows && col_usize < self.cols {
529 unsafe { Some(self.get_unchecked(row_usize, col_usize)) }
530 } else {
531 None
532 }
533 }
534
535 #[must_use]
538 pub fn get_mut(
539 &mut self,
540 row: impl TryInto<usize>,
541 col: impl TryInto<usize>,
542 ) -> Option<&mut T> {
543 let row_usize = row.try_into().ok()?;
544 let col_usize = col.try_into().ok()?;
545 if row_usize < self.rows && col_usize < self.cols {
546 unsafe { Some(self.get_unchecked_mut(row_usize, col_usize)) }
547 } else {
548 None
549 }
550 }
551
552 #[must_use]
556 pub fn get_row(&self, row: impl TryInto<usize>) -> Option<&[T]> {
557 let row_usize = row.try_into().ok()?;
558 if row_usize < self.rows && self.order == Order::RowMajor {
559 let start = row_usize * self.cols;
560 Some(self.data[start..(start + self.cols)].as_ref())
561 } else {
562 None
563 }
564 }
565
566 #[must_use]
570 pub fn get_mut_row(&mut self, row: impl TryInto<usize>) -> Option<&mut [T]> {
571 let row_usize = row.try_into().ok()?;
572 if row_usize < self.rows && self.order == Order::RowMajor {
573 let start = row_usize * self.cols;
574 Some(self.data[start..(start + self.cols)].as_mut())
575 } else {
576 None
577 }
578 }
579
580 #[must_use]
584 pub fn get_col(&self, column: impl TryInto<usize>) -> Option<&[T]> {
585 let column_usize = column.try_into().ok()?;
586 if column_usize < self.cols && self.order == Order::ColumnMajor {
587 let start = column_usize * self.rows;
588 Some(self.data[start..(start + self.rows)].as_ref())
589 } else {
590 None
591 }
592 }
593
594 #[must_use]
598 pub fn get_mut_col(&mut self, column: impl TryInto<usize>) -> Option<&mut [T]> {
599 let column_usize = column.try_into().ok()?;
600 if column_usize < self.cols && self.order == Order::ColumnMajor {
601 let start = column_usize * self.rows;
602 Some(self.data[start..(start + self.rows)].as_mut())
603 } else {
604 None
605 }
606 }
607
608 #[must_use]
611 pub fn size(&self) -> (usize, usize) {
612 (self.rows, self.cols)
613 }
614
615 #[must_use]
617 pub fn rows(&self) -> usize {
618 self.rows
619 }
620
621 #[must_use]
623 pub fn cols(&self) -> usize {
624 self.cols
625 }
626
627 #[must_use]
629 pub fn order(&self) -> Order {
630 self.order
631 }
632
633 #[must_use]
641 pub fn is_empty(&self) -> bool {
642 self.data.is_empty()
643 }
644
645 pub fn clear(&mut self) {
649 self.rows = 0;
650 self.cols = 0;
651 self.data.clear();
652 }
653
654 pub fn iter(&self) -> Iter<T> {
671 self.data.iter()
672 }
673
674 pub fn iter_mut(&mut self) -> IterMut<T> {
687 self.data.iter_mut()
688 }
689
690 pub fn iter_col(&self, col: usize) -> StepBy<Iter<T>> {
712 assert!(
713 col < self.cols,
714 "out of bounds. Column must be less than {:?}, but is {:?}",
715 self.cols,
716 col
717 );
718 match self.order {
719 Order::RowMajor => self.data[col..].iter().step_by(self.cols),
720 Order::ColumnMajor => {
721 let start = col * self.rows;
722 self.data[start..(start + self.rows)].iter().step_by(1)
723 }
724 }
725 }
726
727 pub fn iter_col_mut(&mut self, col: usize) -> StepBy<IterMut<T>> {
750 assert!(
751 col < self.cols,
752 "out of bounds. Column must be less than {:?}, but is {:?}",
753 self.cols,
754 col
755 );
756 match self.order {
757 Order::RowMajor => self.data[col..].iter_mut().step_by(self.cols),
758 Order::ColumnMajor => {
759 let start = col * self.rows;
760 self.data[start..(start + self.rows)].iter_mut().step_by(1)
761 }
762 }
763 }
764
765 pub fn iter_row(&self, row: usize) -> StepBy<Iter<T>> {
787 assert!(
788 row < self.rows,
789 "out of bounds. Row must be less than {:?}, but is {:?}",
790 self.rows,
791 row
792 );
793 match self.order {
794 Order::RowMajor => {
795 let start = row * self.cols;
796 self.data[start..(start + self.cols)].iter().step_by(1)
797 }
798 Order::ColumnMajor => self.data[row..].iter().step_by(self.rows),
799 }
800 }
801
802 pub fn iter_row_mut(&mut self, row: usize) -> StepBy<IterMut<T>> {
823 assert!(
824 row < self.rows,
825 "out of bounds. Row must be less than {:?}, but is {:?}",
826 self.rows,
827 row
828 );
829 match self.order {
830 Order::RowMajor => {
831 let start = row * self.cols;
832 self.data[start..(start + self.cols)].iter_mut().step_by(1)
833 }
834 Order::ColumnMajor => self.data[row..].iter_mut().step_by(self.rows),
835 }
836 }
837
838 pub fn indexed_iter(&self) -> impl Iterator<Item = ((usize, usize), &T)> {
862 self.data.iter().enumerate().map(move |(idx, i)| {
863 let position = match self.order {
864 Order::RowMajor => (idx / self.cols, idx % self.cols),
865 Order::ColumnMajor => (idx % self.rows, idx / self.rows),
866 };
867 (position, i)
868 })
869 }
870
871 pub fn indexed_iter_mut(&mut self) -> impl Iterator<Item = ((usize, usize), &mut T)> {
902 let order = self.order;
903 let cols = self.cols;
904 let rows = self.rows;
905
906 self.data.iter_mut().enumerate().map(move |(idx, i)| {
907 let position = match order {
908 Order::RowMajor => (idx / cols, idx % cols),
909 Order::ColumnMajor => (idx % rows, idx / rows),
910 };
911 (position, i)
912 })
913 }
914
915 pub fn push_row(&mut self, row: Vec<T>) {
950 assert_ne!(row.len(), 0);
951 assert!(
952 !(self.rows > 0 && row.len() != self.cols),
953 "pushed row does not match. Length must be {:?}, but was {:?}.",
954 self.cols,
955 row.len()
956 );
957 self.data.extend(row);
958 if self.order == Order::ColumnMajor {
959 for i in (1..self.cols).rev() {
960 let col_idx = i * self.rows;
961 self.data[col_idx..col_idx + self.rows + i].rotate_right(i);
962 }
963 }
964 self.rows += 1;
965 if self.cols == 0 {
966 self.cols = self.data.len();
967 }
968 }
969
970 pub fn push_col(&mut self, col: Vec<T>) {
1005 assert_ne!(col.len(), 0);
1006 assert!(
1007 !(self.cols > 0 && col.len() != self.rows),
1008 "pushed column does not match. Length must be {:?}, but was {:?}.",
1009 self.rows,
1010 col.len()
1011 );
1012 self.data.extend(col);
1013 if self.order == Order::RowMajor {
1014 for i in (1..self.rows).rev() {
1015 let row_idx = i * self.cols;
1016 self.data[row_idx..row_idx + self.cols + i].rotate_right(i);
1017 }
1018 }
1019 self.cols += 1;
1020 if self.rows == 0 {
1021 self.rows = self.data.len();
1022 }
1023 }
1024
1025 pub fn pop_row(&mut self) -> Option<Vec<T>> {
1040 if self.rows == 0 {
1041 return None;
1042 }
1043 if self.order == Order::ColumnMajor {
1044 for i in 1..self.cols {
1045 let col_idx = i * (self.rows - 1);
1046 self.data[col_idx..col_idx + self.rows + i - 1].rotate_left(i);
1047 }
1048 }
1049 let row = self.data.split_off(self.data.len() - self.cols);
1050 self.rows -= 1;
1051 if self.rows == 0 {
1052 self.cols = 0;
1053 }
1054 Some(row)
1055 }
1056
1057 pub fn remove_row(&mut self, row_index: usize) -> Option<Vec<T>> {
1073 if self.cols == 0 || self.rows == 0 || row_index >= self.rows {
1074 return None;
1075 }
1076 let row = match self.order {
1077 Order::RowMajor => self
1078 .data
1079 .drain((row_index * self.cols)..((row_index + 1) * self.cols))
1080 .collect(),
1081 Order::ColumnMajor => {
1082 for i in 0..self.cols {
1083 let col_idx = row_index + i * (self.rows - 1);
1084 let end = cmp::min(col_idx + self.rows + i, self.data.len());
1085 self.data[col_idx..end].rotate_left(i + 1);
1086 }
1087 self.data.split_off(self.data.len() - self.cols)
1088 }
1089 };
1090 self.rows -= 1;
1091 if self.rows == 0 {
1092 self.cols = 0;
1093 }
1094 Some(row)
1095 }
1096
1097 pub fn pop_col(&mut self) -> Option<Vec<T>> {
1117 if self.cols == 0 {
1118 return None;
1119 }
1120 if self.order == Order::RowMajor {
1121 for i in 1..self.rows {
1122 let row_idx = i * (self.cols - 1);
1123 self.data[row_idx..row_idx + self.cols + i - 1].rotate_left(i);
1124 }
1125 }
1126 let col = self.data.split_off(self.data.len() - self.rows);
1127 self.cols -= 1;
1128 if self.cols == 0 {
1129 self.rows = 0;
1130 }
1131 Some(col)
1132 }
1133
1134 pub fn remove_col(&mut self, col_index: usize) -> Option<Vec<T>> {
1152 if self.cols == 0 || self.rows == 0 || col_index >= self.cols {
1153 return None;
1154 }
1155 let col = match self.order {
1156 Order::RowMajor => {
1157 for i in 0..self.rows {
1158 let row_idx = col_index + i * (self.cols - 1);
1159 let end = cmp::min(row_idx + self.cols + i, self.data.len());
1160 self.data[row_idx..end].rotate_left(i + 1);
1161 }
1162 self.data.split_off(self.data.len() - self.rows)
1163 }
1164 Order::ColumnMajor => self
1165 .data
1166 .drain((col_index * self.rows)..((col_index + 1) * self.rows))
1167 .collect(),
1168 };
1169 self.cols -= 1;
1170 if self.cols == 0 {
1171 self.rows = 0;
1172 }
1173 Some(col)
1174 }
1175
1176 pub fn insert_row(&mut self, index: usize, row: Vec<T>) {
1196 let input_len = row.len();
1197 assert!(
1198 !(self.cols > 0 && input_len != self.cols),
1199 "Inserted row must be of length {}, but was {}.",
1200 self.cols,
1201 row.len()
1202 );
1203 assert!(
1204 index <= self.rows,
1205 "Out of range. Index was {}, but must be less or equal to {}.",
1206 index,
1207 self.rows
1208 );
1209 match self.order {
1210 Order::RowMajor => {
1211 let data_idx = index * input_len;
1212 self.data.splice(data_idx..data_idx, row);
1213 }
1214 Order::ColumnMajor => {
1215 for (col_iter, row_val) in row.into_iter().enumerate() {
1216 let data_idx = col_iter * self.rows + index + col_iter;
1217 self.data.insert(data_idx, row_val);
1218 }
1219 }
1220 }
1221 self.cols = input_len;
1222 self.rows += 1;
1223 }
1224
1225 pub fn insert_col(&mut self, index: usize, col: Vec<T>) {
1249 let input_len = col.len();
1250 assert!(
1251 !(self.rows > 0 && input_len != self.rows),
1252 "Inserted col must be of length {}, but was {}.",
1253 self.rows,
1254 col.len()
1255 );
1256 assert!(
1257 index <= self.cols,
1258 "Out of range. Index was {}, but must be less or equal to {}.",
1259 index,
1260 self.cols
1261 );
1262 match self.order {
1263 Order::RowMajor => {
1264 for (row_iter, col_val) in col.into_iter().enumerate() {
1265 let data_idx = row_iter * self.cols + index + row_iter;
1266 self.data.insert(data_idx, col_val);
1267 }
1268 }
1269 Order::ColumnMajor => {
1270 let data_idx = index * input_len;
1271 self.data.splice(data_idx..data_idx, col);
1272 }
1273 }
1274 self.rows = input_len;
1275 self.cols += 1;
1276 }
1277
1278 #[must_use]
1291 pub fn flatten(&self) -> &Vec<T> {
1292 &self.data
1293 }
1294
1295 #[must_use]
1300 pub fn into_vec(self) -> Vec<T> {
1301 self.data
1302 }
1303
1304 pub fn transpose(&mut self) {
1308 self.order = self.order.counterpart();
1309 core::mem::swap(&mut self.rows, &mut self.cols);
1310 }
1311
1312 pub fn flip_cols(&mut self) {
1327 match self.order {
1328 Order::RowMajor => {
1329 for row in 0..self.rows {
1330 let idx = row * self.cols;
1331 self.data[idx..idx + self.cols].reverse();
1332 }
1333 }
1334 Order::ColumnMajor => {
1335 for col in 0..self.cols / 2 {
1336 for row in 0..self.rows {
1337 let cell1 = self.get_index(row, col);
1338 let cell2 = self.get_index(row, self.cols - col - 1);
1339 self.data.swap(cell1, cell2);
1340 }
1341 }
1342 }
1343 }
1344 }
1345
1346 pub fn flip_rows(&mut self) {
1362 match self.order {
1363 Order::RowMajor => {
1364 for row in 0..self.rows / 2 {
1365 for col in 0..self.cols {
1366 let cell1 = self.get_index(row, col);
1367 let cell2 = self.get_index(self.rows - row - 1, col);
1368 self.data.swap(cell1, cell2);
1369 }
1370 }
1371 }
1372 Order::ColumnMajor => {
1373 for col in 0..self.cols {
1374 let idx = col * self.rows;
1375 self.data[idx..idx + self.rows].reverse();
1376 }
1377 }
1378 }
1379 }
1380
1381 pub fn rotate_left(&mut self) {
1399 self.transpose();
1400 self.flip_rows();
1401 }
1402
1403 pub fn rotate_right(&mut self) {
1421 self.transpose();
1422 self.flip_cols();
1423 }
1424
1425 pub fn rotate_half(&mut self) {
1442 self.data.reverse();
1443 }
1444
1445 pub fn fill(&mut self, value: T)
1456 where
1457 T: Clone,
1458 {
1459 self.data.fill(value);
1460 }
1461
1462 pub fn fill_with<F>(&mut self, f: F)
1480 where
1481 F: FnMut() -> T,
1482 {
1483 self.data.fill_with(f);
1484 }
1485
1486 #[must_use]
1501 pub fn iter_rows(&self) -> GridRowIter<'_, T> {
1502 GridRowIter {
1503 grid: self,
1504 row_start_index: 0,
1505 row_end_index: self.rows,
1506 }
1507 }
1508
1509 #[must_use]
1512 pub fn iter_rows_as_slices(&self) -> Option<ChunksExact<T>> {
1513 if self.order == Order::RowMajor {
1514 Some(self.data.chunks_exact(self.cols))
1515 } else {
1516 None
1517 }
1518 }
1519
1520 #[must_use]
1523 pub fn iter_rows_as_slices_mut(&mut self) -> Option<ChunksExactMut<T>> {
1524 if self.order == Order::RowMajor {
1525 Some(self.data.chunks_exact_mut(self.cols))
1526 } else {
1527 None
1528 }
1529 }
1530
1531 #[must_use]
1546 pub fn iter_cols(&self) -> GridColIter<'_, T> {
1547 GridColIter {
1548 grid: self,
1549 col_start_index: 0,
1550 col_end_index: self.cols,
1551 }
1552 }
1553
1554 #[must_use]
1557 pub fn iter_cols_as_slices(&self) -> Option<ChunksExact<T>> {
1558 if self.order == Order::ColumnMajor {
1559 Some(self.data.chunks_exact(self.rows))
1560 } else {
1561 None
1562 }
1563 }
1564
1565 #[must_use]
1568 pub fn iter_cols_as_slices_mut(&mut self) -> Option<ChunksExactMut<T>> {
1569 if self.order == Order::ColumnMajor {
1570 Some(self.data.chunks_exact_mut(self.rows))
1571 } else {
1572 None
1573 }
1574 }
1575
1576 pub fn swap(&mut self, (row_a, col_a): (usize, usize), (row_b, col_b): (usize, usize)) {
1583 assert!(
1584 !(row_a >= self.rows || col_a >= self.cols),
1585 "grid index out of bounds: ({row_a},{col_a}) out of ({},{})",
1586 self.rows,
1587 self.cols
1588 );
1589 assert!(
1590 !(row_b >= self.rows || col_b >= self.cols),
1591 "grid index out of bounds: ({row_b},{col_b}) out of ({},{})",
1592 self.rows,
1593 self.cols
1594 );
1595
1596 let a_idx = self.get_index(row_a, col_a);
1597 let b_idx = self.get_index(row_b, col_b);
1598
1599 self.data.swap(a_idx, b_idx);
1600 }
1601}
1602
1603impl<T> Default for Grid<T> {
1604 fn default() -> Self {
1605 Self {
1606 data: Vec::default(),
1607 cols: 0,
1608 rows: 0,
1609 order: Order::default(),
1610 }
1611 }
1612}
1613
1614impl<T: Clone> Clone for Grid<T> {
1615 fn clone(&self) -> Self {
1616 Grid {
1617 rows: self.rows,
1618 cols: self.cols,
1619 data: self.data.clone(),
1620 order: self.order,
1621 }
1622 }
1623}
1624
1625impl<T: hash::Hash> hash::Hash for Grid<T> {
1626 #[inline]
1627 fn hash<H: hash::Hasher>(&self, state: &mut H) {
1628 self.rows.hash(state);
1629 self.cols.hash(state);
1630 self.order.hash(state);
1631 self.data.hash(state);
1632 }
1633}
1634
1635impl<T> Index<(usize, usize)> for Grid<T> {
1636 type Output = T;
1637
1638 #[inline]
1639 fn index(&self, (row, col): (usize, usize)) -> &T {
1640 assert!(
1641 !(row >= self.rows || col >= self.cols),
1642 "grid index out of bounds: ({row},{col}) out of ({},{})",
1643 self.rows,
1644 self.cols
1645 );
1646 let index = self.get_index(row, col);
1647 &self.data[index]
1648 }
1649}
1650
1651impl<T> IndexMut<(usize, usize)> for Grid<T> {
1652 #[inline]
1653 fn index_mut(&mut self, (row, col): (usize, usize)) -> &mut T {
1654 assert!(
1655 !(row >= self.rows || col >= self.cols),
1656 "grid index out of bounds: ({row},{col}) out of ({},{})",
1657 self.rows,
1658 self.cols
1659 );
1660 let index = self.get_index(row, col);
1661 &mut self.data[index]
1662 }
1663}
1664
1665impl<T: fmt::Debug> fmt::Debug for Grid<T> {
1666 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1667 write!(f, "[")?;
1668 if self.cols > 0 {
1669 if f.alternate() {
1670 writeln!(f)?;
1671 let width = f.width().unwrap_or_else(|| {
1678 self.data
1680 .iter()
1681 .map(|i| format!("{i:?}").len())
1682 .max()
1683 .unwrap()
1684 });
1685 let precision = f.precision().unwrap_or(2);
1686 for mut row in self.iter_rows().map(Iterator::peekable) {
1687 write!(f, " [")?;
1688 while let Some(item) = row.next() {
1689 write!(f, " {item:width$.precision$?}")?;
1690 if row.peek().is_some() {
1691 write!(f, ",")?;
1692 }
1693 }
1694 writeln!(f, "]")?;
1695 }
1696 } else {
1697 for row in self.iter_rows() {
1698 f.debug_list().entries(row).finish()?;
1699 }
1700 }
1701 }
1702 write!(f, "]")
1703 }
1704}
1705
1706impl<T: PartialEq> PartialEq for Grid<T> {
1707 fn eq(&self, other: &Self) -> bool {
1708 if self.rows != other.rows || self.cols != other.cols {
1709 return false;
1710 }
1711 if self.order == other.order {
1712 return self.data == other.data;
1713 }
1714 for (self_row, other_row) in core::iter::zip(self.iter_rows(), other.iter_rows()) {
1715 if self_row.ne(other_row) {
1716 return false;
1717 }
1718 }
1719 true
1720 }
1721}
1722
1723impl<T: Eq> Eq for Grid<T> {}
1724
1725impl<T> From<Vec<Vec<T>>> for Grid<T> {
1726 #[allow(clippy::redundant_closure_for_method_calls)]
1727 fn from(vec: Vec<Vec<T>>) -> Self {
1728 let cols = vec.first().map_or(0, |row| row.len());
1729 Self::from_vec_with_order(vec.into_iter().flatten().collect(), cols, Order::default())
1730 }
1731}
1732
1733impl<T: Clone> From<&Vec<Vec<T>>> for Grid<T> {
1734 #[allow(clippy::redundant_closure_for_method_calls)]
1735 fn from(vec: &Vec<Vec<T>>) -> Self {
1736 let cols = vec.first().map_or(0, |row| row.len());
1737 Self::from_vec_with_order(
1738 vec.clone().into_iter().flatten().collect(),
1739 cols,
1740 Order::default(),
1741 )
1742 }
1743}
1744
1745impl<T: Clone> From<&Vec<&Vec<T>>> for Grid<T> {
1746 #[allow(clippy::redundant_closure_for_method_calls)]
1747 fn from(vec: &Vec<&Vec<T>>) -> Self {
1748 let cols = vec.first().map_or(0, |row| row.len());
1749 Self::from_vec_with_order(
1750 vec.clone()
1751 .into_iter()
1752 .flat_map(|inner| inner.clone())
1753 .collect(),
1754 cols,
1755 Order::default(),
1756 )
1757 }
1758}
1759
1760impl<T> From<(Vec<T>, usize)> for Grid<T> {
1761 fn from(value: (Vec<T>, usize)) -> Self {
1762 Self::from_vec_with_order(value.0, value.1, Order::default())
1763 }
1764}
1765
1766impl<T: Clone> From<(&Vec<T>, usize)> for Grid<T> {
1767 fn from(value: (&Vec<T>, usize)) -> Self {
1768 Self::from_vec_with_order(value.0.clone(), value.1, Order::default())
1769 }
1770}
1771
1772impl<T: Clone> From<(&Vec<T>, &usize)> for Grid<T> {
1773 fn from(value: (&Vec<T>, &usize)) -> Self {
1774 Self::from_vec_with_order(value.0.clone(), *value.1, Order::default())
1775 }
1776}
1777
1778impl<'a, T> IntoIterator for &'a Grid<T> {
1779 type IntoIter = std::slice::Iter<'a, T>;
1780 type Item = &'a T;
1781 fn into_iter(self) -> Self::IntoIter {
1782 self.iter()
1783 }
1784}
1785
1786impl<'a, T> IntoIterator for &'a mut Grid<T> {
1787 type IntoIter = std::slice::IterMut<'a, T>;
1788 type Item = &'a mut T;
1789 fn into_iter(self) -> Self::IntoIter {
1790 self.iter_mut()
1791 }
1792}
1793
1794#[derive(Clone)]
1795pub struct GridRowIter<'a, T> {
1796 grid: &'a Grid<T>,
1797 row_start_index: usize,
1798 row_end_index: usize,
1799}
1800
1801#[derive(Clone)]
1802pub struct GridColIter<'a, T> {
1803 grid: &'a Grid<T>,
1804 col_start_index: usize,
1805 col_end_index: usize,
1806}
1807
1808impl<'a, T> Iterator for GridRowIter<'a, T> {
1809 type Item = StepBy<Iter<'a, T>>;
1810
1811 fn next(&mut self) -> Option<Self::Item> {
1812 if self.row_start_index >= self.row_end_index {
1813 return None;
1814 }
1815
1816 let row_iter = self.grid.iter_row(self.row_start_index);
1817 self.row_start_index += 1;
1818 Some(row_iter)
1819 }
1820
1821 fn size_hint(&self) -> (usize, Option<usize>) {
1822 let size = self.row_end_index - self.row_start_index;
1823 (size, Some(size))
1824 }
1825}
1826
1827impl<'a, T> ExactSizeIterator for GridRowIter<'a, T> {}
1828
1829impl<'a, T> DoubleEndedIterator for GridRowIter<'a, T> {
1830 fn next_back(&mut self) -> Option<Self::Item> {
1831 if self.row_start_index >= self.row_end_index {
1832 return None;
1833 }
1834
1835 let row_iter = self.grid.iter_row(self.row_end_index - 1);
1836 self.row_end_index -= 1;
1837 Some(row_iter)
1838 }
1839}
1840
1841impl<'a, T> Iterator for GridColIter<'a, T> {
1842 type Item = StepBy<Iter<'a, T>>;
1843
1844 fn next(&mut self) -> Option<Self::Item> {
1845 if self.col_start_index >= self.col_end_index {
1846 return None;
1847 }
1848
1849 let col_iter = self.grid.iter_col(self.col_start_index);
1850 self.col_start_index += 1;
1851 Some(col_iter)
1852 }
1853
1854 fn size_hint(&self) -> (usize, Option<usize>) {
1855 let size = self.col_end_index - self.col_start_index;
1856 (size, Some(size))
1857 }
1858}
1859
1860impl<'a, T> ExactSizeIterator for GridColIter<'a, T> {}
1861
1862impl<'a, T> DoubleEndedIterator for GridColIter<'a, T> {
1863 fn next_back(&mut self) -> Option<Self::Item> {
1864 if self.col_start_index >= self.col_end_index {
1865 return None;
1866 }
1867
1868 let col_iter = self.grid.iter_col(self.col_end_index - 1);
1869 self.col_end_index -= 1;
1870 Some(col_iter)
1871 }
1872}
1873
1874#[cfg(test)]
1875mod test {
1876 use super::*;
1877 #[cfg(not(feature = "std"))]
1878 use alloc::string::String;
1879
1880 fn test_grid<T>(grid: &Grid<T>, rows: usize, cols: usize, order: Order, data: &[T])
1881 where
1882 T: fmt::Debug + PartialEq,
1883 {
1884 assert_eq!(grid.rows, rows, "number of rows is unexpected");
1885 assert_eq!(grid.cols, cols, "number of cols is unexpected");
1886 assert_eq!(grid.order, order, "grid order is unexpected");
1887 assert_eq!(grid.data, data, "internal data is unexpected");
1888 }
1889
1890 #[test]
1891 fn from_1d_vec() {
1892 let grid: Grid<u8> = Grid::from((vec![1, 2, 3], 1));
1893 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
1894 }
1895
1896 #[test]
1897 #[should_panic]
1898 #[allow(clippy::should_panic_without_expect)]
1899 fn from_1d_vec_panic() {
1900 let _: Grid<u8> = Grid::from((vec![1, 2, 3], 2));
1901 }
1902
1903 #[test]
1904 fn from_1d_vec_reference() {
1905 let vec = vec![1, 2, 3];
1906 let grid: Grid<u8> = Grid::from((&vec, 1));
1907 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
1908 }
1909
1910 #[test]
1911 #[should_panic]
1912 #[allow(clippy::should_panic_without_expect)]
1913 fn from_1d_vec_reference_panic() {
1914 let vec = vec![1, 2, 3];
1915 let _: Grid<u8> = Grid::from((&vec, 2));
1916 }
1917
1918 #[test]
1919 fn from_1d_vec_reference_and_reference() {
1920 let vec = vec![1, 2, 3];
1921 let cols = 1;
1922 let grid: Grid<u8> = Grid::from((&vec, &cols));
1923 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
1924 }
1925
1926 #[test]
1927 #[should_panic]
1928 #[allow(clippy::should_panic_without_expect)]
1929 fn from_1d_vec_reference_and_reference_panic() {
1930 let vec = vec![1, 2, 3];
1931 let cols = 2;
1932 let _: Grid<u8> = Grid::from((&vec, &cols));
1933 }
1934
1935 #[test]
1936 fn from_2d_vec() {
1937 let grid: Grid<u8> = Grid::from(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]);
1938 test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
1939 }
1940
1941 #[test]
1942 #[should_panic]
1943 #[allow(clippy::should_panic_without_expect)]
1944 fn from_2d_vec_panic() {
1945 let _: Grid<u8> = Grid::from(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8]]);
1946 }
1947
1948 #[test]
1949 fn from_2d_vec_reference() {
1950 let vec = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
1951 let grid: Grid<u8> = Grid::from(&vec);
1952 test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
1953 }
1954
1955 #[test]
1956 #[should_panic]
1957 #[allow(clippy::should_panic_without_expect)]
1958 fn from_2d_vec_reference_panic() {
1959 let vec = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8]];
1960 let _: Grid<u8> = Grid::from(&vec);
1961 }
1962
1963 #[test]
1964 fn from_2d_vec_reference_of_references() {
1965 let inner_vec1 = vec![1, 2, 3];
1966 let inner_vec2 = vec![4, 5, 6];
1967 let inner_vec3 = vec![7, 8, 9];
1968 let vec = vec![&inner_vec1, &inner_vec2, &inner_vec3];
1969 let grid: Grid<u8> = Grid::from(&vec);
1970 test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
1971 }
1972
1973 #[test]
1974 #[should_panic]
1975 #[allow(clippy::should_panic_without_expect)]
1976 fn from_2d_vec_reference_of_references_panic() {
1977 let inner_vec1 = vec![1, 2, 3];
1978 let inner_vec2 = vec![4, 5, 6];
1979 let inner_vec3 = vec![7, 8];
1980 let vec = vec![&inner_vec1, &inner_vec2, &inner_vec3];
1981 let _: Grid<u8> = Grid::from(&vec);
1982 }
1983
1984 #[test]
1985 fn from_vec_zero_with_cols() {
1986 let grid: Grid<u8> = Grid::from_vec(vec![], 1);
1987 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
1988 }
1989
1990 #[test]
1991 fn from_vec_zero() {
1992 let grid: Grid<u8> = Grid::from_vec(vec![], 0);
1993 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
1994 }
1995
1996 #[test]
1997 #[should_panic]
1998 #[allow(clippy::should_panic_without_expect)]
1999 fn from_vec_panics_1() {
2000 let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 0);
2001 }
2002
2003 #[test]
2004 #[should_panic]
2005 #[allow(clippy::should_panic_without_expect)]
2006 fn from_vec_panics_2() {
2007 let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 2);
2008 }
2009
2010 #[test]
2011 fn from_vec_uses_original_vec() {
2012 let capacity = 10_000_000;
2013 let vec = Vec::with_capacity(capacity);
2014 let grid: Grid<u8> = Grid::from_vec(vec, 0);
2015 assert!(grid.into_vec().capacity() >= capacity);
2016 }
2017
2018 #[test]
2019 fn from_vec_with_order_zero_with_cols() {
2020 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 1, Order::ColumnMajor);
2021 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2022 }
2023
2024 #[test]
2025 fn from_vec_with_order_zero() {
2026 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2027 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2028 }
2029
2030 #[test]
2031 #[should_panic]
2032 #[allow(clippy::should_panic_without_expect)]
2033 fn from_vec_with_order_panics_1() {
2034 let _: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 0, Order::ColumnMajor);
2035 }
2036
2037 #[test]
2038 #[should_panic]
2039 #[allow(clippy::should_panic_without_expect)]
2040 fn from_vec_with_order_panics_2() {
2041 let _: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 2, Order::ColumnMajor);
2042 }
2043
2044 #[test]
2045 fn from_vec_with_order_uses_original_vec() {
2046 let capacity = 10_000_000;
2047 let vec = Vec::with_capacity(capacity);
2048 let grid: Grid<u8> = Grid::from_vec_with_order(vec, 0, Order::ColumnMajor);
2049 assert!(grid.into_vec().capacity() >= capacity);
2050 }
2051
2052 #[test]
2053 fn insert_col_at_end() {
2054 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2055 grid.insert_col(2, vec![5, 6]);
2056 test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 5, 3, 4, 6]);
2057 }
2058
2059 #[test]
2060 #[should_panic]
2061 #[allow(clippy::should_panic_without_expect)]
2062 fn insert_col_out_of_idx() {
2063 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2064 grid.insert_col(3, vec![4, 5]);
2065 }
2066
2067 #[test]
2068 fn insert_col_empty() {
2069 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2070 grid.insert_col(0, vec![1, 2, 3]);
2071 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
2072 }
2073
2074 #[test]
2075 fn insert_col_at_end_column_major() {
2076 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2077 grid.insert_col(2, vec![5, 6]);
2078 test_grid(&grid, 2, 3, Order::ColumnMajor, &[1, 3, 2, 4, 5, 6]);
2079 }
2080
2081 #[test]
2082 #[should_panic]
2083 #[allow(clippy::should_panic_without_expect)]
2084 fn insert_col_out_of_idx_column_major() {
2085 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2086 grid.insert_col(3, vec![4, 5]);
2087 }
2088
2089 #[test]
2090 fn insert_col_empty_column_major() {
2091 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2092 grid.insert_col(0, vec![1, 2, 3]);
2093 test_grid(&grid, 3, 1, Order::ColumnMajor, &[1, 2, 3]);
2094 }
2095
2096 #[test]
2097 fn insert_row_at_end() {
2098 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2099 grid.insert_row(2, vec![5, 6]);
2100 test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
2101 }
2102
2103 #[test]
2104 fn insert_row_empty() {
2105 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2106 grid.insert_row(0, vec![1, 2, 3]);
2107 test_grid(&grid, 1, 3, Order::RowMajor, &[1, 2, 3]);
2108 }
2109
2110 #[test]
2111 #[should_panic]
2112 #[allow(clippy::should_panic_without_expect)]
2113 fn insert_row_out_of_idx() {
2114 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2115 grid.insert_row(3, vec![4, 5]);
2116 }
2117
2118 #[test]
2119 #[should_panic]
2120 #[allow(clippy::should_panic_without_expect)]
2121 fn insert_row_wrong_size_of_idx() {
2122 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2123 grid.insert_row(1, vec![4, 5, 4]);
2124 }
2125
2126 #[test]
2127 fn insert_row_start() {
2128 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2129 grid.insert_row(1, vec![5, 6]);
2130 test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 5, 6, 3, 4]);
2131 }
2132
2133 #[test]
2134 fn insert_row_at_end_column_major() {
2135 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2136 grid.insert_row(2, vec![5, 6]);
2137 test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 3, 5, 2, 4, 6]);
2138 }
2139
2140 #[test]
2141 fn insert_row_empty_column_major() {
2142 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2143 grid.insert_row(0, vec![1, 2, 3]);
2144 test_grid(&grid, 1, 3, Order::ColumnMajor, &[1, 2, 3]);
2145 }
2146
2147 #[test]
2148 #[should_panic]
2149 #[allow(clippy::should_panic_without_expect)]
2150 fn insert_row_out_of_idx_column_major() {
2151 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::ColumnMajor);
2152 grid.insert_row(3, vec![4, 5]);
2153 }
2154
2155 #[test]
2156 #[should_panic]
2157 #[allow(clippy::should_panic_without_expect)]
2158 fn insert_row_wrong_size_of_idx_column_major() {
2159 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::ColumnMajor);
2160 grid.insert_row(1, vec![4, 5, 4]);
2161 }
2162
2163 #[test]
2164 fn insert_row_start_column_major() {
2165 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2166 grid.insert_row(1, vec![5, 6]);
2167 test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 5, 3, 2, 6, 4]);
2168 }
2169
2170 #[test]
2171 fn pop_col_1x3() {
2172 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 3, Order::RowMajor);
2173 assert_eq!(grid.pop_col(), Some(vec![3]));
2174 test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
2175 assert_eq!(grid.pop_col(), Some(vec![2]));
2176 test_grid(&grid, 1, 1, Order::RowMajor, &[1]);
2177 assert_eq!(grid.pop_col(), Some(vec![1]));
2178 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2179 assert_eq!(grid.pop_col(), None);
2180 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2181 }
2182
2183 #[test]
2184 fn pop_col_3x1() {
2185 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 1, Order::RowMajor);
2186 assert_eq!(grid.pop_col(), Some(vec![1, 2, 3]));
2187 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2188 assert_eq!(grid.pop_col(), None);
2189 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2190 }
2191
2192 #[test]
2193 fn pop_col_2x2() {
2194 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2195 assert_eq!(grid.pop_col(), Some(vec![2, 4]));
2196 assert_eq!(grid.size(), (2, 1));
2197 test_grid(&grid, 2, 1, Order::RowMajor, &[1, 3]);
2198 assert_eq!(grid.pop_col(), Some(vec![1, 3]));
2199 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2200 assert_eq!(grid.pop_col(), None);
2201 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2202 }
2203
2204 #[test]
2205 fn pop_col_3x4() {
2206 let internal = vec![1, 2, 3, 4, 11, 22, 33, 44, 111, 222, 333, 444];
2207 let mut grid: Grid<u16> = Grid::from_vec_with_order(internal, 4, Order::RowMajor);
2208 assert_eq!(grid.pop_col(), Some(vec![4, 44, 444]));
2209 let expected = [1, 2, 3, 11, 22, 33, 111, 222, 333];
2210 test_grid(&grid, 3, 3, Order::RowMajor, &expected);
2211 assert_eq!(grid.pop_col(), Some(vec![3, 33, 333]));
2212 test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 11, 22, 111, 222]);
2213 assert_eq!(grid.pop_col(), Some(vec![2, 22, 222]));
2214 test_grid(&grid, 3, 1, Order::RowMajor, &[1, 11, 111]);
2215 assert_eq!(grid.pop_col(), Some(vec![1, 11, 111]));
2216 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2217 assert_eq!(grid.pop_col(), None);
2218 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2219 }
2220
2221 #[test]
2222 fn pop_col_empty() {
2223 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2224 assert_eq!(grid.pop_col(), None);
2225 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2226 }
2227
2228 #[test]
2229 fn pop_col_1x3_column_major() {
2230 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 3, Order::ColumnMajor);
2231 assert_eq!(grid.pop_col(), Some(vec![3]));
2232 test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
2233 assert_eq!(grid.pop_col(), Some(vec![2]));
2234 test_grid(&grid, 1, 1, Order::ColumnMajor, &[1]);
2235 assert_eq!(grid.pop_col(), Some(vec![1]));
2236 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2237 assert_eq!(grid.pop_col(), None);
2238 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2239 }
2240
2241 #[test]
2242 fn pop_col_3x1_column_major() {
2243 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 1, Order::ColumnMajor);
2244 assert_eq!(grid.pop_col(), Some(vec![1, 2, 3]));
2245 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2246 assert_eq!(grid.pop_col(), None);
2247 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2248 }
2249
2250 #[test]
2251 fn pop_col_2x2_column_major() {
2252 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2253 assert_eq!(grid.pop_col(), Some(vec![2, 4]));
2254 assert_eq!(grid.size(), (2, 1));
2255 test_grid(&grid, 2, 1, Order::ColumnMajor, &[1, 3]);
2256 assert_eq!(grid.pop_col(), Some(vec![1, 3]));
2257 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2258 assert_eq!(grid.pop_col(), None);
2259 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2260 }
2261
2262 #[test]
2263 fn pop_col_3x4_column_major() {
2264 let internal = vec![1, 11, 111, 2, 22, 222, 3, 33, 333, 4, 44, 444];
2265 let mut grid: Grid<u16> = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
2266 assert_eq!(grid.pop_col(), Some(vec![4, 44, 444]));
2267 let expected = [1, 11, 111, 2, 22, 222, 3, 33, 333];
2268 test_grid(&grid, 3, 3, Order::ColumnMajor, &expected);
2269 assert_eq!(grid.pop_col(), Some(vec![3, 33, 333]));
2270 test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 11, 111, 2, 22, 222]);
2271 assert_eq!(grid.pop_col(), Some(vec![2, 22, 222]));
2272 test_grid(&grid, 3, 1, Order::ColumnMajor, &[1, 11, 111]);
2273 assert_eq!(grid.pop_col(), Some(vec![1, 11, 111]));
2274 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2275 assert_eq!(grid.pop_col(), None);
2276 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2277 }
2278
2279 #[test]
2280 fn pop_col_empty_column_major() {
2281 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2282 assert_eq!(grid.pop_col(), None);
2283 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2284 }
2285
2286 #[test]
2287 fn pop_row_2x2() {
2288 let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
2289 assert_eq!(grid.pop_row(), Some(vec![3, 4]));
2290 test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
2291 assert_eq!(grid.pop_row(), Some(vec![1, 2]));
2292 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2293 assert_eq!(grid.pop_row(), None);
2294 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2295 }
2296
2297 #[test]
2298 fn pop_row_empty() {
2299 let mut grid: Grid<u8> = Grid::from_vec(vec![], 0);
2300 assert_eq!(grid.pop_row(), None);
2301 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2302 }
2303
2304 #[test]
2305 fn pop_row_2x2_column_major() {
2306 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2307 assert_eq!(grid.pop_row(), Some(vec![3, 4]));
2308 test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
2309 assert_eq!(grid.pop_row(), Some(vec![1, 2]));
2310 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2311 assert_eq!(grid.pop_row(), None);
2312 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2313 }
2314
2315 #[test]
2316 fn pop_row_empty_column_major() {
2317 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2318 assert_eq!(grid.pop_row(), None);
2319 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2320 }
2321
2322 #[test]
2323 fn ne_full_empty() {
2324 let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2325 let g2: Grid<u8> = grid![];
2326 assert_ne!(g1, g2);
2327 }
2328
2329 #[test]
2330 fn ne() {
2331 let g1 = Grid::from_vec(vec![1, 2, 3, 5], 2);
2332 let g2 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2333 assert_ne!(g1, g2);
2334 }
2335
2336 #[test]
2337 fn ne_dif_rows() {
2338 let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2339 let g2 = Grid::from_vec(vec![1, 2, 3, 4], 1);
2340 assert_ne!(g1, g2);
2341 }
2342
2343 #[test]
2344 fn equal_empty() {
2345 let grid: Grid<char> = grid![];
2346 let grid2: Grid<char> = grid![];
2347 assert_eq!(grid, grid2);
2348 }
2349
2350 #[test]
2351 fn equal() {
2352 let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2353 let grid2: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2354 assert_eq!(grid, grid2);
2355 }
2356
2357 #[test]
2358 fn equal_different_order() {
2359 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2360 let grid2 = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2361 assert_eq!(grid, grid2);
2362 }
2363
2364 #[test]
2365 fn equal_partial_eq() {
2366 let grid = grid![[1.0]];
2367 let grid2 = Grid::from_vec(vec![1.0], 1);
2368 assert_eq!(grid, grid2);
2369 }
2370
2371 #[test]
2372 fn ne_partial_eq() {
2373 let grid = grid![[f64::NAN]];
2374 assert_ne!(grid, grid);
2375 }
2376
2377 #[test]
2378 #[should_panic]
2379 #[allow(clippy::should_panic_without_expect)]
2380 fn idx_tup_out_of_col_bounds() {
2381 let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2382 let _ = grid[(0, 5)];
2383 }
2384
2385 #[test]
2386 fn push_col_2x3() {
2387 let mut grid: Grid<u8> = grid![
2388 [0, 1, 2]
2389 [10, 11, 12]];
2390 grid.push_col(vec![3, 13]);
2391 test_grid(&grid, 2, 4, Order::RowMajor, &[0, 1, 2, 3, 10, 11, 12, 13]);
2392 }
2393
2394 #[test]
2395 fn push_col_3x4() {
2396 let mut grid: Grid<char> = grid![
2397 ['a', 'b', 'c', 'd']
2398 ['a', 'b', 'c', 'd']
2399 ['a', 'b', 'c', 'd']];
2400 grid.push_col(vec!['x', 'y', 'z']);
2401 let expected = [
2402 'a', 'b', 'c', 'd', 'x', 'a', 'b', 'c', 'd', 'y', 'a', 'b', 'c', 'd', 'z',
2403 ];
2404 test_grid(&grid, 3, 5, Order::RowMajor, &expected);
2405 }
2406
2407 #[test]
2408 fn push_col_1x3() {
2409 let mut grid: Grid<char> = grid![['a', 'b', 'c']];
2410 grid.push_col(vec!['d']);
2411 test_grid(&grid, 1, 4, Order::RowMajor, &['a', 'b', 'c', 'd']);
2412 }
2413
2414 #[test]
2415 fn push_col_empty() {
2416 let mut grid: Grid<char> = grid![];
2417 grid.push_col(vec!['b', 'b', 'b', 'b']);
2418 test_grid(&grid, 4, 1, Order::RowMajor, &['b', 'b', 'b', 'b']);
2419 }
2420
2421 #[test]
2422 #[should_panic]
2423 #[allow(clippy::should_panic_without_expect)]
2424 fn push_col_wrong_size() {
2425 let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
2426 grid.push_col(vec!['b']);
2427 grid.push_col(vec!['b', 'b']);
2428 }
2429
2430 #[test]
2431 #[should_panic]
2432 #[allow(clippy::should_panic_without_expect)]
2433 fn push_col_zero_len() {
2434 let mut grid: Grid<char> = grid![];
2435 grid.push_col(vec![]);
2436 }
2437
2438 #[test]
2439 fn push_col_2x3_column_major() {
2440 let internal = vec![0, 10, 1, 11, 2, 12];
2441 let mut grid: Grid<u8> = Grid::from_vec_with_order(internal, 3, Order::ColumnMajor);
2442 grid.push_col(vec![3, 13]);
2443 let expected = [0, 10, 1, 11, 2, 12, 3, 13];
2444 test_grid(&grid, 2, 4, Order::ColumnMajor, &expected);
2445 }
2446
2447 #[test]
2448 fn push_col_3x4_column_major() {
2449 let internal = vec!['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'];
2450 let mut grid: Grid<char> = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
2451 grid.push_col(vec!['x', 'y', 'z']);
2452 let expected = [
2453 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'x', 'y', 'z',
2454 ];
2455 test_grid(&grid, 3, 5, Order::ColumnMajor, &expected);
2456 }
2457
2458 #[test]
2459 fn push_col_1x3_column_major() {
2460 let mut grid: Grid<char> =
2461 Grid::from_vec_with_order(vec!['a', 'b', 'c'], 3, Order::ColumnMajor);
2462 grid.push_col(vec!['d']);
2463 test_grid(&grid, 1, 4, Order::ColumnMajor, &['a', 'b', 'c', 'd']);
2464 }
2465
2466 #[test]
2467 fn push_col_empty_column_major() {
2468 let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2469 grid.push_col(vec!['b', 'b', 'b', 'b']);
2470 test_grid(&grid, 4, 1, Order::ColumnMajor, &['b', 'b', 'b', 'b']);
2471 }
2472
2473 #[test]
2474 #[should_panic]
2475 #[allow(clippy::should_panic_without_expect)]
2476 fn push_col_wrong_size_column_major() {
2477 let mut grid: Grid<char> = Grid::init_with_order(2, 3, Order::ColumnMajor, 'a');
2478 grid.push_col(vec!['b']);
2479 grid.push_col(vec!['b', 'b']);
2480 }
2481
2482 #[test]
2483 #[should_panic]
2484 #[allow(clippy::should_panic_without_expect)]
2485 fn push_col_zero_len_column_major() {
2486 let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2487 grid.push_col(vec![]);
2488 }
2489
2490 #[test]
2491 fn push_row() {
2492 let mut grid: Grid<u8> = grid![[1, 2][3, 4]];
2493 grid.push_row(vec![5, 6]);
2494 test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
2495 }
2496
2497 #[test]
2498 fn push_row_empty() {
2499 let mut grid: Grid<char> = grid![];
2500 grid.push_row(vec!['b', 'b', 'b', 'b']);
2501 test_grid(&grid, 1, 4, Order::RowMajor, &['b', 'b', 'b', 'b']);
2502 }
2503
2504 #[test]
2505 #[should_panic]
2506 #[allow(clippy::should_panic_without_expect)]
2507 fn push_empty_row() {
2508 let mut grid = Grid::init(0, 1, 0);
2509 grid.push_row(vec![]);
2510 }
2511
2512 #[test]
2513 #[should_panic]
2514 #[allow(clippy::should_panic_without_expect)]
2515 fn push_row_wrong_size() {
2516 let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
2517 grid.push_row(vec!['b']);
2518 grid.push_row(vec!['b', 'b', 'b', 'b']);
2519 }
2520
2521 #[test]
2522 fn push_row_column_major() {
2523 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2524 grid.push_row(vec![5, 6]);
2525 test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 3, 5, 2, 4, 6]);
2526 }
2527
2528 #[test]
2529 fn push_row_empty_column_major() {
2530 let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2531 grid.push_row(vec!['b', 'b', 'b', 'b']);
2532 test_grid(&grid, 1, 4, Order::ColumnMajor, &['b', 'b', 'b', 'b']);
2533 }
2534
2535 #[test]
2536 #[should_panic]
2537 #[allow(clippy::should_panic_without_expect)]
2538 fn push_empty_row_column_major() {
2539 let mut grid = Grid::init_with_order(0, 1, Order::ColumnMajor, 0);
2540 grid.push_row(vec![]);
2541 }
2542
2543 #[test]
2544 #[should_panic]
2545 #[allow(clippy::should_panic_without_expect)]
2546 fn push_row_wrong_size_column_major() {
2547 let mut grid: Grid<char> =
2548 Grid::from_vec_with_order(vec!['a', 'a', 'a', 'a', 'a', 'a'], 3, Order::ColumnMajor);
2549 grid.push_row(vec!['b']);
2550 grid.push_row(vec!['b', 'b', 'b', 'b']);
2551 }
2552
2553 #[test]
2554 fn iter_row() {
2555 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2556 let row: Vec<_> = grid.iter_row(1).collect();
2557 assert_eq!(row, [&4, &5, &6]);
2558 }
2559
2560 #[test]
2561 #[should_panic]
2562 #[allow(clippy::should_panic_without_expect)]
2563 fn iter_row_out_of_bound() {
2564 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2565 let _ = grid.iter_row(3);
2566 }
2567
2568 #[test]
2569 #[should_panic]
2570 #[allow(clippy::should_panic_without_expect)]
2571 fn iter_row_zero() {
2572 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2573 let _ = grid.iter_row(0);
2574 }
2575
2576 #[test]
2577 fn iter_row_rowumn_major() {
2578 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2579 let row: Vec<_> = grid.iter_row(1).collect();
2580 assert_eq!(row, [&4, &5, &6]);
2581 }
2582
2583 #[test]
2584 #[should_panic]
2585 #[allow(clippy::should_panic_without_expect)]
2586 fn iter_row_rowumn_major_out_of_bound() {
2587 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2588 let _ = grid.iter_row(3);
2589 }
2590
2591 #[test]
2592 #[should_panic]
2593 #[allow(clippy::should_panic_without_expect)]
2594 fn iter_row_rowumn_major_zero() {
2595 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2596 let _ = grid.iter_row(0);
2597 }
2598
2599 #[test]
2600 fn iter_row_mut() {
2601 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2602 let row: Vec<_> = grid.iter_row_mut(1).collect();
2603 assert_eq!(row, [&mut 4, &mut 5, &mut 6]);
2604 }
2605
2606 #[test]
2607 #[should_panic]
2608 #[allow(clippy::should_panic_without_expect)]
2609 fn iter_row_mut_out_of_bound() {
2610 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2611 let _ = grid.iter_row_mut(3);
2612 }
2613
2614 #[test]
2615 #[should_panic]
2616 #[allow(clippy::should_panic_without_expect)]
2617 fn iter_row_mut_zero() {
2618 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2619 let _ = grid.iter_row_mut(0);
2620 }
2621
2622 #[test]
2623 fn iter_row_mut_rowumn_major() {
2624 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2625 let row: Vec<_> = grid.iter_row_mut(1).collect();
2626 assert_eq!(row, [&mut 4, &mut 5, &mut 6]);
2627 }
2628
2629 #[test]
2630 #[should_panic]
2631 #[allow(clippy::should_panic_without_expect)]
2632 fn iter_row_mut_rowumn_major_out_of_bound() {
2633 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2634 let _ = grid.iter_row_mut(3);
2635 }
2636
2637 #[test]
2638 #[should_panic]
2639 #[allow(clippy::should_panic_without_expect)]
2640 fn iter_row_mut_rowumn_major_zero() {
2641 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2642 let _ = grid.iter_row_mut(0);
2643 }
2644
2645 #[test]
2646 fn iter_col() {
2647 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2648 let col: Vec<_> = grid.iter_col(1).collect();
2649 assert_eq!(col, [&2, &5]);
2650 }
2651
2652 #[test]
2653 #[should_panic]
2654 #[allow(clippy::should_panic_without_expect)]
2655 fn iter_col_out_of_bound() {
2656 let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2657 let _ = grid.iter_col(3);
2658 }
2659
2660 #[test]
2661 #[should_panic]
2662 #[allow(clippy::should_panic_without_expect)]
2663 fn iter_col_zero() {
2664 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2665 let _ = grid.iter_col(0);
2666 }
2667
2668 #[test]
2669 fn iter_col_column_major() {
2670 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2671 let col: Vec<_> = grid.iter_col(1).collect();
2672 assert_eq!(col, [&2, &5]);
2673 }
2674
2675 #[test]
2676 #[should_panic]
2677 #[allow(clippy::should_panic_without_expect)]
2678 fn iter_col_column_major_out_of_bound() {
2679 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2680 let _ = grid.iter_col(3);
2681 }
2682
2683 #[test]
2684 #[should_panic]
2685 #[allow(clippy::should_panic_without_expect)]
2686 fn iter_col_column_major_zero() {
2687 let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2688 let _ = grid.iter_col(0);
2689 }
2690
2691 #[test]
2692 fn iter_col_mut() {
2693 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2694 let col: Vec<_> = grid.iter_col_mut(1).collect();
2695 assert_eq!(col, [&mut 2, &mut 5]);
2696 }
2697
2698 #[test]
2699 #[should_panic]
2700 #[allow(clippy::should_panic_without_expect)]
2701 fn iter_col_mut_out_of_bound() {
2702 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2703 let _ = grid.iter_col_mut(3);
2704 }
2705
2706 #[test]
2707 #[should_panic]
2708 #[allow(clippy::should_panic_without_expect)]
2709 fn iter_col_mut_zero() {
2710 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2711 let _ = grid.iter_col_mut(0);
2712 }
2713
2714 #[test]
2715 fn iter_col_mut_column_major() {
2716 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2717 let col: Vec<_> = grid.iter_col_mut(1).collect();
2718 assert_eq!(col, [&mut 2, &mut 5]);
2719 }
2720
2721 #[test]
2722 #[should_panic]
2723 #[allow(clippy::should_panic_without_expect)]
2724 fn iter_col_mut_column_major_out_of_bound() {
2725 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2726 let _ = grid.iter_col_mut(3);
2727 }
2728
2729 #[test]
2730 #[should_panic]
2731 #[allow(clippy::should_panic_without_expect)]
2732 fn iter_col_mut_column_major_zero() {
2733 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2734 let _ = grid.iter_col_mut(0);
2735 }
2736
2737 #[test]
2738 fn iter() {
2739 let grid: Grid<u8> = grid![[1,2][3,4]];
2740 let mut iter = grid.iter();
2741 assert_eq!(iter.next(), Some(&1));
2742 assert_eq!(iter.next(), Some(&2));
2743 assert_eq!(iter.next(), Some(&3));
2744 assert_eq!(iter.next(), Some(&4));
2745 assert_eq!(iter.next(), None);
2746 }
2747
2748 #[test]
2749 fn indexed_iter() {
2750 let grid: Grid<u8> = grid![[1,2][3,4]];
2751 let mut iter = grid.indexed_iter();
2752 assert_eq!(iter.next(), Some(((0, 0), &1)));
2753 assert_eq!(iter.next(), Some(((0, 1), &2)));
2754 assert_eq!(iter.next(), Some(((1, 0), &3)));
2755 assert_eq!(iter.next(), Some(((1, 1), &4)));
2756 assert_eq!(iter.next(), None);
2757 }
2758
2759 #[test]
2760 fn indexed_iter_empty() {
2761 let grid: Grid<u8> = Grid::new(0, 0);
2762 let mut iter = grid.indexed_iter();
2763 assert_eq!(iter.next(), None);
2764 }
2765
2766 #[test]
2767 fn indexed_iter_column_major() {
2768 let grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2769 let mut iter = grid.indexed_iter();
2770 assert_eq!(iter.next(), Some(((0, 0), &1)));
2771 assert_eq!(iter.next(), Some(((1, 0), &3)));
2772 assert_eq!(iter.next(), Some(((0, 1), &2)));
2773 assert_eq!(iter.next(), Some(((1, 1), &4)));
2774 assert_eq!(iter.next(), None);
2775 }
2776
2777 #[test]
2778 fn indexed_iter_empty_column_major() {
2779 let grid: Grid<u8> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2780 let mut iter = grid.indexed_iter();
2781 assert_eq!(iter.next(), None);
2782 }
2783
2784 #[test]
2785 fn indexed_iter_mut() {
2786 let mut grid: Grid<u8> = grid![[1,2][3,4]];
2787 let mut iter = grid.indexed_iter_mut();
2788 assert_eq!(iter.next(), Some(((0, 0), &mut 1)));
2789 assert_eq!(iter.next(), Some(((0, 1), &mut 2)));
2790 assert_eq!(iter.next(), Some(((1, 0), &mut 3)));
2791 assert_eq!(iter.next(), Some(((1, 1), &mut 4)));
2792 assert_eq!(iter.next(), None);
2793 }
2794
2795 #[test]
2796 fn indexed_iter_mut_empty() {
2797 let mut grid: Grid<u8> = Grid::new(0, 0);
2798 let mut iter = grid.indexed_iter_mut();
2799 assert_eq!(iter.next(), None);
2800 }
2801
2802 #[test]
2803 fn indexed_iter_mut_column_major() {
2804 let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2805 let mut iter = grid.indexed_iter_mut();
2806 assert_eq!(iter.next(), Some(((0, 0), &mut 1)));
2807 assert_eq!(iter.next(), Some(((1, 0), &mut 3)));
2808 assert_eq!(iter.next(), Some(((0, 1), &mut 2)));
2809 assert_eq!(iter.next(), Some(((1, 1), &mut 4)));
2810 assert_eq!(iter.next(), None);
2811 }
2812
2813 #[test]
2814 fn indexed_iter_mut_empty_column_major() {
2815 let mut grid: Grid<u8> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2816 let mut iter = grid.indexed_iter_mut();
2817 assert_eq!(iter.next(), None);
2818 }
2819
2820 #[test]
2821 fn clear() {
2822 let mut grid: Grid<u8> = grid![[1, 2, 3]];
2823 assert!(!grid.is_empty());
2824 grid.clear();
2825 assert!(grid.is_empty());
2826 }
2827
2828 #[test]
2829 fn is_empty_false() {
2830 let grid: Grid<u8> = grid![[1, 2, 3]];
2831 assert!(!grid.is_empty());
2832 }
2833
2834 #[test]
2835 fn is_empty() {
2836 let mut g: Grid<u8> = grid![[]];
2837 assert!(g.is_empty());
2838 g = grid![];
2839 assert!(g.is_empty());
2840 g = Grid::from_vec(vec![], 0);
2841 assert!(g.is_empty());
2842 g = Grid::new(0, 0);
2843 assert!(g.is_empty());
2844 g = Grid::new(0, 1);
2845 assert!(g.is_empty());
2846 g = Grid::new(1, 0);
2847 assert!(g.is_empty());
2848 g = Grid::init(0, 0, 10);
2849 assert!(g.is_empty());
2850 }
2851
2852 #[test]
2853 fn fmt_empty() {
2854 let grid: Grid<u8> = grid![];
2855 assert_eq!(format!("{grid:?}"), "[]");
2856 }
2857
2858 #[test]
2859 fn fmt_row() {
2860 let grid: Grid<u8> = grid![[1, 2, 3]];
2861 assert_eq!(format!("{grid:?}"), "[[1, 2, 3]]");
2862 }
2863
2864 #[test]
2865 fn fmt_grid() {
2866 let grid: Grid<u8> = grid![[1,2,3][4,5,6][7,8,9]];
2867 assert_eq!(format!("{grid:?}"), "[[1, 2, 3][4, 5, 6][7, 8, 9]]");
2868 }
2869
2870 #[test]
2871 fn fmt_column_major() {
2872 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2873 assert_eq!(format!("{grid:?}"), "[[1, 2, 3][4, 5, 6]]");
2874 }
2875
2876 #[test]
2877 fn fmt_pretty_empty() {
2878 let grid: Grid<f32> = grid![];
2879 assert_eq!(format!("{grid:#?}"), "[]");
2880 }
2881
2882 #[test]
2883 fn fmt_pretty_int() {
2884 let grid: Grid<u8> = grid![
2885 [1,2,3]
2886 [4,5,6]
2887 [7,8,95]
2888 ];
2889
2890 let expected_output = r"[
2891 [ 1, 2, 3]
2892 [ 4, 5, 6]
2893 [ 7, 8, 95]
2894]";
2895
2896 assert_eq!(format!("{grid:#?}"), expected_output);
2897
2898 let expected_output = r"[
2899 [ 1, 2, 3]
2900 [ 4, 5, 6]
2901 [ 7, 8, 95]
2902]";
2903
2904 assert_eq!(format!("{grid:#3?}"), expected_output);
2905 }
2906
2907 #[test]
2908 fn fmt_pretty_float() {
2909 let grid: Grid<f32> = grid![
2910 [1.5,2.6,3.44]
2911 [4.775,5.,6.]
2912 [7.1,8.23444,95.55]
2913 ];
2914
2915 let expected_output = r"[
2916 [ 1.5, 2.6, 3.4]
2917 [ 4.8, 5.0, 6.0]
2918 [ 7.1, 8.2, 95.6]
2919]";
2920
2921 assert_eq!(format!("{grid:#5.1?}"), expected_output);
2922
2923 let expected_output = r"[
2924 [ 1.50000, 2.60000, 3.44000]
2925 [ 4.77500, 5.00000, 6.00000]
2926 [ 7.10000, 8.23444, 95.55000]
2927]";
2928
2929 assert_eq!(format!("{grid:#8.5?}"), expected_output);
2930 }
2931
2932 #[test]
2933 fn fmt_pretty_tuple() {
2934 let grid: Grid<(i32, i32)> = grid![
2935 [(5,66), (432, 55)]
2936 [(80, 90), (5, 6)]
2937 ];
2938
2939 let expected_output = r"[
2940 [ ( 5, 66), ( 432, 55)]
2941 [ ( 80, 90), ( 5, 6)]
2942]";
2943
2944 assert_eq!(format!("{grid:#?}"), expected_output);
2945
2946 let expected_output = r"[
2947 [ ( 5, 66), (432, 55)]
2948 [ ( 80, 90), ( 5, 6)]
2949]";
2950
2951 assert_eq!(format!("{grid:#3?}"), expected_output);
2952 }
2953
2954 #[test]
2955 fn fmt_pretty_struct_derived() {
2956 #[derive(Debug)]
2957 struct Person {
2958 _name: String,
2959 _precise_age: f32,
2960 }
2961
2962 impl Person {
2963 fn new(name: &str, precise_age: f32) -> Self {
2964 Person {
2965 _name: name.into(),
2966 _precise_age: precise_age,
2967 }
2968 }
2969 }
2970
2971 let grid: Grid<Person> = grid![
2972 [Person::new("Vic", 24.5), Person::new("Mr. Very Long Name", 1955.)]
2973 [Person::new("Sam", 8.9995), Person::new("John Doe", 40.14)]
2974 ];
2975
2976 let expected_output = r#"[
2977 [ Person { _name: "Vic", _precise_age: 24.50000 }, Person { _name: "Mr. Very Long Name", _precise_age: 1955.00000 }]
2978 [ Person { _name: "Sam", _precise_age: 8.99950 }, Person { _name: "John Doe", _precise_age: 40.14000 }]
2979]"#;
2980
2981 assert_eq!(format!("{grid:#5.5?}"), expected_output);
2982 }
2983
2984 #[test]
2985 fn fmt_pretty_column_major() {
2986 let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2987 let expected_output = r"[
2988 [ 1, 2, 3]
2989 [ 4, 5, 6]
2990]";
2991 assert_eq!(format!("{grid:#?}"), expected_output);
2992 }
2993
2994 #[test]
2995 fn clone() {
2996 let grid = grid![[1, 2, 3][4, 5, 6]];
2997 let mut clone = grid.clone();
2998 clone[(0, 2)] = 10;
2999 test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
3000 test_grid(&clone, 2, 3, Order::RowMajor, &[1, 2, 10, 4, 5, 6]);
3001 }
3002
3003 #[cfg(feature = "std")]
3004 #[test]
3005 fn hash_std() {
3006 let mut set = std::collections::HashSet::new();
3007 set.insert(grid![[1,2,3][4,5,6]]);
3008 set.insert(grid![[1,3,3][4,5,6]]);
3009 set.insert(grid![[1,2,3][4,5,6]]);
3010 assert_eq!(set.len(), 2);
3011 }
3012
3013 #[test]
3014 fn macro_init() {
3015 let grid = grid![[1, 2, 3][4, 5, 6]];
3016 test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
3017 }
3018
3019 #[test]
3020 fn macro_init_2() {
3021 let grid = grid![[1, 2, 3]
3022 [4, 5, 6]
3023 [7, 8, 9]];
3024 test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
3025 }
3026
3027 #[test]
3028 fn macro_init_char() {
3029 let grid = grid![['a', 'b', 'c']
3030 ['a', 'b', 'c']
3031 ['a', 'b', 'c']];
3032 let expected = ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'];
3033 test_grid(&grid, 3, 3, Order::RowMajor, &expected);
3034 }
3035
3036 #[test]
3037 fn macro_one_row() {
3038 let grid: Grid<usize> = grid![[1, 2, 3, 4]];
3039 test_grid(&grid, 1, 4, Order::RowMajor, &[1, 2, 3, 4]);
3040 }
3041
3042 #[test]
3043 fn macro2_empty() {
3044 let grid: Grid<u8> = grid_cm![];
3045 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3046 }
3047
3048 #[test]
3049 fn macro2_init() {
3050 let grid = grid_cm![[1, 2, 3]
3051 [4, 5, 6]
3052 [7, 8, 9]];
3053 let expected = [1, 4, 7, 2, 5, 8, 3, 6, 9];
3054 test_grid(&grid, 3, 3, Order::ColumnMajor, &expected);
3055 }
3056
3057 #[test]
3058 fn macro2_init_char() {
3059 let grid = grid_cm![['a', 'b']['c', 'd']];
3060 test_grid(&grid, 2, 2, Order::ColumnMajor, &['a', 'c', 'b', 'd']);
3061 }
3062
3063 #[test]
3064 fn macro2_one_row() {
3065 let grid = grid_cm![[1, 2, 3, 4]];
3066 test_grid(&grid, 1, 4, Order::ColumnMajor, &[1, 2, 3, 4]);
3067 }
3068
3069 #[test]
3070 fn init() {
3071 let grid = Grid::init(1, 2, 3);
3072 test_grid(&grid, 1, 2, Order::RowMajor, &[3, 3]);
3073
3074 let grid = Grid::init(1, 2, 1.2);
3075 test_grid(&grid, 1, 2, Order::RowMajor, &[1.2, 1.2]);
3076
3077 let grid = Grid::init(1, 2, 'a');
3078 test_grid(&grid, 1, 2, Order::RowMajor, &['a', 'a']);
3079 }
3080
3081 #[test]
3082 #[should_panic]
3083 #[allow(clippy::should_panic_without_expect)]
3084 fn init_panics() {
3085 Grid::init(usize::MAX, 2, 3);
3086 }
3087
3088 #[test]
3089 fn init_empty() {
3090 let grid = Grid::init(0, 1, 0);
3091 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3092
3093 let grid = Grid::init(1, 0, -1);
3094 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3095 }
3096
3097 #[test]
3098 fn init_with_order() {
3099 let grid = Grid::init_with_order(1, 2, Order::RowMajor, 3);
3100 test_grid(&grid, 1, 2, Order::RowMajor, &[3, 3]);
3101
3102 let grid = Grid::init_with_order(1, 2, Order::ColumnMajor, 1.2);
3103 test_grid(&grid, 1, 2, Order::ColumnMajor, &[1.2, 1.2]);
3104
3105 let grid = Grid::init_with_order(1, 2, Order::ColumnMajor, 'a');
3106 test_grid(&grid, 1, 2, Order::ColumnMajor, &['a', 'a']);
3107 }
3108
3109 #[test]
3110 #[should_panic]
3111 #[allow(clippy::should_panic_without_expect)]
3112 fn init_with_order_panics() {
3113 Grid::init_with_order(usize::MAX, 2, Order::ColumnMajor, 3);
3114 }
3115
3116 #[test]
3117 fn init_with_order_empty() {
3118 let grid = Grid::init_with_order(0, 1, Order::ColumnMajor, 0);
3119 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3120
3121 let grid = Grid::init_with_order(1, 0, Order::RowMajor, -1);
3122 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3123 }
3124
3125 #[test]
3126 fn new() {
3127 let grid: Grid<u8> = Grid::new(1, 2);
3128 test_grid(&grid, 1, 2, Order::RowMajor, &[0, 0]);
3129 }
3130
3131 #[test]
3132 #[should_panic]
3133 #[allow(clippy::should_panic_without_expect)]
3134 fn new_panics() {
3135 let _: Grid<u8> = Grid::new(usize::MAX, 2);
3136 }
3137
3138 #[test]
3139 fn new_empty() {
3140 let grid: Grid<u8> = Grid::new(0, 1);
3141 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3142
3143 let grid: Grid<u8> = Grid::new(1, 0);
3144 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3145 }
3146
3147 #[test]
3148 fn new_with_order() {
3149 let grid: Grid<u8> = Grid::new_with_order(2, 2, Order::ColumnMajor);
3150 test_grid(&grid, 2, 2, Order::ColumnMajor, &[0, 0, 0, 0]);
3151 }
3152
3153 #[test]
3154 #[should_panic]
3155 #[allow(clippy::should_panic_without_expect)]
3156 fn new_with_order_panics() {
3157 let _: Grid<u8> = Grid::new_with_order(usize::MAX, 2, Order::ColumnMajor);
3158 }
3159
3160 #[test]
3161 fn new_with_order_empty() {
3162 let grid: Grid<u8> = Grid::new_with_order(0, 3, Order::RowMajor);
3163 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3164
3165 let grid: Grid<u8> = Grid::new_with_order(3, 0, Order::ColumnMajor);
3166 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3167 }
3168
3169 #[test]
3170 fn get() {
3171 let grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3172 assert_eq!(grid.get(0_i64, 1_i32), Some(&2));
3173 }
3174
3175 #[test]
3176 fn get_column_major() {
3177 let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3178 assert_eq!(grid.get(1, 0), Some(&2));
3179 }
3180
3181 #[test]
3182 fn get_none() {
3183 let grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3184 assert_eq!(grid.get(1, 0), None);
3185 }
3186
3187 #[test]
3188 fn get_none_column_major() {
3189 let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3190 assert_eq!(grid.get(0, 1), None);
3191 }
3192
3193 #[test]
3194 fn get_row() {
3195 let grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3196 assert_eq!(grid.get_row(0), Some([1, 2].as_slice()));
3197 }
3198
3199 #[test]
3200 fn get_row_column_major() {
3201 let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3202 assert_eq!(grid.get_row(0), None);
3203 }
3204
3205 #[test]
3206 fn get_row_none() {
3207 let grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3208 assert_eq!(grid.get_row(1), None);
3209 }
3210
3211 #[test]
3212 fn get_row_none_column_major() {
3213 let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3214 assert_eq!(grid.get_row(1), None);
3215 }
3216
3217 #[test]
3218 fn get_col() {
3219 let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3220 assert_eq!(grid.get_col(0), Some([1, 2].as_slice()));
3221 }
3222
3223 #[test]
3224 fn get_col_row_major() {
3225 let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::RowMajor);
3226 assert_eq!(grid.get_col(0), None);
3227 }
3228
3229 #[test]
3230 fn get_col_none() {
3231 let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3232 assert_eq!(grid.get_col(1), None);
3233 }
3234
3235 #[test]
3236 fn get_col_none_column_major() {
3237 let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::RowMajor);
3238 assert_eq!(grid.get_col(1), None);
3239 }
3240
3241 #[test]
3242 fn get_mut() {
3243 let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3244 assert_eq!(grid.get_mut(0_i64, 1_i32), Some(&mut 2));
3245 }
3246
3247 #[test]
3248 fn get_mut_column_major() {
3249 let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3250 assert_eq!(grid.get_mut(1, 0), Some(&mut 2));
3251 }
3252
3253 #[test]
3254 fn get_mut_none() {
3255 let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3256 assert_eq!(grid.get_mut(1, 0), None);
3257 }
3258
3259 #[test]
3260 fn get_mut_none_column_major() {
3261 let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3262 assert_eq!(grid.get_mut(0, 1), None);
3263 }
3264
3265 #[test]
3266 fn get_mut_col() {
3267 let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3268 assert_eq!(grid.get_mut_col(0), Some([1, 2].as_mut_slice()));
3269 }
3270
3271 #[test]
3272 fn get_mut_col_row_major() {
3273 let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::RowMajor);
3274 assert_eq!(grid.get_mut_col(0), None);
3275 }
3276
3277 #[test]
3278 fn get_mut_col_none() {
3279 let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3280 assert_eq!(grid.get_mut_col(1), None);
3281 }
3282
3283 #[test]
3284 fn get_mut_col_none_column_major() {
3285 let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::RowMajor);
3286 assert_eq!(grid.get_mut_col(1), None);
3287 }
3288
3289 #[test]
3290 fn get_mut_row() {
3291 let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3292 assert_eq!(grid.get_mut_row(0), Some([1, 2].as_mut_slice()));
3293 }
3294
3295 #[test]
3296 fn get_mut_row_column_major() {
3297 let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3298 assert_eq!(grid.get_mut_row(0), None);
3299 }
3300
3301 #[test]
3302 fn get_mut_row_none() {
3303 let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3304 assert_eq!(grid.get_mut_row(1), None);
3305 }
3306
3307 #[test]
3308 fn get_mut_row_none_column_major() {
3309 let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3310 assert_eq!(grid.get_mut_row(1), None);
3311 }
3312
3313 #[test]
3314 fn idx_tup() {
3315 let grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
3316 assert_eq!(grid[(0, 0)], 1);
3317 assert_eq!(grid[(0, 1)], 2);
3318 assert_eq!(grid[(1, 0)], 3);
3319 assert_eq!(grid[(1, 1)], 4);
3320 }
3321
3322 #[test]
3323 #[should_panic]
3324 #[allow(clippy::should_panic_without_expect)]
3325 fn idx_tup_panic_1() {
3326 let grid = Grid::init(1, 2, 3);
3327 let _ = grid[(20, 0)];
3328 }
3329
3330 #[test]
3331 #[should_panic]
3332 #[allow(clippy::should_panic_without_expect)]
3333 fn idx_tup_panic_2() {
3334 let grid = Grid::init(1, 2, 3);
3335 let _ = grid[(0, 20)];
3336 }
3337
3338 #[test]
3339 fn idx_tup_set() {
3340 let mut grid = Grid::init(1, 2, 3);
3341 grid[(0, 0)] = 4;
3342 assert_eq!(grid[(0, 0)], 4);
3343 }
3344
3345 #[test]
3346 fn size() {
3347 let grid = Grid::init(1, 2, 3);
3348 assert_eq!(grid.size(), (1, 2));
3349 }
3350
3351 #[test]
3352 fn transpose() {
3353 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3354 grid.transpose();
3355 assert_eq!(grid, grid![[1,4][2,5][3,6]]);
3356 }
3357
3358 #[test]
3359 fn fill() {
3360 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3361 grid.fill(7);
3362 test_grid(&grid, 2, 3, Order::RowMajor, &[7, 7, 7, 7, 7, 7]);
3363 }
3364
3365 #[test]
3366 fn fill_with() {
3367 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3368 grid.fill_with(Default::default);
3369 test_grid(&grid, 2, 3, Order::RowMajor, &[0, 0, 0, 0, 0, 0]);
3370 }
3371
3372 #[test]
3373 #[allow(clippy::redundant_closure_for_method_calls)]
3374 fn iter_rows() {
3375 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3376 let max_by_row: Vec<u8> = grid
3377 .iter_rows()
3378 .map(|row| row.max().unwrap())
3379 .copied()
3380 .collect();
3381 assert_eq!(max_by_row, vec![3, 6]);
3382
3383 let sum_by_row: Vec<u8> = grid.iter_rows().map(|row| row.sum()).collect();
3384 assert_eq!(sum_by_row, vec![1 + 2 + 3, 4 + 5 + 6]);
3385 }
3386
3387 #[test]
3388 #[allow(clippy::redundant_closure_for_method_calls)]
3389 fn iter_rows_rev() {
3390 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3391 let max_by_row: Vec<u8> = grid
3392 .iter_rows()
3393 .rev()
3394 .map(|row| row.max().unwrap())
3395 .copied()
3396 .collect();
3397 assert_eq!(max_by_row, vec![6, 3]);
3398
3399 let sum_by_row: Vec<u8> = grid.iter_rows().rev().map(|row| row.sum()).collect();
3400 assert_eq!(sum_by_row, vec![4 + 5 + 6, 1 + 2 + 3]);
3401 }
3402
3403 #[test]
3404 fn iter_rows_exact_size() {
3405 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3406 let mut row_iter = grid.iter_rows();
3407 assert_eq!(row_iter.len(), 2);
3408 assert!(row_iter.next().is_some());
3409 assert_eq!(row_iter.len(), 1);
3410 assert!(row_iter.next().is_some());
3411 assert_eq!(row_iter.len(), 0);
3412 assert!(row_iter.next().is_none());
3413 }
3414
3415 #[test]
3416 fn iter_rows_as_slices() {
3417 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3418 let mut row_iter = grid.iter_rows_as_slices().unwrap();
3419 assert_eq!(row_iter.next(), Some(&[1, 2, 3][..]));
3420 assert_eq!(row_iter.next(), Some(&[4, 5, 6][..]));
3421 assert_eq!(row_iter.next(), None);
3422 }
3423
3424 #[test]
3425 fn iter_rows_as_slices_rev() {
3426 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3427 let mut row_iter = grid.iter_rows_as_slices().unwrap().rev();
3428 assert_eq!(row_iter.next(), Some(&[4, 5, 6][..]));
3429 assert_eq!(row_iter.next(), Some(&[1, 2, 3][..]));
3430 assert_eq!(row_iter.next(), None);
3431 }
3432
3433 #[test]
3434 fn iter_rows_as_slices_exact_size() {
3435 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3436 let mut row_iter = grid.iter_rows_as_slices().unwrap();
3437 assert_eq!(row_iter.len(), 2);
3438 assert!(row_iter.next().is_some());
3439 assert_eq!(row_iter.len(), 1);
3440 assert!(row_iter.next().is_some());
3441 assert_eq!(row_iter.len(), 0);
3442 assert!(row_iter.next().is_none());
3443 }
3444
3445 #[test]
3446 fn iter_rows_as_slices_mut() {
3447 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3448 let mut row_iter = grid.iter_rows_as_slices_mut().unwrap();
3449 assert_eq!(row_iter.next(), Some(&mut [1, 2, 3][..]));
3450 assert_eq!(row_iter.next(), Some(&mut [4, 5, 6][..]));
3451 assert_eq!(row_iter.next(), None);
3452 }
3453
3454 #[test]
3455 fn iter_rows_as_slices_mut_rev() {
3456 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3457 let mut row_iter = grid.iter_rows_as_slices_mut().unwrap().rev();
3458 assert_eq!(row_iter.next(), Some(&mut [4, 5, 6][..]));
3459 assert_eq!(row_iter.next(), Some(&mut [1, 2, 3][..]));
3460 assert_eq!(row_iter.next(), None);
3461 }
3462
3463 #[test]
3464 fn iter_rows_as_slices_mut_exact_size() {
3465 let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3466 let mut row_iter = grid.iter_rows_as_slices_mut().unwrap();
3467 assert_eq!(row_iter.len(), 2);
3468 assert!(row_iter.next().is_some());
3469 assert_eq!(row_iter.len(), 1);
3470 assert!(row_iter.next().is_some());
3471 assert_eq!(row_iter.len(), 0);
3472 assert!(row_iter.next().is_none());
3473 }
3474
3475 #[test]
3476 #[allow(clippy::redundant_closure_for_method_calls)]
3477 fn iter_cols() {
3478 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3479 let max_by_col: Vec<u8> = grid
3480 .iter_cols()
3481 .map(|col| col.max().unwrap())
3482 .copied()
3483 .collect();
3484
3485 assert_eq!(max_by_col, vec![4, 5, 6]);
3486
3487 let sum_by_col: Vec<u8> = grid.iter_cols().map(|row| row.sum()).collect();
3488 assert_eq!(sum_by_col, vec![1 + 4, 2 + 5, 3 + 6]);
3489 }
3490
3491 #[test]
3492 #[allow(clippy::redundant_closure_for_method_calls)]
3493 fn iter_cols_rev() {
3494 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3495 let max_by_col: Vec<u8> = grid
3496 .iter_cols()
3497 .rev()
3498 .map(|col| col.max().unwrap())
3499 .copied()
3500 .collect();
3501
3502 assert_eq!(max_by_col, vec![6, 5, 4]);
3503
3504 let sum_by_col: Vec<u8> = grid.iter_cols().rev().map(|row| row.sum()).collect();
3505 assert_eq!(sum_by_col, vec![3 + 6, 2 + 5, 1 + 4]);
3506 }
3507
3508 #[test]
3509 fn iter_cols_exact_size() {
3510 let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3511 let mut col_iter = grid.iter_cols();
3512 assert_eq!(col_iter.len(), 3);
3513 assert!(col_iter.next().is_some());
3514 assert_eq!(col_iter.len(), 2);
3515 assert!(col_iter.next().is_some());
3516 assert_eq!(col_iter.len(), 1);
3517 assert!(col_iter.next().is_some());
3518 assert_eq!(col_iter.len(), 0);
3519 assert!(col_iter.next().is_none());
3520 }
3521
3522 #[test]
3523 fn iter_cols_as_slices() {
3524 let grid: Grid<u8> = grid_cm![[1,2,3][4,5,6]];
3525 let mut col_iter = grid.iter_cols_as_slices().unwrap();
3526 assert_eq!(col_iter.next(), Some(&[1, 4][..]));
3527 assert_eq!(col_iter.next(), Some(&[2, 5][..]));
3528 assert_eq!(col_iter.next(), Some(&[3, 6][..]));
3529 assert_eq!(col_iter.next(), None);
3530 }
3531
3532 #[test]
3533 fn iter_cols_as_slices_rev() {
3534 let grid: Grid<u8> = grid_cm![[1,2,3][4,5,6]];
3535 let mut col_iter = grid.iter_cols_as_slices().unwrap().rev();
3536 assert_eq!(col_iter.next(), Some(&[3, 6][..]));
3537 assert_eq!(col_iter.next(), Some(&[2, 5][..]));
3538 assert_eq!(col_iter.next(), Some(&[1, 4][..]));
3539 assert_eq!(col_iter.next(), None);
3540 }
3541
3542 #[test]
3543 fn iter_cols_as_slices_exact_size() {
3544 let grid: Grid<u8> = grid_cm![[1,2,3][4,5,6]];
3545 let mut col_iter = grid.iter_cols_as_slices().unwrap();
3546 assert_eq!(col_iter.len(), 3);
3547 assert!(col_iter.next().is_some());
3548 assert_eq!(col_iter.len(), 2);
3549 assert!(col_iter.next().is_some());
3550 assert_eq!(col_iter.len(), 1);
3551 assert!(col_iter.next().is_some());
3552 assert_eq!(col_iter.len(), 0);
3553 assert!(col_iter.next().is_none());
3554 }
3555
3556 #[test]
3557 fn iter_cols_as_slices_mut() {
3558 let mut grid: Grid<u8> = grid_cm![[1,2,3][4,5,6]];
3559 let mut col_iter = grid.iter_cols_as_slices_mut().unwrap();
3560 assert_eq!(col_iter.next(), Some(&mut [1, 4][..]));
3561 assert_eq!(col_iter.next(), Some(&mut [2, 5][..]));
3562 assert_eq!(col_iter.next(), Some(&mut [3, 6][..]));
3563 assert_eq!(col_iter.next(), None);
3564 }
3565
3566 #[test]
3567 fn iter_cols_as_slices_mut_rev() {
3568 let mut grid: Grid<u8> = grid_cm![[1,2,3][4,5,6]];
3569 let mut col_iter = grid.iter_cols_as_slices_mut().unwrap().rev();
3570 assert_eq!(col_iter.next(), Some(&mut [3, 6][..]));
3571 assert_eq!(col_iter.next(), Some(&mut [2, 5][..]));
3572 assert_eq!(col_iter.next(), Some(&mut [1, 4][..]));
3573 assert_eq!(col_iter.next(), None);
3574 }
3575
3576 #[test]
3577 fn iter_cols_as_slices_mut_exact_size() {
3578 let mut grid: Grid<u8> = grid_cm![[1,2,3][4,5,6]];
3579 let mut col_iter = grid.iter_cols_as_slices_mut().unwrap();
3580 assert_eq!(col_iter.len(), 3);
3581 assert!(col_iter.next().is_some());
3582 assert_eq!(col_iter.len(), 2);
3583 assert!(col_iter.next().is_some());
3584 assert_eq!(col_iter.len(), 1);
3585 assert!(col_iter.next().is_some());
3586 assert_eq!(col_iter.len(), 0);
3587 assert!(col_iter.next().is_none());
3588 }
3589
3590 #[test]
3591 fn remove_row() {
3592 let mut grid = grid![[1,2][3,4][5,6]];
3593 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
3594 test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 5, 6]);
3595 assert_eq![grid.remove_row(0), Some(vec![1, 2])];
3596 test_grid(&grid, 1, 2, Order::RowMajor, &[5, 6]);
3597 assert_eq![grid.remove_row(0), Some(vec![5, 6])];
3598 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3599 assert_eq![grid.remove_row(0), None];
3600 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3601 }
3602
3603 #[test]
3604 fn remove_row_out_of_bound() {
3605 let mut grid = grid![[1, 2][3, 4]];
3606 assert_eq![grid.remove_row(5), None];
3607 test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
3608 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
3609 test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
3610 }
3611
3612 #[test]
3613 fn remove_row_column_major() {
3614 let mut grid = Grid::from_vec_with_order(vec![1, 3, 5, 2, 4, 6], 2, Order::ColumnMajor);
3615 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
3616 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 5, 2, 6]);
3617 assert_eq![grid.remove_row(0), Some(vec![1, 2])];
3618 test_grid(&grid, 1, 2, Order::ColumnMajor, &[5, 6]);
3619 assert_eq![grid.remove_row(0), Some(vec![5, 6])];
3620 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3621 assert_eq![grid.remove_row(0), None];
3622 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3623 }
3624
3625 #[test]
3626 fn remove_row_out_of_bound_column_major() {
3627 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3628 assert_eq![grid.remove_row(5), None];
3629 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
3630 assert_eq![grid.remove_row(1), Some(vec![3, 4])];
3631 test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
3632 }
3633
3634 #[test]
3635 fn remove_col() {
3636 let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
3637 assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])];
3638 let expected = [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15];
3639 test_grid(&grid, 4, 3, Order::RowMajor, &expected);
3640 assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])];
3641 test_grid(&grid, 4, 2, Order::RowMajor, &[2, 3, 6, 7, 10, 11, 14, 15]);
3642 assert_eq![grid.remove_col(1), Some(vec![3, 7, 11, 15])];
3643 test_grid(&grid, 4, 1, Order::RowMajor, &[2, 6, 10, 14]);
3644 assert_eq![grid.remove_col(0), Some(vec![2, 6, 10, 14])];
3645 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3646 assert_eq![grid.remove_col(0), None];
3647 test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3648 }
3649
3650 #[test]
3651 fn remove_col_out_of_bound() {
3652 let mut grid = grid![[1, 2][3, 4]];
3653 assert_eq!(grid.remove_col(5), None);
3654 test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
3655 assert_eq!(grid.remove_col(1), Some(vec![2, 4]));
3656 test_grid(&grid, 2, 1, Order::RowMajor, &[1, 3]);
3657 }
3658
3659 #[test]
3660 fn remove_col_column_major() {
3661 let internal = vec![1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16];
3662 let mut grid = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
3663 assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])];
3664 let expected = [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15];
3665 test_grid(&grid, 4, 3, Order::ColumnMajor, &expected);
3666 assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])];
3667 let expected = [2, 6, 10, 14, 3, 7, 11, 15];
3668 test_grid(&grid, 4, 2, Order::ColumnMajor, &expected);
3669 assert_eq![grid.remove_col(1), Some(vec![3, 7, 11, 15])];
3670 test_grid(&grid, 4, 1, Order::ColumnMajor, &[2, 6, 10, 14]);
3671 assert_eq![grid.remove_col(0), Some(vec![2, 6, 10, 14])];
3672 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3673 assert_eq![grid.remove_col(0), None];
3674 test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3675 }
3676
3677 #[test]
3678 fn remove_col_out_of_bound_column_major() {
3679 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3680 assert_eq!(grid.remove_col(5), None);
3681 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
3682 assert_eq!(grid.remove_col(1), Some(vec![2, 4]));
3683 test_grid(&grid, 2, 1, Order::ColumnMajor, &[1, 3]);
3684 }
3685
3686 #[test]
3687 fn flip_cols() {
3688 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
3689 grid.flip_cols();
3690 test_grid(&grid, 2, 2, Order::RowMajor, &[2, 1, 4, 3]);
3691 }
3692
3693 #[test]
3694 fn flip_cols_column_major() {
3695 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3696 grid.flip_cols();
3697 test_grid(&grid, 2, 2, Order::ColumnMajor, &[2, 4, 1, 3]);
3698 }
3699
3700 #[test]
3701 fn flip_rows() {
3702 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
3703 grid.flip_rows();
3704 test_grid(&grid, 2, 2, Order::RowMajor, &[3, 4, 1, 2]);
3705 }
3706
3707 #[test]
3708 fn flip_rows_column_major() {
3709 let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3710 grid.flip_rows();
3711 test_grid(&grid, 2, 2, Order::ColumnMajor, &[3, 1, 4, 2]);
3712 }
3713
3714 #[test]
3715 fn rotate_left() {
3716 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3717 grid.rotate_left();
3718 test_grid(&grid, 3, 2, Order::ColumnMajor, &[3, 2, 1, 6, 5, 4]);
3719 assert_eq!(grid, grid![[3,6][2,5][1,4]]);
3720 }
3721
3722 #[test]
3723 fn rotate_left_column_major() {
3724 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3725 grid.rotate_left();
3726 test_grid(&grid, 3, 2, Order::RowMajor, &[3, 6, 2, 5, 1, 4]);
3727 assert_eq!(grid, grid![[3,6][2,5][1,4]]);
3728 }
3729
3730 #[test]
3731 fn rotate_right() {
3732 let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3733 grid.rotate_right();
3734 test_grid(&grid, 3, 2, Order::ColumnMajor, &[4, 5, 6, 1, 2, 3]);
3735 assert_eq!(grid, grid![[4,1][5,2][6,3]]);
3736 }
3737
3738 #[test]
3739 fn rotate_right_column_major() {
3740 let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3741 grid.rotate_right();
3742 test_grid(&grid, 3, 2, Order::RowMajor, &[4, 1, 5, 2, 6, 3]);
3743 assert_eq!(grid, grid![[4,1][5,2][6,3]]);
3744 }
3745
3746 #[test]
3747 fn iter_cols_clone() {
3748 let grid = grid![[1,2,3][4,5,6]];
3749 let mut cols = grid.iter_cols().skip(1);
3750 let c3: u8 = cols.clone().nth(1).unwrap().sum();
3751 let c2: u8 = cols.next().unwrap().sum();
3752 assert_eq!(c2, 2 + 5);
3753 assert_eq!(c3, 3 + 6);
3754 }
3755
3756 #[test]
3757 fn iter_rows_clone() {
3758 let grid = grid![[1,2,3][4,5,6][7,8,9]];
3759 let mut rows = grid.iter_rows().skip(1);
3760 let r3: u8 = rows.clone().nth(1).unwrap().sum();
3761 let r2: u8 = rows.next().unwrap().sum();
3762 assert_eq!(r2, 4 + 5 + 6);
3763 assert_eq!(r3, 7 + 8 + 9);
3764 }
3765
3766 #[test]
3767 fn swap() {
3768 let mut grid = grid![[1,2][4,5]];
3769 grid.swap((0, 0), (1, 0));
3770 let end_grid = grid![[4,2][1,5]];
3771 assert_eq!(grid, end_grid);
3772 }
3773
3774 #[test]
3775 #[should_panic(expected = "grid index out of bounds: (2,0) out of (2,2)")]
3776 fn swap_out_of_bounds() {
3777 let mut grid = grid![[1,2][4,5]];
3778 grid.swap((0, 0), (2, 0));
3779 }
3780
3781 #[cfg(feature = "serde")]
3782 mod serde_tests {
3783 use super::*;
3784
3785 #[test]
3786 fn serialize() {
3787 let grid: Grid<u8> = grid![[1, 2][3, 4]];
3788 let s = serde_json::to_string(&grid).unwrap();
3789 assert_eq!(s, r#"{"cols":2,"data":[1,2,3,4],"order":"RowMajor"}"#);
3790 }
3791
3792 #[test]
3793 fn deserialize() {
3794 let s = "{ \"cols\": 2, \"data\": [1, 2, 3, 4] }";
3795 let grid: Grid<u8> = serde_json::from_str(&s).unwrap();
3796 assert_eq!(grid, grid![[1, 2][3, 4]]);
3797 }
3798
3799 #[test]
3800 fn deserialize_with_order() {
3801 let s = "{ \"cols\": 2, \"data\": [1, 3, 2, 4], \"order\": \"ColumnMajor\" }";
3802 let grid: Grid<u8> = serde_json::from_str(&s).unwrap();
3803 test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
3804 }
3805 }
3806}