grid_arcium_fork/
lib.rs

1#![warn(clippy::all, clippy::pedantic)]
2/*!
3# Two Dimensional Grid
4Continuous growable 2D data structure.
5The purpose of this crate is to provide an universal data structure that is faster,
6uses less memory, and is easier to use than a naive `Vec<Vec<T>>` solution.
7
8This crate will always provide a 2D data structure. If you need three or more dimensions take a look at the
9[ndarray](https://docs.rs/ndarray/0.13.0/ndarray/) library. The `grid` crate is a container for all kind of data.
10If you need to perform matrix operations, you are better off with a linear algebra lib, such as
11[cgmath](https://docs.rs/cgmath/0.17.0/cgmath/) or [nalgebra](https://docs.rs/nalgebra/0.21.0/nalgebra/).
12No other dependencies except for the std lib are used.
13Most of the functions `std::Vec<T>` offer are also implemented in `grid` and slightly modified for a 2D data object.
14
15# Memory layout
16
17Similar to *C-like* arrays, `grid` uses a flat 1D `Vec<T>` data structure to have a continuous
18memory data layout. See also [this](https://stackoverflow.com/questions/17259877/1d-or-2d-array-whats-faster)
19explanation of why you should probably use a one-dimensional array approach.
20
21Note that this crate uses a [*row-major*](https://eli.thegreenplace.net/2015/memory-layout-of-multi-dimensional-arrays) memory layout by default.
22
23If you need a specific memory layout, please seek the `*_with_order` constructors. You should also take note that some transformation methods
24change the internal memory layout, like [`transpose`](Grid::transpose).
25
26This choice is important, because operations on rows are faster with a row-major memory layout.
27Likewise, operations on columns are faster with column-major memory layout.
28
29# Examples
30```
31use grid::*;
32let mut grid = grid![[1,2,3]
33                     [4,5,6]];
34assert_eq!(grid, Grid::from_vec(vec![1,2,3,4,5,6],3));
35assert_eq!(grid.get(0, 2), Some(&3));
36assert_eq!(grid[(1, 1)], 5);
37assert_eq!(grid.size(), (2, 3));
38grid.push_row(vec![7,8,9]);
39assert_eq!(grid, grid![[1,2,3][4,5,6][7,8,9]])
40 ```
41*/
42
43#![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/// Init a grid with values.
72///
73/// Each array within `[]` represents a row starting from top to button.
74///
75/// # Examples
76///
77/// In this example a grid of numbers from 1 to 9 is created:
78///
79///  
80/// ```
81/// use grid::grid;
82/// let grid = grid![[1, 2, 3]
83/// [4, 5, 6]
84/// [7, 8, 9]];
85/// assert_eq!(grid.size(), (3, 3))
86/// ```
87///
88/// Note that each row must be of the same length. The following example will not compile:
89///  
90/// ``` ignore
91/// use grid::grid;
92/// let grid = grid![[1, 2, 3]
93/// [4, 5] // This does not work!
94/// [7, 8, 9]];
95/// ```
96#[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/// Init a column-major grid with values.
129///
130/// Each array within `[]` represents a row starting from top to button.
131///
132/// # Examples
133///
134/// In this example a grid of numbers from 1 to 9 is created:
135///
136/// ```
137/// use grid::grid_cm;
138/// let grid = grid_cm![[1, 2, 3]
139/// [4, 5, 6]
140/// [7, 8, 9]];
141/// assert_eq!(grid.size(), (3, 3));
142/// assert_eq!(grid[(1, 1)], 5);
143/// ```
144///
145/// Note that each row must be of the same length. The following example will not compile:
146///
147/// ``` ignore
148/// use grid::grid_cm;
149/// let grid = grid_cm![[1, 2, 3]
150/// [4, 5] // This does not work!
151/// [7, 8, 9]];
152/// ```
153#[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/// Define the internal memory layout of the grid.
187#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
188#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
189pub enum Order {
190    /// The data is ordered row by row.
191    #[default]
192    RowMajor,
193
194    /// The data is ordered column by column.
195    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
207/// Stores elements of a certain type in a 2D grid structure.
208///
209/// Uses a rust `Vec<T>` type to reference the grid data on the heap.
210/// Also the internal memory layout as well as the number of
211/// rows and columns are stored in the grid data structure.
212///
213/// The size limit of a grid is `rows * cols < usize`.
214pub 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        // 3 is the number of fields in the struct.
309        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    /// Init a grid of size rows x columns with default values of the given type.
319    /// For example this will generate a 2x3 grid of zeros:
320    ///
321    /// ```
322    /// use grid::Grid;
323    /// let grid: Grid<u8> = Grid::new(2, 3);
324    /// assert_eq!(grid[(0, 0)], 0);
325    /// ```
326    ///
327    /// If `rows == 0` or `cols == 0` the grid will be empty with no cols and rows.
328    ///
329    /// This create a grid with a row-major memory layout.
330    /// If you need a column-major one, see [`new_with_order`](Grid::new_with_order).
331    ///
332    /// # Panics
333    ///
334    /// Panics if `rows * cols > usize::MAX`.
335    #[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    /// Same as [`new`](Self::new) but with a specific [`Order`].
345    ///
346    /// # Panics
347    ///
348    /// Panics if `rows * cols > usize::MAX`.
349    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    /// Init a grid of size rows x columns with the given data element.
372    ///
373    /// If `rows == 0` or `cols == 0` the grid will be empty with no cols and rows.
374    ///
375    /// This create a grid with a row-major memory layout.
376    /// If you need a column-major one, see [`init_with_order`](Grid::init_with_order).
377    ///
378    /// # Panics
379    ///
380    /// Panics if `rows * cols > usize::MAX`.
381    #[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    /// Same as [`init`](Self::init) but with a specific [`Order`].
390    ///
391    /// # Panics
392    ///
393    /// Panics if `rows * cols > usize::MAX`.
394    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    /// Returns a grid from a vector with a given column length.
415    /// The length of `vec` must be a multiple of `cols`.
416    ///
417    /// This create a grid with a row-major memory layout.
418    /// If you need a column-major one, see [`from_vec_with_order`](Grid::from_vec_with_order).
419    ///
420    /// For example:
421    ///
422    /// ```
423    /// use grid::Grid;
424    /// let grid = Grid::from_vec(vec![1, 2, 3, 4, 5, 6], 3);
425    /// assert_eq!(grid.size(), (2, 3));
426    /// ```
427    ///
428    /// will create a grid with the following layout:
429    /// \[1,2,3\]
430    /// \[4,5,6\]
431    ///
432    /// This example will fail, because `vec.len()` is not a multiple of `cols`:
433    ///
434    /// ``` should_panic
435    /// use grid::Grid;
436    /// Grid::from_vec(vec![1, 2, 3, 4, 5], 3);
437    /// ```
438    ///
439    /// # Panics
440    ///
441    /// This panics if the vector length isn't a multiple of the number of columns.
442    #[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    /// Same as [`from_vec`](Self::from_vec) but with a specific [`Order`].
449    ///
450    /// # Panics
451    ///
452    /// This panics if the vector length isn't a multiple of the number of columns.
453    #[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    /// Returns the index of the coordinates in the internal vector.
481    #[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    /// Returns a reference to an element, without performing bound checks.
491    /// Generally not recommended, use with caution!
492    ///
493    /// # Safety
494    ///
495    /// Calling this method with an out-of-bounds index is undefined behavior even
496    /// if the resulting reference is not used.
497    #[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    /// Returns a mutable reference to an element, without performing bound checks.
505    /// Generally not recommended, use with caution!
506    ///
507    /// # Safety
508    ///
509    /// Calling this method with an out-of-bounds index is undefined behavior even
510    /// if the resulting reference is not used.
511    #[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    /// Access a certain element in the grid.
523    /// Returns `None` if an element beyond the grid bounds is tried to be accessed.
524    #[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    /// Mutable access to a certain element in the grid.
536    /// Returns `None` if an element beyond the grid bounds is tried to be accessed.
537    #[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    /// Access a certain row on the grid.
553    /// Returns `None` if a row beyond the grid bounds is tried to be accessed,
554    /// or if the grid is column-major.
555    #[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    /// Mutable access to a certain row on the grid.
567    /// Returns `None` if a row beyond the grid bounds is tried to be accessed,
568    /// or if the grid is column-major.
569    #[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    /// Access a certain column on the grid.
581    /// Returns `None` if a column beyond the grid bounds is tried to be accessed,
582    /// or if the grid is row-major.
583    #[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    /// Mutable access to a certain column on the grid.
595    /// Returns `None` if a column beyond the grid bounds is tried to be accessed,
596    /// or if the grid is row-major.
597    #[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    /// Returns the size of the grid as a two element tuple.
609    /// First element are the number of rows and the second the columns.
610    #[must_use]
611    pub fn size(&self) -> (usize, usize) {
612        (self.rows, self.cols)
613    }
614
615    /// Returns the number of rows of the grid.
616    #[must_use]
617    pub fn rows(&self) -> usize {
618        self.rows
619    }
620
621    /// Returns the number of columns of the grid.
622    #[must_use]
623    pub fn cols(&self) -> usize {
624        self.cols
625    }
626
627    /// Returns the internal memory layout of the grid.
628    #[must_use]
629    pub fn order(&self) -> Order {
630        self.order
631    }
632
633    /// Returns `true` if the grid contains no elements.
634    /// For example:
635    /// ```
636    /// use grid::*;
637    /// let grid: Grid<u8> = grid![];
638    /// assert!(grid.is_empty());
639    /// ```
640    #[must_use]
641    pub fn is_empty(&self) -> bool {
642        self.data.is_empty()
643    }
644
645    /// Clears the grid.
646    ///
647    /// This doesn't change the grid order.
648    pub fn clear(&mut self) {
649        self.rows = 0;
650        self.cols = 0;
651        self.data.clear();
652    }
653
654    /// Returns an iterator over the whole grid, starting from the first row and column.
655    ///
656    /// The iteration order is dependant on the internal memory layout.
657    /// If you need a specific order, see [`iter_rows`](Grid::iter_rows) or
658    /// [`iter_cols`](Grid::iter_cols).
659    ///
660    /// ```
661    /// use grid::*;
662    /// let grid: Grid<u8> = grid![[1,2][3,4]];
663    /// let mut iter = grid.iter();
664    /// assert_eq!(iter.next(), Some(&1));
665    /// assert_eq!(iter.next(), Some(&2));
666    /// assert_eq!(iter.next(), Some(&3));
667    /// assert_eq!(iter.next(), Some(&4));
668    /// assert_eq!(iter.next(), None);
669    /// ```
670    pub fn iter(&self) -> Iter<T> {
671        self.data.iter()
672    }
673
674    /// Returns an mutable iterator over the whole grid that allows modifying each value.
675    ///
676    /// The iteration order is dependant on the internal memory layout.
677    ///
678    /// ```
679    /// use grid::*;
680    /// let mut grid: Grid<u8> = grid![[1,2][3,4]];
681    /// let mut iter = grid.iter_mut();
682    /// let next = iter.next();
683    /// assert_eq!(next, Some(&mut 1));
684    /// *next.unwrap() = 10;
685    /// ```
686    pub fn iter_mut(&mut self) -> IterMut<T> {
687        self.data.iter_mut()
688    }
689
690    /// Returns an iterator over a column.
691    ///
692    /// # Examples
693    ///
694    /// ```
695    /// use grid::*;
696    /// let grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
697    /// let mut col_iter = grid.iter_col(1);
698    /// assert_eq!(col_iter.next(), Some(&2));
699    /// assert_eq!(col_iter.next(), Some(&4));
700    /// assert_eq!(col_iter.next(), None);
701    /// ```
702    ///
703    /// # Performance
704    ///
705    /// This method will be significantly slower if the grid uses a row-major memory layout,
706    /// which is the default.
707    ///
708    /// # Panics
709    ///
710    /// Panics if the col index is out of bounds.
711    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    /// Returns a mutable iterator over a column.
728    ///
729    /// # Examples
730    ///
731    /// ```
732    /// use grid::*;
733    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
734    /// let mut col_iter = grid.iter_col_mut(1);
735    /// let next = col_iter.next();
736    /// assert_eq!(next, Some(&mut 2));
737    /// *next.unwrap() = 10;
738    /// assert_eq!(grid[(0, 1)], 10);
739    /// ```
740    ///
741    /// # Performance
742    ///
743    /// This method will be significantly slower if the grid uses a row-major memory layout,
744    /// which is the default.
745    ///
746    /// # Panics
747    ///
748    /// Panics if the col index is out of bounds.
749    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    /// Returns an iterator over a row.
766    ///
767    /// # Examples
768    ///
769    /// ```
770    /// use grid::*;
771    /// let grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
772    /// let mut col_iter = grid.iter_row(1);
773    /// assert_eq!(col_iter.next(), Some(&3));
774    /// assert_eq!(col_iter.next(), Some(&4));
775    /// assert_eq!(col_iter.next(), Some(&5));
776    /// assert_eq!(col_iter.next(), None);
777    /// ```
778    ///
779    /// # Performance
780    ///
781    /// This method will be significantly slower if the grid uses a column-major memory layout.
782    ///
783    /// # Panics
784    ///
785    /// Panics if the row index is out of bounds.
786    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    /// Returns a mutable iterator over a row.
803    ///
804    /// # Examples
805    ///
806    /// ```
807    /// use grid::*;
808    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
809    /// let mut col_iter = grid.iter_row_mut(1);
810    /// let next = col_iter.next();
811    /// *next.unwrap() = 10;
812    /// assert_eq!(grid[(1, 0)], 10);
813    /// ```
814    ///
815    /// # Performance
816    ///
817    /// This method will be significantly slower if the grid uses a column-major memory layout.
818    ///
819    /// # Panics
820    ///
821    /// Panics if the row index is out of bounds.
822    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    /// Traverse the grid with row and column indexes.
839    ///
840    /// The iteration order is dependent on the internal memory layout,
841    /// but the indexes will be accurate either way.
842    ///
843    /// # Examples
844    ///
845    /// ```
846    /// use grid::*;
847    /// let grid: Grid<u8> = grid![[1,2][3,4]];
848    /// let mut iter = grid.indexed_iter();
849    /// assert_eq!(iter.next(), Some(((0, 0), &1)));
850    /// ```
851    ///
852    /// Or simply unpack in a `for` loop:
853    ///
854    /// ```
855    /// use grid::*;
856    /// let grid: Grid<u8> = grid![[1,2][3,4]];
857    /// for ((row, col), i) in grid.indexed_iter() {
858    ///     println!("value at row {row} and column {col} is: {i}");
859    /// }
860    /// ```
861    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    /// Traverse the grid with row and column indexes,
872    /// and mutable access to each element.
873    ///
874    /// The iteration order is dependent on the internal memory layout,
875    /// but the indexes will be accurate either way.
876    ///
877    /// # Examples
878    ///
879    /// ```
880    /// use grid::*;
881    /// let mut grid: Grid<u8> = grid![[1,2][3,4]];
882    /// let mut iter = grid.indexed_iter_mut();
883    /// assert_eq!(iter.next(), Some(((0, 0), &mut 1)));
884    /// ```
885    ///
886    /// Or simply unpack in a `for` loop:
887    ///
888    /// ```
889    /// use grid::*;
890    /// let mut grid: Grid<u8> = grid![[1,2][3,4]];
891    /// for ((row, col), i) in grid.indexed_iter_mut() {
892    ///     *i += 1;
893    ///     println!("value at row {row} and column {col} is: {i}");
894    /// }
895    ///
896    /// assert_eq!(grid[(0, 0)], 2);
897    /// assert_eq!(grid[(0, 1)], 3);
898    /// assert_eq!(grid[(1, 0)], 4);
899    /// assert_eq!(grid[(1, 1)], 5);
900    /// ```
901    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    /// Add a new row to the grid.
916    ///
917    /// # Examples
918    ///
919    /// ```
920    /// use grid::*;
921    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
922    /// let row = vec![6,7,8];
923    /// grid.push_row(row);
924    /// assert_eq!(grid.rows(), 3);
925    /// assert_eq!(grid[(2, 0)], 6);
926    /// assert_eq!(grid[(2, 1)], 7);
927    /// assert_eq!(grid[(2, 2)], 8);
928    /// ```
929    ///
930    /// Can also be used to init an empty grid:
931    ///
932    /// ```
933    /// use grid::*;
934    /// let mut grid: Grid<u8> = grid![];
935    /// let row = vec![1, 2, 3];
936    /// grid.push_row(row);
937    /// assert_eq!(grid.size(), (1, 3));
938    /// ```
939    ///
940    /// # Performance
941    ///
942    /// This method will be significantly slower if the grid uses a column-major memory layout.
943    ///
944    /// # Panics
945    ///
946    /// Panics if:
947    ///  - the grid is not empty and `row.len() != grid.cols()`
948    ///  - `row.len() == 0`
949    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    /// Add a new column to the grid.
971    ///
972    /// # Examples
973    ///
974    /// ```
975    /// use grid::*;
976    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
977    /// let col = vec![4,6];
978    /// grid.push_col(col);
979    /// assert_eq!(grid.cols(), 4);
980    /// assert_eq!(grid[(0, 3)], 4);
981    /// assert_eq!(grid[(1, 3)], 6);
982    /// ```
983    ///
984    /// Can also be used to init an empty grid:
985    ///
986    /// ```
987    /// use grid::*;
988    /// let mut grid: Grid<u8> = grid![];
989    /// let col = vec![1, 2, 3];
990    /// grid.push_col(col);
991    /// assert_eq!(grid.size(), (3, 1));
992    /// ```
993    ///
994    /// # Performance
995    ///
996    /// This method will be significantly slower if the grid uses a row-major memory layout,
997    /// which is the default.
998    ///
999    /// # Panics
1000    ///
1001    /// Panics if:
1002    ///  - the grid is not empty and `col.len() != grid.rows()`
1003    ///  - `col.len() == 0`
1004    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    /// Removes the last row from a grid and returns it, or None if it is empty.
1026    ///
1027    /// # Examples
1028    /// ```
1029    /// use grid::*;
1030    /// let mut grid = grid![[1,2,3][4,5,6]];
1031    /// assert_eq![grid.pop_row(), Some(vec![4,5,6])];
1032    /// assert_eq![grid.pop_row(), Some(vec![1,2,3])];
1033    /// assert_eq![grid.pop_row(), None];
1034    /// ```
1035    ///
1036    /// # Performance
1037    ///
1038    /// This method will be significantly slower if the grid uses a column-major memory layout.
1039    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    /// Remove a Row at the index and return a vector of it.
1058    ///
1059    /// # Examples
1060    /// ```
1061    /// use grid::*;
1062    /// let mut grid = grid![[1,2][3,4][5,6]];
1063    /// assert_eq![grid.remove_row(1), Some(vec![3,4])];   
1064    /// assert_eq![grid.remove_row(0), Some(vec![1,2])];
1065    /// assert_eq![grid.remove_row(0), Some(vec![5,6])];
1066    /// assert_eq![grid.remove_row(0), None];
1067    /// ```
1068    ///
1069    /// # Performance
1070    ///
1071    /// This method will be significantly slower if the grid uses a column-major memory layout.
1072    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    /// Removes the last column from a grid and returns it, or None if it is empty.
1098    ///
1099    /// Note that this operation is much slower than the `pop_row()` because the memory layout
1100    /// of `Grid` is row-major and removing a column requires a lot of move operations.
1101    ///
1102    /// # Examples
1103    /// ```
1104    /// use grid::*;
1105    /// let mut grid = grid![[1,2,3][4,5,6]];
1106    /// assert_eq![grid.pop_col(), Some(vec![3,6])];
1107    /// assert_eq![grid.pop_col(), Some(vec![2,5])];
1108    /// assert_eq![grid.pop_col(), Some(vec![1,4])];
1109    /// assert_eq![grid.pop_col(), None];
1110    /// ```
1111    ///
1112    /// # Performance
1113    ///
1114    /// This method will be significantly slower if the grid uses a row-major memory layout,
1115    /// which is the default.
1116    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    /// Remove a column at the index and return a vector of it.
1135    ///
1136    /// # Examples
1137    /// ```
1138    /// use grid::*;
1139    /// let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
1140    /// assert_eq![grid.remove_col(3), Some(vec![4,8,12,16])];
1141    /// assert_eq![grid.remove_col(0), Some(vec![1,5,9,13])];
1142    /// assert_eq![grid.remove_col(1), Some(vec![3,7,11,15])];
1143    /// assert_eq![grid.remove_col(0), Some(vec![2,6,10,14])];
1144    /// assert_eq![grid.remove_col(0), None];
1145    /// ```
1146    ///
1147    /// # Performance
1148    ///
1149    /// This method will be significantly slower if the grid uses a row-major memory layout,
1150    /// which is the default.
1151    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    /// Insert a new row at the index and shifts all rows after down.
1177    ///
1178    /// # Examples
1179    /// ```
1180    /// use grid::*;
1181    /// let mut grid = grid![[1,2,3][4,5,6]];
1182    /// grid.insert_row(1, vec![7,8,9]);
1183    /// assert_eq!(grid, grid![[1,2,3][7,8,9][4,5,6]]);
1184    /// ```
1185    ///
1186    /// # Performance
1187    ///
1188    /// This method will be significantly slower if the grid uses a column-major memory layout.
1189    ///
1190    /// # Panics
1191    ///
1192    /// Panics if:
1193    /// - the grid is not empty and `row.len() != grid.cols()`.
1194    /// - the index is greater than the number of rows
1195    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    /// Insert a new column at the index.
1226    ///
1227    /// Important! Insertion of columns is a lot slower than the lines insertion.
1228    /// This is because of the memory layout of the grid data structure.
1229    ///
1230    /// # Examples
1231    /// ```
1232    /// use grid::*;
1233    /// let mut grid = grid![[1,2,3][4,5,6]];
1234    /// grid.insert_col(1, vec![9,9]);
1235    /// assert_eq!(grid, grid![[1,9,2,3][4,9,5,6]])
1236    /// ```
1237    ///
1238    /// # Performance
1239    ///
1240    /// This method will be significantly slower if the grid uses a row-major memory layout,
1241    /// which is the default.
1242    ///
1243    /// # Panics
1244    ///
1245    /// Panics if:
1246    /// - the grid is not empty and `col.len() != grid.rows()`.
1247    /// - the index is greater than the number of columns
1248    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    /// Returns a reference to the internal data structure of the grid.
1279    ///
1280    /// The order of the elements depends on the internal memory layout, which is
1281    /// row-major by default.
1282    ///
1283    /// # Examples
1284    /// ```
1285    /// use grid::*;
1286    /// let grid = grid![[1,2,3][4,5,6]];
1287    /// let flat = grid.flatten();
1288    /// assert_eq!(flat, &vec![1,2,3,4,5,6]);
1289    /// ```
1290    #[must_use]
1291    pub fn flatten(&self) -> &Vec<T> {
1292        &self.data
1293    }
1294
1295    /// Converts self into a vector without clones or allocation.
1296    ///
1297    /// The order of the elements depends on the internal memory layout, which is
1298    /// row-major by default.
1299    #[must_use]
1300    pub fn into_vec(self) -> Vec<T> {
1301        self.data
1302    }
1303
1304    /// Transpose the grid so that columns become rows in new grid.
1305    ///
1306    /// This method changes the internal memory layout.
1307    pub fn transpose(&mut self) {
1308        self.order = self.order.counterpart();
1309        core::mem::swap(&mut self.rows, &mut self.cols);
1310    }
1311
1312    /// Flip (or mirrors) the columns.
1313    ///
1314    /// # Examples
1315    ///
1316    /// ```
1317    /// use grid::*;
1318    /// let mut grid = grid![[1,2,3][4,5,6]];
1319    /// grid.flip_cols();
1320    /// assert_eq!(grid, grid![[3,2,1][6,5,4]])
1321    /// ```
1322    ///
1323    /// # Performance
1324    ///
1325    /// This method will be significantly slower if the grid uses a column-major memory layout.
1326    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    /// Flip (or mirrors) the rows.
1347    ///
1348    /// # Examples
1349    ///
1350    /// ```
1351    /// use grid::*;
1352    /// let mut grid = grid![[1,2,3][4,5,6]];
1353    /// grid.flip_rows();
1354    /// assert_eq!(grid, grid![[4,5,6][1,2,3]])
1355    /// ```
1356    ///
1357    /// # Performance
1358    ///
1359    /// This method will be significantly slower if the grid uses a row-major memory layout,
1360    /// which is the default.
1361    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    /// Rotate the grid 90° counter-clockwise.
1382    ///
1383    /// This method changes the internal memory layout.
1384    ///
1385    /// # Examples
1386    ///
1387    /// ```
1388    /// use grid::*;
1389    /// let mut grid = grid![[1,2][3,4]];
1390    /// grid.rotate_left();
1391    /// assert_eq!(grid, grid![[2,4][1,3]]);
1392    /// ```
1393    ///
1394    /// # Performance
1395    ///
1396    /// This method will be significantly slower if the grid initialy uses a
1397    /// column-major memory layout, which is the default.
1398    pub fn rotate_left(&mut self) {
1399        self.transpose();
1400        self.flip_rows();
1401    }
1402
1403    /// Rotate the grid 90° clockwise.
1404    ///
1405    /// This method changes the internal memory layout.
1406    ///
1407    /// # Examples
1408    ///
1409    /// ```
1410    /// use grid::*;
1411    /// let mut grid = grid![[1,2][3,4]];
1412    /// grid.rotate_right();
1413    /// assert_eq!(grid, grid![[3,1][4,2]]);
1414    /// ```
1415    ///
1416    /// # Performance
1417    ///
1418    /// This method will be significantly slower if the grid initialy uses a
1419    /// row-major memory layout, which is the default.
1420    pub fn rotate_right(&mut self) {
1421        self.transpose();
1422        self.flip_cols();
1423    }
1424
1425    /// Rotate the grid 180°.
1426    ///
1427    /// This method **doesn't** change the internal memory layout.
1428    ///
1429    /// # Examples
1430    ///
1431    /// ```
1432    /// use grid::*;
1433    /// let mut grid = grid![[1,2,3][4,5,6]];
1434    /// grid.rotate_half();
1435    /// assert_eq!(grid, grid![[6,5,4][3,2,1]]);
1436    /// ```
1437    ///
1438    /// # Performance
1439    ///
1440    /// The performances of this method is not affected by the internal memory layout.
1441    pub fn rotate_half(&mut self) {
1442        self.data.reverse();
1443    }
1444
1445    /// Fills the grid with elements by cloning `value`.
1446    ///
1447    /// # Examples
1448    ///
1449    /// ```
1450    /// use grid::*;
1451    /// let mut grid = grid![[1,2,3][4,5,6]];
1452    /// grid.fill(7);
1453    /// assert_eq!(grid, grid![[7,7,7][7,7,7]]);
1454    /// ```
1455    pub fn fill(&mut self, value: T)
1456    where
1457        T: Clone,
1458    {
1459        self.data.fill(value);
1460    }
1461
1462    /// Fills the grid with elements returned by calling a closure repeatedly.
1463    ///
1464    /// This method uses a closure to create new values. If you'd rather
1465    /// [`Clone`] a given value, use [`fill`]. If you want to use the [`Default`]
1466    /// trait to generate values, you can pass [`Default::default`] as the
1467    /// argument.
1468    ///
1469    /// [`fill`]: Grid::fill
1470    ///
1471    /// # Examples
1472    ///
1473    /// ```
1474    /// use grid::*;
1475    /// let mut grid = grid![[1,2,3][4,5,6]];
1476    /// grid.fill_with(Default::default);
1477    /// assert_eq!(grid, grid![[0,0,0][0,0,0]]);
1478    /// ```
1479    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    /// Iterate over the rows of the grid. Each time an iterator over a single
1487    /// row is returned.
1488    ///
1489    /// An item in this iterator is equal to a call to `Grid.iter_row(row_index)`
1490    /// of the corresponding row.
1491    ///
1492    /// # Examples
1493    ///
1494    /// ```
1495    /// use grid::*;
1496    /// let mut grid = grid![[1,2,3][4,5,6]];
1497    /// let sum_by_row: Vec<u8> = grid.iter_rows().map(|row| row.sum()).collect();
1498    /// assert_eq!(sum_by_row, vec![1+2+3, 4+5+6])
1499    /// ```
1500    #[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    /// Iterate over the rows of the grid as slices. It only holds meaning if the grid
1510    /// is row-major.
1511    #[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    /// Iterate over the rows of the grid as slices. It only holds meaning if the grid
1521    /// is row-major.
1522    #[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    /// Iterate over the columns of the grid. Each time an iterator over a single
1532    /// column is returned.
1533    ///
1534    /// An item in this iterator is equal to a call to `Grid.iter_col(col_index)`
1535    /// of the corresponding column.
1536    ///
1537    /// # Examples
1538    ///
1539    /// ```
1540    /// use grid::*;
1541    /// let mut grid = grid![[1,2,3][4,5,6]];
1542    /// let sum_by_col: Vec<u8> = grid.iter_cols().map(|col| col.sum()).collect();
1543    /// assert_eq!(sum_by_col, vec![1+4, 2+5, 3+6])
1544    /// ```
1545    #[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    /// Iterate over the columns of the grid as slices. It only holds meaning if the
1555    /// grid is column-major.
1556    #[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    /// Iterate over the columns of the grid as slices. It only holds meaning if the
1566    /// grid is column-major.
1567    #[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    /// Swaps two elements in the Grid.
1577    /// Similar to `Vec::swap()`.
1578    ///
1579    /// # Panics
1580    ///
1581    /// Panics if either index is out of bounds.
1582    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                /*
1672                    WARNING
1673
1674                    Compound types becoming enormous as the entire `fmt::Debug` width is applied to each item individually.
1675                    For tuples and structs define padding and precision arguments manually to improve readability.
1676                */
1677                let width = f.width().unwrap_or_else(|| {
1678                    // Conditionally calculate the longest item by default.
1679                    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}