plane_2d/
grid.rs

1/*!
2# Two Dimensional Grid
3Continuous growable 2D data structure.
4The purpose of this crate is to provide an universal data structure that is faster,
5uses less memory, and is easier to use than a naive `Vec<Vec<T>>` solution.
6
7This crate will always provide a 2D data structure. If you need three or more dimensions take a look at the
8[ndarray](https://docs.rs/ndarray/0.13.0/ndarray/) library. The `grid` crate is a container for all kind of data.
9If you need to perform matrix operations, you are better off with a linear algebra lib, such as
10[cgmath](https://docs.rs/cgmath/0.17.0/cgmath/) or [nalgebra](https://docs.rs/nalgebra/0.21.0/nalgebra/).
11No other dependencies except for the std lib are used.
12Most of the functions `std::Vec<T>` offer are also implemented in `grid` and slightly modified for a 2D data object.
13
14# Memory layout
15
16Similar to *C-like* arrays, `grid` uses a flat 1D `Vec<T>` data structure to have a continuous
17memory data layout. See also [this](https://stackoverflow.com/questions/17259877/1d-or-2d-array-whats-faster)
18explanation of why you should probably use a one-dimensional array approach.
19
20Note that this crate uses a [*row-major*](https://eli.thegreenplace.net/2015/memory-layout-of-multi-dimensional-arrays) memory layout by default.
21
22If you need a specific memory layout, please seek the `*_with_order` constructors. You should also take note that some transformation methods
23change the internal memory layout, like [`transpose`](Grid::transpose).
24
25This choice is important, because operations on rows are faster with a row-major memory layout.
26Likewise, operations on columns are faster with column-major memory layout.
27
28# Examples
29```
30use plane_2d::grid::*;
31let mut grid = grid![[1,2,3]
32                     [4,5,6]];
33assert_eq!(grid, Grid::from_vec(vec![1,2,3,4,5,6],3));
34assert_eq!(grid.get(0, 2), Some(&3));
35assert_eq!(grid[(1, 1)], 5);
36assert_eq!(grid.size(), (2, 3));
37grid.push_row(vec![7,8,9]);
38assert_eq!(grid, grid![[1,2,3][4,5,6][7,8,9]])
39 ```
40*/
41
42#[cfg(feature = "serde")]
43use serde::{
44    de::{self, Deserialize, Deserializer, MapAccess, SeqAccess, Visitor},
45    ser::{Serialize, SerializeStruct, Serializer},
46};
47
48#[cfg(feature = "bevy_reflect")]
49use bevy_reflect::Reflect;
50
51
52use core::cmp::Eq;
53use core::fmt;
54use core::hash;
55use core::iter::StepBy;
56use core::ops::Index;
57use core::ops::IndexMut;
58use core::slice::Iter;
59use core::slice::IterMut;
60use core::{cmp, convert::TryInto};
61
62#[doc(hidden)]
63#[macro_export]
64macro_rules! count {
65    () => (0usize);
66    ( $x:tt $($xs:tt)* ) => (1usize + $crate::count!($($xs)*));
67}
68
69/// Init a grid with values.
70///
71/// Each array within `[]` represents a row starting from top to button.
72///
73/// # Examples
74///
75/// In this example a grid of numbers from 1 to 9 is created:
76///
77///  
78/// ```
79/// use plane_2d::grid::grid;
80/// let grid = grid![[1, 2, 3]
81/// [4, 5, 6]
82/// [7, 8, 9]];
83/// assert_eq!(grid.size(), (3, 3))
84/// ```
85///
86/// Note that each row must be of the same length. The following example will not compile:
87///  
88/// ``` ignore
89/// use plane_2d::grid::grid;
90/// let grid = grid![[1, 2, 3]
91/// [4, 5] // This does not work!
92/// [7, 8, 9]];
93/// ```
94#[macro_export]
95macro_rules! grid {
96    () => {
97        $crate::Grid::from_vec(vec![], 0)
98    };
99    ( [$( $x:expr ),* ]) => { {
100        let vec = vec![$($x),*];
101        let len  = vec.len();
102        $crate::Grid::from_vec(vec, len)
103    } };
104    ( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => {
105        {
106            let mut _assert_width0 = [(); $crate::count!($($x0)*)];
107            let cols = $crate::count!($($x0)*);
108            let rows = 1usize;
109
110            $(
111                let _assert_width = [(); $crate::count!($($x)*)];
112                _assert_width0 = _assert_width;
113                let rows = rows + 1usize;
114            )*
115
116            let mut vec = Vec::with_capacity(rows.checked_mul(cols).unwrap());
117
118            $( vec.push($x0); )*
119            $( $( vec.push($x); )* )*
120
121            $crate::grid::Grid::from_vec(vec, cols)
122        }
123    };
124}
125
126/// Init a column-major grid with values.
127///
128/// Each array within `[]` represents a row starting from top to button.
129///
130/// # Examples
131///
132/// In this example a grid of numbers from 1 to 9 is created:
133///
134/// ```
135/// use plane_2d::grid::grid_cm;
136/// let grid = grid_cm![[1, 2, 3]
137/// [4, 5, 6]
138/// [7, 8, 9]];
139/// assert_eq!(grid.size(), (3, 3));
140/// assert_eq!(grid[(1, 1)], 5);
141/// ```
142///
143/// Note that each row must be of the same length. The following example will not compile:
144///
145/// ``` ignore
146/// use plane_2d::grid::grid_cm;
147/// let grid = grid_cm![[1, 2, 3]
148/// [4, 5] // This does not work!
149/// [7, 8, 9]];
150/// ```
151#[macro_export]
152macro_rules! grid_cm {
153    () => {
154        $crate::grid::Grid::from_vec_with_order(vec![], 0, $crate::grid::Order::ColumnMajor)
155    };
156    ( [$( $x:expr ),* ]) => { {
157        let vec = vec![$($x),*];
158        let len  = vec.len();
159        $crate::Grid::from_vec_with_order(vec, len, $crate::grid::Order::ColumnMajor)
160    } };
161    ( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => {
162        {
163            let mut _assert_width0 = [(); $crate::count!($($x0)*)];
164            let cols = $crate::count!($($x0)*);
165            let rows = 1usize;
166
167            $(
168                let _assert_width = [(); $crate::count!($($x)*)];
169                _assert_width0 = _assert_width;
170                let rows = rows + 1usize;
171            )*
172
173            let vec = Vec::with_capacity(rows.checked_mul(cols).unwrap());
174            let mut grid = $crate::Grid::from_vec_with_order(vec, cols, $crate::grid::Order::ColumnMajor);
175
176            grid.push_row(vec![$($x0),*]);
177            $( grid.push_row(vec![$($x),*]); )*
178
179            grid
180        }
181    };
182}
183
184pub use grid;
185pub use grid_cm;
186
187/// Define the internal memory layout of the grid.
188#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
189#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
190#[cfg_attr(feature = "bevy_reflect", derive(Reflect))]
191pub enum Order {
192    /// The data is ordered row by row.
193    #[default]
194    RowMajor,
195
196    /// The data is ordered column by column.
197    ColumnMajor,
198}
199
200impl Order {
201    fn counterpart(self) -> Self {
202        match self {
203            Self::RowMajor => Self::ColumnMajor,
204            Self::ColumnMajor => Self::RowMajor,
205        }
206    }
207}
208
209/// Stores elements of a certain type in a 2D grid structure.
210///
211/// Uses a rust `Vec<T>` type to reference the grid data on the heap.
212/// Also the internal memory layout as well as the number of
213/// rows and columns are stored in the grid data structure.
214///
215/// The size limit of a grid is `rows * cols < usize`.
216#[cfg_attr(feature = "bevy_reflect", derive(Reflect))]
217pub struct Grid<T> {
218    data: Vec<T>,
219    cols: usize,
220    rows: usize,
221    order: Order,
222}
223
224#[cfg(feature = "serde")]
225impl<'de, T: Deserialize<'de>> Deserialize<'de> for Grid<T> {
226    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
227    where
228        D: Deserializer<'de>,
229    {
230        use std::marker::PhantomData;
231        #[derive(serde::Deserialize)]
232        #[serde(field_identifier, rename_all = "lowercase")]
233        enum Field {
234            Data,
235            Cols,
236            Order,
237        }
238
239        struct GridVisitor<T> {
240            _p: PhantomData<T>,
241        }
242
243        impl<'de, T: Deserialize<'de>> Visitor<'de> for GridVisitor<T> {
244            type Value = Grid<T>;
245
246            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
247                formatter.write_str("struct Grid")
248            }
249
250            fn visit_seq<V>(self, mut seq: V) -> Result<Grid<T>, V::Error>
251            where
252                V: SeqAccess<'de>,
253            {
254                let cols = seq
255                    .next_element()?
256                    .ok_or_else(|| de::Error::invalid_length(0, &self))?;
257                let data = seq
258                    .next_element()?
259                    .ok_or_else(|| de::Error::invalid_length(1, &self))?;
260                let order = seq.next_element()?.unwrap_or_default();
261                Ok(Grid::from_vec_with_order(data, cols, order))
262            }
263
264            fn visit_map<V>(self, mut map: V) -> Result<Grid<T>, V::Error>
265            where
266                V: MapAccess<'de>,
267            {
268                let mut cols = None;
269                let mut data = None;
270                let mut order = None;
271                while let Some(key) = map.next_key()? {
272                    match key {
273                        Field::Data => {
274                            if data.is_some() {
275                                return Err(de::Error::duplicate_field("data"));
276                            }
277                            data = Some(map.next_value()?);
278                        }
279                        Field::Cols => {
280                            if cols.is_some() {
281                                return Err(de::Error::duplicate_field("cols"));
282                            }
283                            cols = Some(map.next_value()?);
284                        }
285                        Field::Order => {
286                            if order.is_some() {
287                                return Err(de::Error::duplicate_field("order"));
288                            }
289                            order = Some(map.next_value()?);
290                        }
291                    }
292                }
293                let cols = cols.ok_or_else(|| de::Error::missing_field("cols"))?;
294                let data = data.ok_or_else(|| de::Error::missing_field("data"))?;
295                let order = order.unwrap_or_default();
296                Ok(Grid::from_vec_with_order(data, cols, order))
297            }
298        }
299
300        const FIELDS: &'static [&'static str] = &["cols", "data", "order"];
301        deserializer.deserialize_struct("Grid", FIELDS, GridVisitor { _p: PhantomData })
302    }
303}
304
305#[cfg(feature = "serde")]
306impl<T: Serialize> Serialize for Grid<T> {
307    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
308    where
309        S: Serializer,
310    {
311        // 3 is the number of fields in the struct.
312        let mut state = serializer.serialize_struct("Grid", 3)?;
313        state.serialize_field("cols", &self.cols)?;
314        state.serialize_field("data", &self.data)?;
315        state.serialize_field("order", &self.order)?;
316        state.end()
317    }
318}
319
320impl<T> Grid<T> {
321    /// Init a grid of size rows x columns with default values of the given type.
322    /// For example this will generate a 2x3 grid of zeros:
323    ///
324    /// ```
325    /// use plane_2d::grid::Grid;
326    /// let grid : Grid<u8> = Grid::new(2,3);
327    /// assert_eq!(grid[(0, 0)], 0);
328    /// ```
329    ///
330    /// If `rows == 0` or `cols == 0` the grid will be empty with no cols and rows.
331    ///
332    /// This create a grid with a row-major memory layout.
333    /// If you need a column-major one, see [`new_with_order`](Grid::new_with_order).
334    ///
335    /// # Panics
336    ///
337    /// Panics if `rows * cols > usize::MAX`.
338    #[must_use]
339    #[inline]
340    pub fn new(rows: usize, cols: usize) -> Self
341    where
342        T: Default,
343    {
344        Self::new_with_order(rows, cols, Order::default())
345    }
346
347    /// Same as [`new`](Self::new) but with a specific [`Order`].
348    ///
349    /// # Panics
350    ///
351    /// Panics if `rows * cols > usize::MAX`.
352    pub fn new_with_order(rows: usize, cols: usize, order: Order) -> Self
353    where
354        T: Default,
355    {
356        if rows == 0 || cols == 0 {
357            return Self {
358                data: Vec::new(),
359                rows: 0,
360                cols: 0,
361                order,
362            };
363        }
364        let mut data = Vec::new();
365        data.resize_with(rows.checked_mul(cols).unwrap(), T::default);
366        Self {
367            data,
368            cols,
369            rows,
370            order,
371        }
372    }
373
374    /// Init a grid of size rows x columns with the given data element.
375    ///
376    /// If `rows == 0` or `cols == 0` the grid will be empty with no cols and rows.
377    ///
378    /// This create a grid with a row-major memory layout.
379    /// If you need a column-major one, see [`init_with_order`](Grid::init_with_order).
380    ///
381    /// # Panics
382    ///
383    /// Panics if `rows * cols > usize::MAX`.
384    #[inline]
385    pub fn init(rows: usize, cols: usize, data: T) -> Self
386    where
387        T: Clone,
388    {
389        Self::init_with_order(rows, cols, Order::default(), data)
390    }
391
392    /// Same as [`init`](Self::init) but with a specific [`Order`].
393    ///
394    /// # Panics
395    ///
396    /// Panics if `rows * cols > usize::MAX`.
397    pub fn init_with_order(rows: usize, cols: usize, order: Order, data: T) -> Self
398    where
399        T: Clone,
400    {
401        if rows == 0 || cols == 0 {
402            return Self {
403                data: Vec::new(),
404                rows: 0,
405                cols: 0,
406                order,
407            };
408        }
409        Self {
410            data: vec![data; rows.checked_mul(cols).unwrap()],
411            cols,
412            rows,
413            order,
414        }
415    }
416
417    /// Returns a grid from a vector with a given column length.
418    /// The length of `vec` must be a multiple of `cols`.
419    ///
420    /// This create a grid with a row-major memory layout.
421    /// If you need a column-major one, see [`from_vec_with_order`](Grid::from_vec_with_order).
422    ///
423    /// For example:
424    ///
425    /// ```
426    /// use plane_2d::grid::Grid;
427    /// let grid = Grid::from_vec(vec![1,2,3,4,5,6], 3);
428    /// assert_eq!(grid.size(), (2, 3));
429    /// ```
430    ///
431    /// will create a grid with the following layout:
432    /// \[1,2,3\]
433    /// \[4,5,6\]
434    ///
435    /// This example will fail, because `vec.len()` is not a multiple of `cols`:
436    ///
437    /// ``` should_panic
438    /// use plane_2d::grid::Grid;
439    /// Grid::from_vec(vec![1,2,3,4,5], 3);
440    /// ```
441    ///
442    /// # Panics
443    ///
444    /// This panics if the vector length isn't a multiple of the number of columns.
445    #[must_use]
446    #[inline]
447    pub fn from_vec(vec: Vec<T>, cols: usize) -> Self {
448        Self::from_vec_with_order(vec, cols, Order::default())
449    }
450
451    /// Same as [`from_vec`](Self::from_vec) but with a specific [`Order`].
452    ///
453    /// # Panics
454    ///
455    /// This panics if the vector length isn't a multiple of the number of columns.
456    #[must_use]
457    pub fn from_vec_with_order(vec: Vec<T>, cols: usize, order: Order) -> Self {
458        let rows = vec.len().checked_div(cols).unwrap_or(0);
459        assert_eq!(
460            rows * cols,
461            vec.len(),
462            "Vector length {:?} should be a multiple of cols = {:?}",
463            vec.len(),
464            cols
465        );
466        if rows == 0 || cols == 0 {
467            Grid {
468                data: vec,
469                rows: 0,
470                cols: 0,
471                order,
472            }
473        } else {
474            Grid {
475                data: vec,
476                rows,
477                cols,
478                order,
479            }
480        }
481    }
482
483    /// Returns the index of the coordinates in the internal vector.
484    #[inline]
485    #[must_use]
486    fn get_index(&self, row: usize, col: usize) -> usize {
487        match self.order {
488            Order::RowMajor => row * self.cols + col,
489            Order::ColumnMajor => col * self.rows + row,
490        }
491    }
492
493    /// Returns a reference to an element, without performing bound checks.
494    /// Generally not recommended, use with caution!
495    ///
496    /// # Safety
497    ///
498    /// Calling this method with an out-of-bounds index is undefined behavior even if the resulting reference is not used.
499    #[inline]
500    #[must_use]
501    pub unsafe fn get_unchecked(&self, row: impl Into<usize>, col: impl Into<usize>) -> &T {
502        let index = self.get_index(row.into(), col.into());
503        self.data.get_unchecked(index)
504    }
505
506    /// Returns a mutable reference to an element, without performing bound checks.
507    /// Generally not recommended, use with caution!
508    ///
509    /// # Safety
510    ///
511    /// Calling this method with an out-of-bounds index is undefined behavior even if the resulting reference is not used.
512    #[inline]
513    #[must_use]
514    pub unsafe fn get_unchecked_mut(
515        &mut self,
516        row: impl Into<usize>,
517        col: impl Into<usize>,
518    ) -> &mut T {
519        let index = self.get_index(row.into(), col.into());
520        self.data.get_unchecked_mut(index)
521    }
522
523    /// Access a certain element in the grid.
524    /// Returns `None` if an element beyond the grid bounds is tried to be accessed.
525    #[must_use]
526    pub fn get(&self, row: impl TryInto<usize>, col: impl TryInto<usize>) -> Option<&T> {
527        let row_usize = row.try_into().ok()?;
528        let col_usize = col.try_into().ok()?;
529        if row_usize < self.rows && col_usize < self.cols {
530            unsafe { Some(self.get_unchecked(row_usize, col_usize)) }
531        } else {
532            None
533        }
534    }
535
536    /// Mutable access to a certain element in the grid.
537    /// Returns `None` if an element beyond the grid bounds is tried to be accessed.
538    #[must_use]
539    pub fn get_mut(
540        &mut self,
541        row: impl TryInto<usize>,
542        col: impl TryInto<usize>,
543    ) -> Option<&mut T> {
544        let row_usize = row.try_into().ok()?;
545        let col_usize = col.try_into().ok()?;
546        if row_usize < self.rows && col_usize < self.cols {
547            unsafe { Some(self.get_unchecked_mut(row_usize, col_usize)) }
548        } else {
549            None
550        }
551    }
552
553    /// Returns the size of the grid as a two element tuple.
554    /// First element are the number of rows and the second the columns.
555    #[must_use]
556    pub fn size(&self) -> (usize, usize) {
557        (self.rows, self.cols)
558    }
559
560    /// Returns the number of rows of the grid.
561    #[must_use]
562    pub fn rows(&self) -> usize {
563        self.rows
564    }
565
566    /// Returns the number of columns of the grid.
567    #[must_use]
568    pub fn cols(&self) -> usize {
569        self.cols
570    }
571
572    /// Returns the internal memory layout of the grid.
573    #[must_use]
574    pub fn order(&self) -> Order {
575        self.order
576    }
577
578    /// Returns `true` if the grid contains no elements.
579    /// For example:
580    /// ```
581    /// use plane_2d::grid::*;
582    /// let grid : Grid<u8> = grid![];
583    /// assert!(grid.is_empty());
584    /// ```
585    #[must_use]
586    pub fn is_empty(&self) -> bool {
587        self.data.is_empty()
588    }
589
590    /// Clears the grid.
591    ///
592    /// This doesn't change the grid order.
593    pub fn clear(&mut self) {
594        self.rows = 0;
595        self.cols = 0;
596        self.data.clear();
597    }
598
599    /// Returns an iterator over the whole grid, starting from the first row and column.
600    ///
601    /// The iteration order is dependant on the internal memory layout.
602    /// If you need a specific order, see [`iter_rows`](Grid::iter_rows) or
603    /// [`iter_cols`](Grid::iter_cols).
604    ///
605    /// ```
606    /// use plane_2d::grid::*;
607    /// let grid: Grid<u8> = grid![[1,2][3,4]];
608    /// let mut iter = grid.iter();
609    /// assert_eq!(iter.next(), Some(&1));
610    /// assert_eq!(iter.next(), Some(&2));
611    /// assert_eq!(iter.next(), Some(&3));
612    /// assert_eq!(iter.next(), Some(&4));
613    /// assert_eq!(iter.next(), None);
614    /// ```
615    pub fn iter(&self) -> Iter<T> {
616        self.data.iter()
617    }
618
619    /// Returns an mutable iterator over the whole grid that allows modifying each value.
620    ///
621    /// The iteration order is dependant on the internal memory layout.
622    ///
623    /// ```
624    /// use plane_2d::grid::*;
625    /// let mut grid: Grid<u8> = grid![[1,2][3,4]];
626    /// let mut iter = grid.iter_mut();
627    /// let next = iter.next();
628    /// assert_eq!(next, Some(&mut 1));
629    /// *next.unwrap() = 10;
630    /// ```
631    pub fn iter_mut(&mut self) -> IterMut<T> {
632        self.data.iter_mut()
633    }
634
635    /// Returns an iterator over a column.
636    ///
637    /// # Examples
638    ///
639    /// ```
640    /// use plane_2d::grid::*;
641    /// let grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
642    /// let mut col_iter = grid.iter_col(1);
643    /// assert_eq!(col_iter.next(), Some(&2));
644    /// assert_eq!(col_iter.next(), Some(&4));
645    /// assert_eq!(col_iter.next(), None);
646    /// ```
647    ///
648    /// # Performance
649    ///
650    /// This method will be significantly slower if the grid uses a row-major memory layout,
651    /// which is the default.
652    ///
653    /// # Panics
654    ///
655    /// Panics if the col index is out of bounds.
656    pub fn iter_col(&self, col: usize) -> StepBy<Iter<T>> {
657        assert!(
658            col < self.cols,
659            "out of bounds. Column must be less than {:?}, but is {:?}",
660            self.cols,
661            col
662        );
663        match self.order {
664            Order::RowMajor => self.data[col..].iter().step_by(self.cols),
665            Order::ColumnMajor => {
666                let start = col * self.rows;
667                self.data[start..(start + self.rows)].iter().step_by(1)
668            }
669        }
670    }
671
672    /// Returns a mutable iterator over a column.
673    ///
674    /// # Examples
675    ///
676    /// ```
677    /// use plane_2d::grid::*;
678    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
679    /// let mut col_iter = grid.iter_col_mut(1);
680    /// let next = col_iter.next();
681    /// assert_eq!(next, Some(&mut 2));
682    /// *next.unwrap() = 10;
683    /// assert_eq!(grid[(0, 1)], 10);
684    /// ```
685    ///
686    /// # Performance
687    ///
688    /// This method will be significantly slower if the grid uses a row-major memory layout,
689    /// which is the default.
690    ///
691    /// # Panics
692    ///
693    /// Panics if the col index is out of bounds.
694    pub fn iter_col_mut(&mut self, col: usize) -> StepBy<IterMut<T>> {
695        assert!(
696            col < self.cols,
697            "out of bounds. Column must be less than {:?}, but is {:?}",
698            self.cols,
699            col
700        );
701        match self.order {
702            Order::RowMajor => self.data[col..].iter_mut().step_by(self.cols),
703            Order::ColumnMajor => {
704                let start = col * self.rows;
705                self.data[start..(start + self.rows)].iter_mut().step_by(1)
706            }
707        }
708    }
709
710    /// Returns an iterator over a row.
711    ///
712    /// # Examples
713    ///
714    /// ```
715    /// use plane_2d::grid::*;
716    /// let grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
717    /// let mut col_iter = grid.iter_row(1);
718    /// assert_eq!(col_iter.next(), Some(&3));
719    /// assert_eq!(col_iter.next(), Some(&4));
720    /// assert_eq!(col_iter.next(), Some(&5));
721    /// assert_eq!(col_iter.next(), None);
722    /// ```
723    ///
724    /// # Performance
725    ///
726    /// This method will be significantly slower if the grid uses a column-major memory layout.
727    ///
728    /// # Panics
729    ///
730    /// Panics if the row index is out of bounds.
731    pub fn iter_row(&self, row: usize) -> StepBy<Iter<T>> {
732        assert!(
733            row < self.rows,
734            "out of bounds. Row must be less than {:?}, but is {:?}",
735            self.rows,
736            row
737        );
738        match self.order {
739            Order::RowMajor => {
740                let start = row * self.cols;
741                self.data[start..(start + self.cols)].iter().step_by(1)
742            }
743            Order::ColumnMajor => self.data[row..].iter().step_by(self.rows),
744        }
745    }
746
747    /// Returns a mutable iterator over a row.
748    ///
749    /// # Examples
750    ///
751    /// ```
752    /// use plane_2d::grid::*;
753    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
754    /// let mut col_iter = grid.iter_row_mut(1);
755    /// let next = col_iter.next();
756    /// *next.unwrap() = 10;
757    /// assert_eq!(grid[(1, 0)], 10);
758    /// ```
759    ///
760    /// # Performance
761    ///
762    /// This method will be significantly slower if the grid uses a column-major memory layout.
763    ///
764    /// # Panics
765    ///
766    /// Panics if the row index is out of bounds.
767    pub fn iter_row_mut(&mut self, row: usize) -> StepBy<IterMut<T>> {
768        assert!(
769            row < self.rows,
770            "out of bounds. Row must be less than {:?}, but is {:?}",
771            self.rows,
772            row
773        );
774        match self.order {
775            Order::RowMajor => {
776                let start = row * self.cols;
777                self.data[start..(start + self.cols)].iter_mut().step_by(1)
778            }
779            Order::ColumnMajor => self.data[row..].iter_mut().step_by(self.rows),
780        }
781    }
782
783    /// Traverse the grid with row and column indexes.
784    ///
785    /// The iteration order is dependent on the internal memory layout,
786    /// but the indexes will be accurate either way.
787    ///
788    /// # Examples
789    ///
790    /// ```
791    /// use plane_2d::grid::*;
792    /// let grid: Grid<u8> = grid![[1,2][3,4]];
793    /// let mut iter = grid.indexed_iter();
794    /// assert_eq!(iter.next(), Some(((0, 0), &1)));
795    /// ```
796    ///
797    /// Or simply unpack in a `for` loop:
798    ///
799    /// ```
800    /// use plane_2d::grid::*;
801    /// let grid: Grid<u8> = grid![[1,2][3,4]];
802    /// for ((row, col), i) in grid.indexed_iter() {
803    ///     println!("value at row {row} and column {col} is: {i}");
804    /// }
805    /// ```
806    pub fn indexed_iter(&self) -> impl Iterator<Item = ((usize, usize), &T)> {
807        self.data.iter().enumerate().map(move |(idx, i)| {
808            let position = match self.order {
809                Order::RowMajor => (idx / self.cols, idx % self.cols),
810                Order::ColumnMajor => (idx % self.rows, idx / self.rows),
811            };
812            (position, i)
813        })
814    }
815
816    /// Traverse the grid with row and column indexes,
817    /// and mutable access to each element.
818    ///
819    /// The iteration order is dependent on the internal memory layout,
820    /// but the indexes will be accurate either way.
821    ///
822    /// # Examples
823    ///
824    /// ```
825    /// use plane_2d::grid::*;
826    /// let mut grid: Grid<u8> = grid![[1,2][3,4]];
827    /// let mut iter = grid.indexed_iter_mut();
828    /// assert_eq!(iter.next(), Some(((0, 0), &mut 1)));
829    /// ```
830    ///
831    /// Or simply unpack in a `for` loop:
832    ///
833    /// ```
834    /// use plane_2d::grid::*;
835    /// let mut grid: Grid<u8> = grid![[1,2][3,4]];
836    /// for ((row, col), i) in grid.indexed_iter_mut() {
837    ///     *i += 1;
838    ///     println!("value at row {row} and column {col} is: {i}");
839    /// }
840    ///
841    /// assert_eq!(grid[(0, 0)], 2);
842    /// assert_eq!(grid[(0, 1)], 3);
843    /// assert_eq!(grid[(1, 0)], 4);
844    /// assert_eq!(grid[(1, 1)], 5);
845    /// ```
846    pub fn indexed_iter_mut(&mut self) -> impl Iterator<Item = ((usize, usize), &mut T)> {
847        let order = self.order;
848        let cols = self.cols;
849        let rows = self.rows;
850
851        self.data.iter_mut().enumerate().map(move |(idx, i)| {
852            let position = match order {
853                Order::RowMajor => (idx / cols, idx % cols),
854                Order::ColumnMajor => (idx % rows, idx / rows),
855            };
856            (position, i)
857        })
858    }
859
860    ///
861    pub fn into_iter_indexed(self) -> impl Iterator<Item = ((usize, usize), T)> {
862        let order = self.order();
863        let cols = self.cols();
864        let rows = self.rows();
865
866        self.into_vec()
867            .into_iter()
868            .enumerate()
869            .map(move |(idx, i)| {
870                let position = match order {
871                    Order::RowMajor => (idx / cols, idx % cols),
872                    Order::ColumnMajor => (idx % rows, idx / rows),
873                };
874                (position, i)
875            })
876    }
877
878    /// Add a new row to the grid.
879    ///
880    /// # Examples
881    ///
882    /// ```
883    /// use plane_2d::grid::*;
884    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
885    /// let row = vec![6,7,8];
886    /// grid.push_row(row);
887    /// assert_eq!(grid.rows(), 3);
888    /// assert_eq!(grid[(2, 0)], 6);
889    /// assert_eq!(grid[(2, 1)], 7);
890    /// assert_eq!(grid[(2, 2)], 8);
891    /// ```
892    ///
893    /// Can also be used to init an empty grid:
894    ///
895    /// ```
896    /// use plane_2d::grid::*;
897    /// let mut grid: Grid<u8> = grid![];
898    /// let row = vec![1,2,3];
899    /// grid.push_row(row);
900    /// assert_eq!(grid.size(), (1, 3));
901    /// ```
902    ///
903    /// # Performance
904    ///
905    /// This method will be significantly slower if the grid uses a column-major memory layout.
906    ///
907    /// # Panics
908    ///
909    /// Panics if:
910    ///  - the grid is not empty and `row.len() != grid.cols()`
911    ///  - `row.len() == 0`
912    pub fn push_row(&mut self, row: Vec<T>) {
913        assert_ne!(row.len(), 0);
914        assert!(
915            !(self.rows > 0 && row.len() != self.cols),
916            "pushed row does not match. Length must be {:?}, but was {:?}.",
917            self.cols,
918            row.len()
919        );
920        self.data.extend(row);
921        if self.order == Order::ColumnMajor {
922            for i in (1..self.cols).rev() {
923                let col_idx = i * self.rows;
924                self.data[col_idx..col_idx + self.rows + i].rotate_right(i);
925            }
926        }
927        self.rows += 1;
928        if self.cols == 0 {
929            self.cols = self.data.len();
930        }
931    }
932
933    /// Add a new column to the grid.
934    ///
935    /// # Examples
936    ///
937    /// ```
938    /// use plane_2d::grid::*;
939    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
940    /// let col = vec![4,6];
941    /// grid.push_col(col);
942    /// assert_eq!(grid.cols(), 4);
943    /// assert_eq!(grid[(0, 3)], 4);
944    /// assert_eq!(grid[(1, 3)], 6);
945    /// ```
946    ///
947    /// Can also be used to init an empty grid:
948    ///
949    /// ```
950    /// use plane_2d::grid::*;
951    /// let mut grid: Grid<u8> = grid![];
952    /// let col = vec![1,2,3];
953    /// grid.push_col(col);
954    /// assert_eq!(grid.size(), (3, 1));
955    /// ```
956    ///
957    /// # Performance
958    ///
959    /// This method will be significantly slower if the grid uses a row-major memory layout,
960    /// which is the default.
961    ///
962    /// # Panics
963    ///
964    /// Panics if:
965    ///  - the grid is not empty and `col.len() != grid.rows()`
966    ///  - `col.len() == 0`
967    pub fn push_col(&mut self, col: Vec<T>) {
968        assert_ne!(col.len(), 0);
969        assert!(
970            !(self.cols > 0 && col.len() != self.rows),
971            "pushed column does not match. Length must be {:?}, but was {:?}.",
972            self.rows,
973            col.len()
974        );
975        self.data.extend(col);
976        if self.order == Order::RowMajor {
977            for i in (1..self.rows).rev() {
978                let row_idx = i * self.cols;
979                self.data[row_idx..row_idx + self.cols + i].rotate_right(i);
980            }
981        }
982        self.cols += 1;
983        if self.rows == 0 {
984            self.rows = self.data.len();
985        }
986    }
987
988    /// Removes the last row from a grid and returns it, or None if it is empty.
989    ///
990    /// # Examples
991    /// ```
992    /// use plane_2d::grid::*;
993    /// let mut grid = grid![[1,2,3][4,5,6]];
994    /// assert_eq![grid.pop_row(), Some(vec![4,5,6])];
995    /// assert_eq![grid.pop_row(), Some(vec![1,2,3])];
996    /// assert_eq![grid.pop_row(), None];
997    /// ```
998    ///
999    /// # Performance
1000    ///
1001    /// This method will be significantly slower if the grid uses a column-major memory layout.
1002    pub fn pop_row(&mut self) -> Option<Vec<T>> {
1003        if self.rows == 0 {
1004            return None;
1005        }
1006        if self.order == Order::ColumnMajor {
1007            for i in 1..self.cols {
1008                let col_idx = i * (self.rows - 1);
1009                self.data[col_idx..col_idx + self.rows + i - 1].rotate_left(i);
1010            }
1011        }
1012        let row = self.data.split_off(self.data.len() - self.cols);
1013        self.rows -= 1;
1014        if self.rows == 0 {
1015            self.cols = 0;
1016        }
1017        Some(row)
1018    }
1019
1020    /// Remove a Row at the index and return a vector of it.
1021    ///
1022    /// # Examples
1023    /// ```
1024    /// use plane_2d::grid::*;
1025    /// let mut grid = grid![[1,2][3,4][5,6]];
1026    /// assert_eq![grid.remove_row(1), Some(vec![3,4])];   
1027    /// assert_eq![grid.remove_row(0), Some(vec![1,2])];
1028    /// assert_eq![grid.remove_row(0), Some(vec![5,6])];
1029    /// assert_eq![grid.remove_row(0), None];
1030    /// ```
1031    ///
1032    /// # Performance
1033    ///
1034    /// This method will be significantly slower if the grid uses a column-major memory layout.
1035    pub fn remove_row(&mut self, row_index: usize) -> Option<Vec<T>> {
1036        if self.cols == 0 || self.rows == 0 || row_index >= self.rows {
1037            return None;
1038        }
1039        let row = match self.order {
1040            Order::RowMajor => self
1041                .data
1042                .drain((row_index * self.cols)..((row_index + 1) * self.cols))
1043                .collect(),
1044            Order::ColumnMajor => {
1045                for i in 0..self.cols {
1046                    let col_idx = row_index + i * (self.rows - 1);
1047                    let end = cmp::min(col_idx + self.rows + i, self.data.len());
1048                    self.data[col_idx..end].rotate_left(i + 1);
1049                }
1050                self.data.split_off(self.data.len() - self.cols)
1051            }
1052        };
1053        self.rows -= 1;
1054        if self.rows == 0 {
1055            self.cols = 0;
1056        }
1057        Some(row)
1058    }
1059
1060    /// Removes the last column from a grid and returns it, or None if it is empty.
1061    ///
1062    /// Note that this operation is much slower than the `pop_row()` because the memory layout
1063    /// of `Grid` is row-major and removing a column requires a lot of move operations.
1064    ///
1065    /// # Examples
1066    /// ```
1067    /// use plane_2d::grid::*;
1068    /// let mut grid = grid![[1,2,3][4,5,6]];
1069    /// assert_eq![grid.pop_col(), Some(vec![3,6])];
1070    /// assert_eq![grid.pop_col(), Some(vec![2,5])];
1071    /// assert_eq![grid.pop_col(), Some(vec![1,4])];
1072    /// assert_eq![grid.pop_col(), None];
1073    /// ```
1074    ///
1075    /// # Performance
1076    ///
1077    /// This method will be significantly slower if the grid uses a row-major memory layout,
1078    /// which is the default.
1079    pub fn pop_col(&mut self) -> Option<Vec<T>> {
1080        if self.cols == 0 {
1081            return None;
1082        }
1083        if self.order == Order::RowMajor {
1084            for i in 1..self.rows {
1085                let row_idx = i * (self.cols - 1);
1086                self.data[row_idx..row_idx + self.cols + i - 1].rotate_left(i);
1087            }
1088        }
1089        let col = self.data.split_off(self.data.len() - self.rows);
1090        self.cols -= 1;
1091        if self.cols == 0 {
1092            self.rows = 0;
1093        }
1094        Some(col)
1095    }
1096
1097    /// Remove a column at the index and return a vector of it.
1098    ///
1099    /// # Examples
1100    /// ```
1101    /// use plane_2d::grid::*;
1102    /// let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
1103    /// assert_eq![grid.remove_col(3), Some(vec![4,8,12,16])];
1104    /// assert_eq![grid.remove_col(0), Some(vec![1,5,9,13])];
1105    /// assert_eq![grid.remove_col(1), Some(vec![3,7,11,15])];
1106    /// assert_eq![grid.remove_col(0), Some(vec![2,6,10,14])];
1107    /// assert_eq![grid.remove_col(0), None];
1108    /// ```
1109    ///
1110    /// # Performance
1111    ///
1112    /// This method will be significantly slower if the grid uses a row-major memory layout,
1113    /// which is the default.
1114    pub fn remove_col(&mut self, col_index: usize) -> Option<Vec<T>> {
1115        if self.cols == 0 || self.rows == 0 || col_index >= self.cols {
1116            return None;
1117        }
1118        let col = match self.order {
1119            Order::RowMajor => {
1120                for i in 0..self.rows {
1121                    let row_idx = col_index + i * (self.cols - 1);
1122                    let end = cmp::min(row_idx + self.cols + i, self.data.len());
1123                    self.data[row_idx..end].rotate_left(i + 1);
1124                }
1125                self.data.split_off(self.data.len() - self.rows)
1126            }
1127            Order::ColumnMajor => self
1128                .data
1129                .drain((col_index * self.rows)..((col_index + 1) * self.rows))
1130                .collect(),
1131        };
1132        self.cols -= 1;
1133        if self.cols == 0 {
1134            self.rows = 0;
1135        }
1136        Some(col)
1137    }
1138
1139    /// Insert a new row at the index and shifts all rows after down.
1140    ///
1141    /// # Examples
1142    /// ```
1143    /// use plane_2d::grid::*;
1144    /// let mut grid = grid![[1,2,3][4,5,6]];
1145    /// grid.insert_row(1, vec![7,8,9]);
1146    /// assert_eq!(grid, grid![[1,2,3][7,8,9][4,5,6]]);
1147    /// ```
1148    ///
1149    /// # Performance
1150    ///
1151    /// This method will be significantly slower if the grid uses a column-major memory layout.
1152    ///
1153    /// # Panics
1154    ///
1155    /// Panics if:
1156    /// - the grid is not empty and `row.len() != grid.cols()`.
1157    /// - the index is greater than the number of rows
1158    pub fn insert_row(&mut self, index: usize, row: Vec<T>) {
1159        let input_len = row.len();
1160        assert!(
1161            !(self.cols > 0 && input_len != self.cols),
1162            "Inserted row must be of length {}, but was {}.",
1163            self.cols,
1164            row.len()
1165        );
1166        assert!(
1167            index <= self.rows,
1168            "Out of range. Index was {}, but must be less or equal to {}.",
1169            index,
1170            self.rows
1171        );
1172        match self.order {
1173            Order::RowMajor => {
1174                let data_idx = index * input_len;
1175                self.data.splice(data_idx..data_idx, row);
1176            }
1177            Order::ColumnMajor => {
1178                for (col_iter, row_val) in row.into_iter().enumerate() {
1179                    let data_idx = col_iter * self.rows + index + col_iter;
1180                    self.data.insert(data_idx, row_val);
1181                }
1182            }
1183        }
1184        self.cols = input_len;
1185        self.rows += 1;
1186    }
1187
1188    /// Insert a new column at the index.
1189    ///
1190    /// Important! Insertion of columns is a lot slower than the lines insertion.
1191    /// This is because of the memory layout of the grid data structure.
1192    ///
1193    /// # Examples
1194    /// ```
1195    /// use plane_2d::grid::*;
1196    /// let mut grid = grid![[1,2,3][4,5,6]];
1197    /// grid.insert_col(1, vec![9,9]);
1198    /// assert_eq!(grid, grid![[1,9,2,3][4,9,5,6]])
1199    /// ```
1200    ///
1201    /// # Performance
1202    ///
1203    /// This method will be significantly slower if the grid uses a row-major memory layout,
1204    /// which is the default.
1205    ///
1206    /// # Panics
1207    ///
1208    /// Panics if:
1209    /// - the grid is not empty and `col.len() != grid.rows()`.
1210    /// - the index is greater than the number of columns
1211    pub fn insert_col(&mut self, index: usize, col: Vec<T>) {
1212        let input_len = col.len();
1213        assert!(
1214            !(self.rows > 0 && input_len != self.rows),
1215            "Inserted col must be of length {}, but was {}.",
1216            self.rows,
1217            col.len()
1218        );
1219        assert!(
1220            index <= self.cols,
1221            "Out of range. Index was {}, but must be less or equal to {}.",
1222            index,
1223            self.cols
1224        );
1225        match self.order {
1226            Order::RowMajor => {
1227                for (row_iter, col_val) in col.into_iter().enumerate() {
1228                    let data_idx = row_iter * self.cols + index + row_iter;
1229                    self.data.insert(data_idx, col_val);
1230                }
1231            }
1232            Order::ColumnMajor => {
1233                let data_idx = index * input_len;
1234                self.data.splice(data_idx..data_idx, col);
1235            }
1236        }
1237        self.rows = input_len;
1238        self.cols += 1;
1239    }
1240
1241    /// Returns a reference to the internal data structure of the grid.
1242    ///
1243    /// The order of the elements depends on the internal memory layout, which is
1244    /// row-major by default.
1245    ///
1246    /// # Examples
1247    /// ```
1248    /// use plane_2d::grid::*;
1249    /// let grid = grid![[1,2,3][4,5,6]];
1250    /// let flat = grid.flatten();
1251    /// assert_eq!(flat, &vec![1,2,3,4,5,6]);
1252    /// ```
1253    #[must_use]
1254    pub fn flatten(&self) -> &Vec<T> {
1255        &self.data
1256    }
1257
1258    /// Converts self into a vector without clones or allocation.
1259    ///
1260    /// The order of the elements depends on the internal memory layout, which is
1261    /// row-major by default.
1262    #[must_use]
1263    pub fn into_vec(self) -> Vec<T> {
1264        self.data
1265    }
1266
1267    /// Transpose the grid so that columns become rows in new grid.
1268    ///
1269    /// This method changes the internal memory layout.
1270    pub fn transpose(&mut self) {
1271        self.order = self.order.counterpart();
1272        core::mem::swap(&mut self.rows, &mut self.cols);
1273    }
1274
1275    /// Flip (or mirrors) the columns.
1276    ///
1277    /// # Examples
1278    ///
1279    /// ```
1280    /// use plane_2d::grid::*;
1281    /// let mut grid = grid![[1,2,3][4,5,6]];
1282    /// grid.flip_cols();
1283    /// assert_eq!(grid, grid![[3,2,1][6,5,4]])
1284    /// ```
1285    ///
1286    /// # Performance
1287    ///
1288    /// This method will be significantly slower if the grid uses a column-major memory layout.
1289    pub fn flip_cols(&mut self) {
1290        match self.order {
1291            Order::RowMajor => {
1292                for row in 0..self.rows {
1293                    let idx = row * self.cols;
1294                    self.data[idx..idx + self.cols].reverse();
1295                }
1296            }
1297            Order::ColumnMajor => {
1298                for col in 0..self.cols / 2 {
1299                    for row in 0..self.rows {
1300                        let cell1 = self.get_index(row, col);
1301                        let cell2 = self.get_index(row, self.cols - col - 1);
1302                        self.data.swap(cell1, cell2);
1303                    }
1304                }
1305            }
1306        }
1307    }
1308
1309    /// Flip (or mirrors) the rows.
1310    ///
1311    /// # Examples
1312    ///
1313    /// ```
1314    /// use plane_2d::grid::*;
1315    /// let mut grid = grid![[1,2,3][4,5,6]];
1316    /// grid.flip_rows();
1317    /// assert_eq!(grid, grid![[4,5,6][1,2,3]])
1318    /// ```
1319    ///
1320    /// # Performance
1321    ///
1322    /// This method will be significantly slower if the grid uses a row-major memory layout,
1323    /// which is the default.
1324    pub fn flip_rows(&mut self) {
1325        match self.order {
1326            Order::RowMajor => {
1327                for row in 0..self.rows / 2 {
1328                    for col in 0..self.cols {
1329                        let cell1 = self.get_index(row, col);
1330                        let cell2 = self.get_index(self.rows - row - 1, col);
1331                        self.data.swap(cell1, cell2);
1332                    }
1333                }
1334            }
1335            Order::ColumnMajor => {
1336                for col in 0..self.cols {
1337                    let idx = col * self.rows;
1338                    self.data[idx..idx + self.rows].reverse();
1339                }
1340            }
1341        }
1342    }
1343
1344    /// Rotate the grid 90° counter-clockwise.
1345    ///
1346    /// This method changes the internal memory layout.
1347    ///
1348    /// # Examples
1349    ///
1350    /// ```
1351    /// use plane_2d::grid::*;
1352    /// let mut grid = grid![[1,2][3,4]];
1353    /// grid.rotate_left();
1354    /// assert_eq!(grid, grid![[2,4][1,3]]);
1355    /// ```
1356    ///
1357    /// # Performance
1358    ///
1359    /// This method will be significantly slower if the grid initialy uses a column-major memory layout,
1360    /// which is the default.
1361    pub fn rotate_left(&mut self) {
1362        self.transpose();
1363        self.flip_rows();
1364    }
1365
1366    /// Rotate the grid 90° clockwise.
1367    ///
1368    /// This method changes the internal memory layout.
1369    ///
1370    /// # Examples
1371    ///
1372    /// ```
1373    /// use plane_2d::grid::*;
1374    /// let mut grid = grid![[1,2][3,4]];
1375    /// grid.rotate_right();
1376    /// assert_eq!(grid, grid![[3,1][4,2]]);
1377    /// ```
1378    ///
1379    /// # Performance
1380    ///
1381    /// This method will be significantly slower if the grid initialy uses a row-major memory layout,
1382    /// which is the default.
1383    pub fn rotate_right(&mut self) {
1384        self.transpose();
1385        self.flip_cols();
1386    }
1387
1388    /// Rotate the grid 180°.
1389    ///
1390    /// This method **doesn't** change the internal memory layout.
1391    ///
1392    /// # Examples
1393    ///
1394    /// ```
1395    /// use plane_2d::grid::*;
1396    /// let mut grid = grid![[1,2,3][4,5,6]];
1397    /// grid.rotate_half();
1398    /// assert_eq!(grid, grid![[6,5,4][3,2,1]]);
1399    /// ```
1400    ///
1401    /// # Performance
1402    ///
1403    /// The performances of this method is not affected by the internal memory layout.
1404    pub fn rotate_half(&mut self) {
1405        self.data.reverse();
1406    }
1407
1408    /// Fills the grid with elements by cloning `value`.
1409    ///
1410    /// # Examples
1411    ///
1412    /// ```
1413    /// use plane_2d::grid::*;
1414    /// let mut grid = grid![[1,2,3][4,5,6]];
1415    /// grid.fill(7);
1416    /// assert_eq!(grid, grid![[7,7,7][7,7,7]]);
1417    /// ```
1418    pub fn fill(&mut self, value: T)
1419    where
1420        T: Clone,
1421    {
1422        self.data.fill(value);
1423    }
1424
1425    /// Fills the grid with elements returned by calling a closure repeatedly.
1426    ///
1427    /// This method uses a closure to create new values. If you'd rather
1428    /// [`Clone`] a given value, use [`fill`]. If you want to use the [`Default`]
1429    /// trait to generate values, you can pass [`Default::default`] as the
1430    /// argument.
1431    ///
1432    /// [`fill`]: Grid::fill
1433    ///
1434    /// # Examples
1435    ///
1436    /// ```
1437    /// use plane_2d::grid::*;
1438    /// let mut grid = grid![[1,2,3][4,5,6]];
1439    /// grid.fill_with(Default::default);
1440    /// assert_eq!(grid, grid![[0,0,0][0,0,0]]);
1441    /// ```
1442    pub fn fill_with<F>(&mut self, f: F)
1443    where
1444        F: FnMut() -> T,
1445    {
1446        self.data.fill_with(f);
1447    }
1448
1449    /// Iterate over the rows of the grid. Each time an iterator over a single
1450    /// row is returned.
1451    ///
1452    /// An item in this iterator is equal to a call to `Grid.iter_row(row_index)`
1453    /// of the corresponding row.
1454    ///
1455    /// # Examples
1456    ///
1457    /// ```
1458    /// use plane_2d::grid::*;
1459    /// let mut grid = grid![[1,2,3][4,5,6]];
1460    /// let sum_by_row: Vec<u8> = grid.iter_rows().map(|row| row.sum()).collect();
1461    /// assert_eq!(sum_by_row, vec![1+2+3, 4+5+6])
1462    /// ```
1463    #[must_use]
1464    pub fn iter_rows(&self) -> GridRowIter<'_, T> {
1465        GridRowIter {
1466            grid: self,
1467            row_start_index: 0,
1468            row_end_index: self.rows,
1469        }
1470    }
1471
1472    /// Iterate over the columns of the grid. Each time an iterator over a single
1473    /// column is returned.
1474    ///
1475    /// An item in this iterator is equal to a call to `Grid.iter_col(col_index)`
1476    /// of the corresponding column.
1477    ///
1478    /// # Examples
1479    ///
1480    /// ```
1481    /// use plane_2d::grid::*;
1482    /// let mut grid = grid![[1,2,3][4,5,6]];
1483    /// let sum_by_col: Vec<u8> = grid.iter_cols().map(|col| col.sum()).collect();
1484    /// assert_eq!(sum_by_col, vec![1+4, 2+5, 3+6])
1485    /// ```
1486    #[must_use]
1487    pub fn iter_cols(&self) -> GridColIter<'_, T> {
1488        GridColIter {
1489            grid: self,
1490            col_start_index: 0,
1491            col_end_index: self.cols,
1492        }
1493    }
1494}
1495
1496impl<T> Default for Grid<T> {
1497    fn default() -> Self {
1498        Self {
1499            data: Vec::default(),
1500            cols: 0,
1501            rows: 0,
1502            order: Order::default(),
1503        }
1504    }
1505}
1506
1507impl<T: Clone> Clone for Grid<T> {
1508    fn clone(&self) -> Self {
1509        Grid {
1510            rows: self.rows,
1511            cols: self.cols,
1512            data: self.data.clone(),
1513            order: self.order,
1514        }
1515    }
1516}
1517
1518impl<T: hash::Hash> hash::Hash for Grid<T> {
1519    #[inline]
1520    fn hash<H: hash::Hasher>(&self, state: &mut H) {
1521        self.rows.hash(state);
1522        self.cols.hash(state);
1523        self.order.hash(state);
1524        self.data.hash(state);
1525    }
1526}
1527
1528impl<T> Index<(usize, usize)> for Grid<T> {
1529    type Output = T;
1530
1531    #[inline]
1532    fn index(&self, (row, col): (usize, usize)) -> &T {
1533        assert!(
1534            !(row >= self.rows || col >= self.cols),
1535            "grid index out of bounds: ({row},{col}) out of ({},{})",
1536            self.rows,
1537            self.cols
1538        );
1539        let index = self.get_index(row, col);
1540        &self.data[index]
1541    }
1542}
1543
1544impl<T> IndexMut<(usize, usize)> for Grid<T> {
1545    #[inline]
1546    fn index_mut(&mut self, (row, col): (usize, usize)) -> &mut T {
1547        assert!(
1548            !(row >= self.rows || col >= self.cols),
1549            "grid index out of bounds: ({row},{col}) out of ({},{})",
1550            self.rows,
1551            self.cols
1552        );
1553        let index = self.get_index(row, col);
1554        &mut self.data[index]
1555    }
1556}
1557
1558impl<T: fmt::Debug> fmt::Debug for Grid<T> {
1559    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1560        write!(f, "[")?;
1561        if self.cols > 0 {
1562            if f.alternate() {
1563                writeln!(f)?;
1564                /*
1565                    WARNING
1566
1567                    Compound types becoming enormous as the entire `fmt::Debug` width is applied to each item individually.
1568                    For tuples and structs define padding and precision arguments manually to improve readability.
1569                */
1570                let width = f.width().unwrap_or_else(|| {
1571                    // Conditionally calculate the longest item by default.
1572                    self.data
1573                        .iter()
1574                        .map(|i| format!("{i:?}").len())
1575                        .max()
1576                        .unwrap()
1577                });
1578                let precision = f.precision().unwrap_or(2);
1579                for mut row in self.iter_rows().map(Iterator::peekable) {
1580                    write!(f, "    [")?;
1581                    while let Some(item) = row.next() {
1582                        write!(f, " {item:width$.precision$?}")?;
1583                        if row.peek().is_some() {
1584                            write!(f, ",")?;
1585                        }
1586                    }
1587                    writeln!(f, "]")?;
1588                }
1589            } else {
1590                for row in self.iter_rows() {
1591                    f.debug_list().entries(row).finish()?;
1592                }
1593            }
1594        }
1595        write!(f, "]")
1596    }
1597}
1598
1599impl<T: PartialEq> PartialEq for Grid<T> {
1600    fn eq(&self, other: &Self) -> bool {
1601        if self.rows != other.rows || self.cols != other.cols {
1602            return false;
1603        }
1604        if self.order == other.order {
1605            return self.data == other.data;
1606        }
1607        for (self_row, other_row) in core::iter::zip(self.iter_rows(), other.iter_rows()) {
1608            if self_row.ne(other_row) {
1609                return false;
1610            }
1611        }
1612        true
1613    }
1614}
1615
1616impl<T: Eq> Eq for Grid<T> {}
1617
1618impl<T> From<Vec<Vec<T>>> for Grid<T> {
1619    #[allow(clippy::redundant_closure_for_method_calls)]
1620    fn from(vec: Vec<Vec<T>>) -> Self {
1621        let cols = vec.first().map_or(0, |row| row.len());
1622        Self::from_vec_with_order(vec.into_iter().flatten().collect(), cols, Order::default())
1623    }
1624}
1625
1626impl<T: Clone> From<&Vec<Vec<T>>> for Grid<T> {
1627    #[allow(clippy::redundant_closure_for_method_calls)]
1628    fn from(vec: &Vec<Vec<T>>) -> Self {
1629        let cols = vec.first().map_or(0, |row| row.len());
1630        Self::from_vec_with_order(
1631            vec.clone().into_iter().flatten().collect(),
1632            cols,
1633            Order::default(),
1634        )
1635    }
1636}
1637
1638impl<T: Clone> From<&Vec<&Vec<T>>> for Grid<T> {
1639    #[allow(clippy::redundant_closure_for_method_calls)]
1640    fn from(vec: &Vec<&Vec<T>>) -> Self {
1641        let cols = vec.first().map_or(0, |row| row.len());
1642        Self::from_vec_with_order(
1643            vec.clone()
1644                .into_iter()
1645                .flat_map(|inner| inner.clone())
1646                .collect(),
1647            cols,
1648            Order::default(),
1649        )
1650    }
1651}
1652
1653impl<T> From<(Vec<T>, usize)> for Grid<T> {
1654    fn from(value: (Vec<T>, usize)) -> Self {
1655        Self::from_vec_with_order(value.0, value.1, Order::default())
1656    }
1657}
1658
1659impl<T: Clone> From<(&Vec<T>, usize)> for Grid<T> {
1660    fn from(value: (&Vec<T>, usize)) -> Self {
1661        Self::from_vec_with_order(value.0.clone(), value.1, Order::default())
1662    }
1663}
1664
1665impl<T: Clone> From<(&Vec<T>, &usize)> for Grid<T> {
1666    fn from(value: (&Vec<T>, &usize)) -> Self {
1667        Self::from_vec_with_order(value.0.clone(), *value.1, Order::default())
1668    }
1669}
1670
1671///
1672#[derive(Clone)]
1673pub struct GridRowIter<'a, T> {
1674    grid: &'a Grid<T>,
1675    row_start_index: usize,
1676    row_end_index: usize,
1677}
1678
1679///
1680#[derive(Clone)]
1681pub struct GridColIter<'a, T> {
1682    grid: &'a Grid<T>,
1683    col_start_index: usize,
1684    col_end_index: usize,
1685}
1686
1687impl<'a, T> Iterator for GridRowIter<'a, T> {
1688    type Item = StepBy<Iter<'a, T>>;
1689
1690    fn next(&mut self) -> Option<Self::Item> {
1691        if self.row_start_index >= self.row_end_index {
1692            return None;
1693        }
1694
1695        let row_iter = self.grid.iter_row(self.row_start_index);
1696        self.row_start_index += 1;
1697        Some(row_iter)
1698    }
1699
1700    fn size_hint(&self) -> (usize, Option<usize>) {
1701        let size = self.row_end_index - self.row_start_index;
1702        (size, Some(size))
1703    }
1704}
1705
1706impl<'a, T> ExactSizeIterator for GridRowIter<'a, T> {}
1707
1708impl<'a, T> DoubleEndedIterator for GridRowIter<'a, T> {
1709    fn next_back(&mut self) -> Option<Self::Item> {
1710        if self.row_start_index >= self.row_end_index {
1711            return None;
1712        }
1713
1714        let row_iter = self.grid.iter_row(self.row_end_index - 1);
1715        self.row_end_index -= 1;
1716        Some(row_iter)
1717    }
1718}
1719
1720impl<'a, T> Iterator for GridColIter<'a, T> {
1721    type Item = StepBy<Iter<'a, T>>;
1722
1723    fn next(&mut self) -> Option<Self::Item> {
1724        if self.col_start_index >= self.col_end_index {
1725            return None;
1726        }
1727
1728        let col_iter = self.grid.iter_col(self.col_start_index);
1729        self.col_start_index += 1;
1730        Some(col_iter)
1731    }
1732
1733    fn size_hint(&self) -> (usize, Option<usize>) {
1734        let size = self.col_end_index - self.col_start_index;
1735        (size, Some(size))
1736    }
1737}
1738
1739impl<'a, T> ExactSizeIterator for GridColIter<'a, T> {}
1740
1741impl<'a, T> DoubleEndedIterator for GridColIter<'a, T> {
1742    fn next_back(&mut self) -> Option<Self::Item> {
1743        if self.col_start_index >= self.col_end_index {
1744            return None;
1745        }
1746
1747        let col_iter = self.grid.iter_col(self.col_end_index - 1);
1748        self.col_end_index -= 1;
1749        Some(col_iter)
1750    }
1751}
1752
1753#[cfg(test)]
1754mod test {
1755    use super::*;
1756
1757    fn test_grid<T>(grid: &Grid<T>, rows: usize, cols: usize, order: Order, data: &[T])
1758    where
1759        T: fmt::Debug + PartialEq,
1760    {
1761        assert_eq!(grid.rows, rows, "number of rows is unexpected");
1762        assert_eq!(grid.cols, cols, "number of cols is unexpected");
1763        assert_eq!(grid.order, order, "grid order is unexpected");
1764        assert_eq!(grid.data, data, "internal data is unexpected");
1765    }
1766
1767    #[test]
1768    fn from_1d_vec() {
1769        let grid: Grid<u8> = Grid::from((vec![1, 2, 3], 1));
1770        test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
1771    }
1772
1773    #[test]
1774    #[should_panic]
1775    #[allow(clippy::should_panic_without_expect)]
1776    fn from_1d_vec_panic() {
1777        let _: Grid<u8> = Grid::from((vec![1, 2, 3], 2));
1778    }
1779
1780    #[test]
1781    fn from_1d_vec_reference() {
1782        let vec = vec![1, 2, 3];
1783        let grid: Grid<u8> = Grid::from((&vec, 1));
1784        test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
1785    }
1786
1787    #[test]
1788    #[should_panic]
1789    #[allow(clippy::should_panic_without_expect)]
1790    fn from_1d_vec_reference_panic() {
1791        let vec = vec![1, 2, 3];
1792        let _: Grid<u8> = Grid::from((&vec, 2));
1793    }
1794
1795    #[test]
1796    fn from_1d_vec_reference_and_reference() {
1797        let vec = vec![1, 2, 3];
1798        let cols = 1;
1799        let grid: Grid<u8> = Grid::from((&vec, &cols));
1800        test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
1801    }
1802
1803    #[test]
1804    #[should_panic]
1805    #[allow(clippy::should_panic_without_expect)]
1806    fn from_1d_vec_reference_and_reference_panic() {
1807        let vec = vec![1, 2, 3];
1808        let cols = 2;
1809        let _: Grid<u8> = Grid::from((&vec, &cols));
1810    }
1811
1812    #[test]
1813    fn from_2d_vec() {
1814        let grid: Grid<u8> = Grid::from(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]);
1815        test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
1816    }
1817
1818    #[test]
1819    #[should_panic]
1820    #[allow(clippy::should_panic_without_expect)]
1821    fn from_2d_vec_panic() {
1822        let _: Grid<u8> = Grid::from(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8]]);
1823    }
1824
1825    #[test]
1826    fn from_2d_vec_reference() {
1827        let vec = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
1828        let grid: Grid<u8> = Grid::from(&vec);
1829        test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
1830    }
1831
1832    #[test]
1833    #[should_panic]
1834    #[allow(clippy::should_panic_without_expect)]
1835    fn from_2d_vec_reference_panic() {
1836        let vec = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8]];
1837        let _: Grid<u8> = Grid::from(&vec);
1838    }
1839
1840    #[test]
1841    fn from_2d_vec_reference_of_references() {
1842        let inner_vec1 = vec![1, 2, 3];
1843        let inner_vec2 = vec![4, 5, 6];
1844        let inner_vec3 = vec![7, 8, 9];
1845        let vec = vec![&inner_vec1, &inner_vec2, &inner_vec3];
1846        let grid: Grid<u8> = Grid::from(&vec);
1847        test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
1848    }
1849
1850    #[test]
1851    #[should_panic]
1852    #[allow(clippy::should_panic_without_expect)]
1853    fn from_2d_vec_reference_of_references_panic() {
1854        let inner_vec1 = vec![1, 2, 3];
1855        let inner_vec2 = vec![4, 5, 6];
1856        let inner_vec3 = vec![7, 8];
1857        let vec = vec![&inner_vec1, &inner_vec2, &inner_vec3];
1858        let _: Grid<u8> = Grid::from(&vec);
1859    }
1860
1861    #[test]
1862    fn from_vec_zero_with_cols() {
1863        let grid: Grid<u8> = Grid::from_vec(vec![], 1);
1864        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
1865    }
1866
1867    #[test]
1868    fn from_vec_zero() {
1869        let grid: Grid<u8> = Grid::from_vec(vec![], 0);
1870        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
1871    }
1872
1873    #[test]
1874    #[should_panic]
1875    #[allow(clippy::should_panic_without_expect)]
1876    fn from_vec_panics_1() {
1877        let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 0);
1878    }
1879
1880    #[test]
1881    #[should_panic]
1882    #[allow(clippy::should_panic_without_expect)]
1883    fn from_vec_panics_2() {
1884        let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 2);
1885    }
1886
1887    #[test]
1888    fn from_vec_uses_original_vec() {
1889        let capacity = 10_000_000;
1890        let vec = Vec::with_capacity(capacity);
1891        let grid: Grid<u8> = Grid::from_vec(vec, 0);
1892        assert!(grid.into_vec().capacity() >= capacity);
1893    }
1894
1895    #[test]
1896    fn from_vec_with_order_zero_with_cols() {
1897        let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 1, Order::ColumnMajor);
1898        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
1899    }
1900
1901    #[test]
1902    fn from_vec_with_order_zero() {
1903        let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
1904        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
1905    }
1906
1907    #[test]
1908    #[should_panic]
1909    #[allow(clippy::should_panic_without_expect)]
1910    fn from_vec_with_order_panics_1() {
1911        let _: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 0, Order::ColumnMajor);
1912    }
1913
1914    #[test]
1915    #[should_panic]
1916    #[allow(clippy::should_panic_without_expect)]
1917    fn from_vec_with_order_panics_2() {
1918        let _: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 2, Order::ColumnMajor);
1919    }
1920
1921    #[test]
1922    fn from_vec_with_order_uses_original_vec() {
1923        let capacity = 10_000_000;
1924        let vec = Vec::with_capacity(capacity);
1925        let grid: Grid<u8> = Grid::from_vec_with_order(vec, 0, Order::ColumnMajor);
1926        assert!(grid.into_vec().capacity() >= capacity);
1927    }
1928
1929    #[test]
1930    fn insert_col_at_end() {
1931        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
1932        grid.insert_col(2, vec![5, 6]);
1933        test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 5, 3, 4, 6]);
1934    }
1935
1936    #[test]
1937    #[should_panic]
1938    #[allow(clippy::should_panic_without_expect)]
1939    fn insert_col_out_of_idx() {
1940        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
1941        grid.insert_col(3, vec![4, 5]);
1942    }
1943
1944    #[test]
1945    fn insert_col_empty() {
1946        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
1947        grid.insert_col(0, vec![1, 2, 3]);
1948        test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
1949    }
1950
1951    #[test]
1952    fn insert_col_at_end_column_major() {
1953        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
1954        grid.insert_col(2, vec![5, 6]);
1955        test_grid(&grid, 2, 3, Order::ColumnMajor, &[1, 3, 2, 4, 5, 6]);
1956    }
1957
1958    #[test]
1959    #[should_panic]
1960    #[allow(clippy::should_panic_without_expect)]
1961    fn insert_col_out_of_idx_column_major() {
1962        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
1963        grid.insert_col(3, vec![4, 5]);
1964    }
1965
1966    #[test]
1967    fn insert_col_empty_column_major() {
1968        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
1969        grid.insert_col(0, vec![1, 2, 3]);
1970        test_grid(&grid, 3, 1, Order::ColumnMajor, &[1, 2, 3]);
1971    }
1972
1973    #[test]
1974    fn insert_row_at_end() {
1975        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
1976        grid.insert_row(2, vec![5, 6]);
1977        test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
1978    }
1979
1980    #[test]
1981    fn insert_row_empty() {
1982        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
1983        grid.insert_row(0, vec![1, 2, 3]);
1984        test_grid(&grid, 1, 3, Order::RowMajor, &[1, 2, 3]);
1985    }
1986
1987    #[test]
1988    #[should_panic]
1989    #[allow(clippy::should_panic_without_expect)]
1990    fn insert_row_out_of_idx() {
1991        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
1992        grid.insert_row(3, vec![4, 5]);
1993    }
1994
1995    #[test]
1996    #[should_panic]
1997    #[allow(clippy::should_panic_without_expect)]
1998    fn insert_row_wrong_size_of_idx() {
1999        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2000        grid.insert_row(1, vec![4, 5, 4]);
2001    }
2002
2003    #[test]
2004    fn insert_row_start() {
2005        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2006        grid.insert_row(1, vec![5, 6]);
2007        test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 5, 6, 3, 4]);
2008    }
2009
2010    #[test]
2011    fn insert_row_at_end_column_major() {
2012        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2013        grid.insert_row(2, vec![5, 6]);
2014        test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 3, 5, 2, 4, 6]);
2015    }
2016
2017    #[test]
2018    fn insert_row_empty_column_major() {
2019        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2020        grid.insert_row(0, vec![1, 2, 3]);
2021        test_grid(&grid, 1, 3, Order::ColumnMajor, &[1, 2, 3]);
2022    }
2023
2024    #[test]
2025    #[should_panic]
2026    #[allow(clippy::should_panic_without_expect)]
2027    fn insert_row_out_of_idx_column_major() {
2028        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::ColumnMajor);
2029        grid.insert_row(3, vec![4, 5]);
2030    }
2031
2032    #[test]
2033    #[should_panic]
2034    #[allow(clippy::should_panic_without_expect)]
2035    fn insert_row_wrong_size_of_idx_column_major() {
2036        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::ColumnMajor);
2037        grid.insert_row(1, vec![4, 5, 4]);
2038    }
2039
2040    #[test]
2041    fn insert_row_start_column_major() {
2042        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2043        grid.insert_row(1, vec![5, 6]);
2044        test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 5, 3, 2, 6, 4]);
2045    }
2046
2047    #[test]
2048    fn pop_col_1x3() {
2049        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 3, Order::RowMajor);
2050        assert_eq!(grid.pop_col(), Some(vec![3]));
2051        test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
2052        assert_eq!(grid.pop_col(), Some(vec![2]));
2053        test_grid(&grid, 1, 1, Order::RowMajor, &[1]);
2054        assert_eq!(grid.pop_col(), Some(vec![1]));
2055        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2056        assert_eq!(grid.pop_col(), None);
2057        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2058    }
2059
2060    #[test]
2061    fn pop_col_3x1() {
2062        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 1, Order::RowMajor);
2063        assert_eq!(grid.pop_col(), Some(vec![1, 2, 3]));
2064        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2065        assert_eq!(grid.pop_col(), None);
2066        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2067    }
2068
2069    #[test]
2070    fn pop_col_2x2() {
2071        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2072        assert_eq!(grid.pop_col(), Some(vec![2, 4]));
2073        assert_eq!(grid.size(), (2, 1));
2074        test_grid(&grid, 2, 1, Order::RowMajor, &[1, 3]);
2075        assert_eq!(grid.pop_col(), Some(vec![1, 3]));
2076        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2077        assert_eq!(grid.pop_col(), None);
2078        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2079    }
2080
2081    #[test]
2082    fn pop_col_3x4() {
2083        let internal = vec![1, 2, 3, 4, 11, 22, 33, 44, 111, 222, 333, 444];
2084        let mut grid: Grid<u16> = Grid::from_vec_with_order(internal, 4, Order::RowMajor);
2085        assert_eq!(grid.pop_col(), Some(vec![4, 44, 444]));
2086        let expected = [1, 2, 3, 11, 22, 33, 111, 222, 333];
2087        test_grid(&grid, 3, 3, Order::RowMajor, &expected);
2088        assert_eq!(grid.pop_col(), Some(vec![3, 33, 333]));
2089        test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 11, 22, 111, 222]);
2090        assert_eq!(grid.pop_col(), Some(vec![2, 22, 222]));
2091        test_grid(&grid, 3, 1, Order::RowMajor, &[1, 11, 111]);
2092        assert_eq!(grid.pop_col(), Some(vec![1, 11, 111]));
2093        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2094        assert_eq!(grid.pop_col(), None);
2095        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2096    }
2097
2098    #[test]
2099    fn pop_col_empty() {
2100        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2101        assert_eq!(grid.pop_col(), None);
2102        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2103    }
2104
2105    #[test]
2106    fn pop_col_1x3_column_major() {
2107        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 3, Order::ColumnMajor);
2108        assert_eq!(grid.pop_col(), Some(vec![3]));
2109        test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
2110        assert_eq!(grid.pop_col(), Some(vec![2]));
2111        test_grid(&grid, 1, 1, Order::ColumnMajor, &[1]);
2112        assert_eq!(grid.pop_col(), Some(vec![1]));
2113        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2114        assert_eq!(grid.pop_col(), None);
2115        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2116    }
2117
2118    #[test]
2119    fn pop_col_3x1_column_major() {
2120        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 1, Order::ColumnMajor);
2121        assert_eq!(grid.pop_col(), Some(vec![1, 2, 3]));
2122        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2123        assert_eq!(grid.pop_col(), None);
2124        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2125    }
2126
2127    #[test]
2128    fn pop_col_2x2_column_major() {
2129        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2130        assert_eq!(grid.pop_col(), Some(vec![2, 4]));
2131        assert_eq!(grid.size(), (2, 1));
2132        test_grid(&grid, 2, 1, Order::ColumnMajor, &[1, 3]);
2133        assert_eq!(grid.pop_col(), Some(vec![1, 3]));
2134        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2135        assert_eq!(grid.pop_col(), None);
2136        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2137    }
2138
2139    #[test]
2140    fn pop_col_3x4_column_major() {
2141        let internal = vec![1, 11, 111, 2, 22, 222, 3, 33, 333, 4, 44, 444];
2142        let mut grid: Grid<u16> = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
2143        assert_eq!(grid.pop_col(), Some(vec![4, 44, 444]));
2144        let expected = [1, 11, 111, 2, 22, 222, 3, 33, 333];
2145        test_grid(&grid, 3, 3, Order::ColumnMajor, &expected);
2146        assert_eq!(grid.pop_col(), Some(vec![3, 33, 333]));
2147        test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 11, 111, 2, 22, 222]);
2148        assert_eq!(grid.pop_col(), Some(vec![2, 22, 222]));
2149        test_grid(&grid, 3, 1, Order::ColumnMajor, &[1, 11, 111]);
2150        assert_eq!(grid.pop_col(), Some(vec![1, 11, 111]));
2151        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2152        assert_eq!(grid.pop_col(), None);
2153        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2154    }
2155
2156    #[test]
2157    fn pop_col_empty_column_major() {
2158        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2159        assert_eq!(grid.pop_col(), None);
2160        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2161    }
2162
2163    #[test]
2164    fn pop_row_2x2() {
2165        let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
2166        assert_eq!(grid.pop_row(), Some(vec![3, 4]));
2167        test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
2168        assert_eq!(grid.pop_row(), Some(vec![1, 2]));
2169        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2170        assert_eq!(grid.pop_row(), None);
2171        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2172    }
2173
2174    #[test]
2175    fn pop_row_empty() {
2176        let mut grid: Grid<u8> = Grid::from_vec(vec![], 0);
2177        assert_eq!(grid.pop_row(), None);
2178        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2179    }
2180
2181    #[test]
2182    fn pop_row_2x2_column_major() {
2183        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2184        assert_eq!(grid.pop_row(), Some(vec![3, 4]));
2185        test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
2186        assert_eq!(grid.pop_row(), Some(vec![1, 2]));
2187        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2188        assert_eq!(grid.pop_row(), None);
2189        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2190    }
2191
2192    #[test]
2193    fn pop_row_empty_column_major() {
2194        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2195        assert_eq!(grid.pop_row(), None);
2196        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2197    }
2198
2199    #[test]
2200    fn ne_full_empty() {
2201        let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2202        let g2: Grid<u8> = grid![];
2203        assert_ne!(g1, g2);
2204    }
2205
2206    #[test]
2207    fn ne() {
2208        let g1 = Grid::from_vec(vec![1, 2, 3, 5], 2);
2209        let g2 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2210        assert_ne!(g1, g2);
2211    }
2212
2213    #[test]
2214    fn ne_dif_rows() {
2215        let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2216        let g2 = Grid::from_vec(vec![1, 2, 3, 4], 1);
2217        assert_ne!(g1, g2);
2218    }
2219
2220    #[test]
2221    fn equal_empty() {
2222        let grid: Grid<char> = grid![];
2223        let grid2: Grid<char> = grid![];
2224        assert_eq!(grid, grid2);
2225    }
2226
2227    #[test]
2228    fn equal() {
2229        let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2230        let grid2: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2231        assert_eq!(grid, grid2);
2232    }
2233
2234    #[test]
2235    fn equal_different_order() {
2236        let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2237        let grid2 = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2238        assert_eq!(grid, grid2);
2239    }
2240
2241    #[test]
2242    fn equal_partial_eq() {
2243        let grid = grid![[1.0]];
2244        let grid2 = Grid::from_vec(vec![1.0], 1);
2245        assert_eq!(grid, grid2);
2246    }
2247
2248    #[test]
2249    fn ne_partial_eq() {
2250        let grid = grid![[f64::NAN]];
2251        assert_ne!(grid, grid);
2252    }
2253
2254    #[test]
2255    #[should_panic]
2256    #[allow(clippy::should_panic_without_expect)]
2257    fn idx_tup_out_of_col_bounds() {
2258        let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2259        let _ = grid[(0, 5)];
2260    }
2261
2262    #[test]
2263    fn push_col_2x3() {
2264        let mut grid: Grid<u8> = grid![
2265                    [0, 1, 2]
2266                    [10, 11, 12]];
2267        grid.push_col(vec![3, 13]);
2268        test_grid(&grid, 2, 4, Order::RowMajor, &[0, 1, 2, 3, 10, 11, 12, 13]);
2269    }
2270
2271    #[test]
2272    fn push_col_3x4() {
2273        let mut grid: Grid<char> = grid![
2274                    ['a', 'b', 'c', 'd']
2275                    ['a', 'b', 'c', 'd']
2276                    ['a', 'b', 'c', 'd']];
2277        grid.push_col(vec!['x', 'y', 'z']);
2278        let expected = [
2279            'a', 'b', 'c', 'd', 'x', 'a', 'b', 'c', 'd', 'y', 'a', 'b', 'c', 'd', 'z',
2280        ];
2281        test_grid(&grid, 3, 5, Order::RowMajor, &expected);
2282    }
2283
2284    #[test]
2285    fn push_col_1x3() {
2286        let mut grid: Grid<char> = grid![['a', 'b', 'c']];
2287        grid.push_col(vec!['d']);
2288        test_grid(&grid, 1, 4, Order::RowMajor, &['a', 'b', 'c', 'd']);
2289    }
2290
2291    #[test]
2292    fn push_col_empty() {
2293        let mut grid: Grid<char> = grid![];
2294        grid.push_col(vec!['b', 'b', 'b', 'b']);
2295        test_grid(&grid, 4, 1, Order::RowMajor, &['b', 'b', 'b', 'b']);
2296    }
2297
2298    #[test]
2299    #[should_panic]
2300    #[allow(clippy::should_panic_without_expect)]
2301    fn push_col_wrong_size() {
2302        let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
2303        grid.push_col(vec!['b']);
2304        grid.push_col(vec!['b', 'b']);
2305    }
2306
2307    #[test]
2308    #[should_panic]
2309    #[allow(clippy::should_panic_without_expect)]
2310    fn push_col_zero_len() {
2311        let mut grid: Grid<char> = grid![];
2312        grid.push_col(vec![]);
2313    }
2314
2315    #[test]
2316    fn push_col_2x3_column_major() {
2317        let internal = vec![0, 10, 1, 11, 2, 12];
2318        let mut grid: Grid<u8> = Grid::from_vec_with_order(internal, 3, Order::ColumnMajor);
2319        grid.push_col(vec![3, 13]);
2320        let expected = [0, 10, 1, 11, 2, 12, 3, 13];
2321        test_grid(&grid, 2, 4, Order::ColumnMajor, &expected);
2322    }
2323
2324    #[test]
2325    fn push_col_3x4_column_major() {
2326        let internal = vec!['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'];
2327        let mut grid: Grid<char> = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
2328        grid.push_col(vec!['x', 'y', 'z']);
2329        let expected = [
2330            'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'x', 'y', 'z',
2331        ];
2332        test_grid(&grid, 3, 5, Order::ColumnMajor, &expected);
2333    }
2334
2335    #[test]
2336    fn push_col_1x3_column_major() {
2337        let mut grid: Grid<char> =
2338            Grid::from_vec_with_order(vec!['a', 'b', 'c'], 3, Order::ColumnMajor);
2339        grid.push_col(vec!['d']);
2340        test_grid(&grid, 1, 4, Order::ColumnMajor, &['a', 'b', 'c', 'd']);
2341    }
2342
2343    #[test]
2344    fn push_col_empty_column_major() {
2345        let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2346        grid.push_col(vec!['b', 'b', 'b', 'b']);
2347        test_grid(&grid, 4, 1, Order::ColumnMajor, &['b', 'b', 'b', 'b']);
2348    }
2349
2350    #[test]
2351    #[should_panic]
2352    #[allow(clippy::should_panic_without_expect)]
2353    fn push_col_wrong_size_column_major() {
2354        let mut grid: Grid<char> = Grid::init_with_order(2, 3, Order::ColumnMajor, 'a');
2355        grid.push_col(vec!['b']);
2356        grid.push_col(vec!['b', 'b']);
2357    }
2358
2359    #[test]
2360    #[should_panic]
2361    #[allow(clippy::should_panic_without_expect)]
2362    fn push_col_zero_len_column_major() {
2363        let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2364        grid.push_col(vec![]);
2365    }
2366
2367    #[test]
2368    fn push_row() {
2369        let mut grid: Grid<u8> = grid![[1, 2][3, 4]];
2370        grid.push_row(vec![5, 6]);
2371        test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
2372    }
2373
2374    #[test]
2375    fn push_row_empty() {
2376        let mut grid: Grid<char> = grid![];
2377        grid.push_row(vec!['b', 'b', 'b', 'b']);
2378        test_grid(&grid, 1, 4, Order::RowMajor, &['b', 'b', 'b', 'b']);
2379    }
2380
2381    #[test]
2382    #[should_panic]
2383    #[allow(clippy::should_panic_without_expect)]
2384    fn push_empty_row() {
2385        let mut grid = Grid::init(0, 1, 0);
2386        grid.push_row(vec![]);
2387    }
2388
2389    #[test]
2390    #[should_panic]
2391    #[allow(clippy::should_panic_without_expect)]
2392    fn push_row_wrong_size() {
2393        let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
2394        grid.push_row(vec!['b']);
2395        grid.push_row(vec!['b', 'b', 'b', 'b']);
2396    }
2397
2398    #[test]
2399    fn push_row_column_major() {
2400        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2401        grid.push_row(vec![5, 6]);
2402        test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 3, 5, 2, 4, 6]);
2403    }
2404
2405    #[test]
2406    fn push_row_empty_column_major() {
2407        let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2408        grid.push_row(vec!['b', 'b', 'b', 'b']);
2409        test_grid(&grid, 1, 4, Order::ColumnMajor, &['b', 'b', 'b', 'b']);
2410    }
2411
2412    #[test]
2413    #[should_panic]
2414    #[allow(clippy::should_panic_without_expect)]
2415    fn push_empty_row_column_major() {
2416        let mut grid = Grid::init_with_order(0, 1, Order::ColumnMajor, 0);
2417        grid.push_row(vec![]);
2418    }
2419
2420    #[test]
2421    #[should_panic]
2422    #[allow(clippy::should_panic_without_expect)]
2423    fn push_row_wrong_size_column_major() {
2424        let mut grid: Grid<char> =
2425            Grid::from_vec_with_order(vec!['a', 'a', 'a', 'a', 'a', 'a'], 3, Order::ColumnMajor);
2426        grid.push_row(vec!['b']);
2427        grid.push_row(vec!['b', 'b', 'b', 'b']);
2428    }
2429
2430    #[test]
2431    fn iter_row() {
2432        let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2433        let row: Vec<_> = grid.iter_row(1).collect();
2434        assert_eq!(row, [&4, &5, &6]);
2435    }
2436
2437    #[test]
2438    #[should_panic]
2439    #[allow(clippy::should_panic_without_expect)]
2440    fn iter_row_out_of_bound() {
2441        let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2442        let _ = grid.iter_row(3);
2443    }
2444
2445    #[test]
2446    #[should_panic]
2447    #[allow(clippy::should_panic_without_expect)]
2448    fn iter_row_zero() {
2449        let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2450        let _ = grid.iter_row(0);
2451    }
2452
2453    #[test]
2454    fn iter_row_rowumn_major() {
2455        let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2456        let row: Vec<_> = grid.iter_row(1).collect();
2457        assert_eq!(row, [&4, &5, &6]);
2458    }
2459
2460    #[test]
2461    #[should_panic]
2462    #[allow(clippy::should_panic_without_expect)]
2463    fn iter_row_rowumn_major_out_of_bound() {
2464        let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2465        let _ = grid.iter_row(3);
2466    }
2467
2468    #[test]
2469    #[should_panic]
2470    #[allow(clippy::should_panic_without_expect)]
2471    fn iter_row_rowumn_major_zero() {
2472        let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2473        let _ = grid.iter_row(0);
2474    }
2475
2476    #[test]
2477    fn iter_row_mut() {
2478        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2479        let row: Vec<_> = grid.iter_row_mut(1).collect();
2480        assert_eq!(row, [&mut 4, &mut 5, &mut 6]);
2481    }
2482
2483    #[test]
2484    #[should_panic]
2485    #[allow(clippy::should_panic_without_expect)]
2486    fn iter_row_mut_out_of_bound() {
2487        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2488        let _ = grid.iter_row_mut(3);
2489    }
2490
2491    #[test]
2492    #[should_panic]
2493    #[allow(clippy::should_panic_without_expect)]
2494    fn iter_row_mut_zero() {
2495        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2496        let _ = grid.iter_row_mut(0);
2497    }
2498
2499    #[test]
2500    fn iter_row_mut_rowumn_major() {
2501        let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2502        let row: Vec<_> = grid.iter_row_mut(1).collect();
2503        assert_eq!(row, [&mut 4, &mut 5, &mut 6]);
2504    }
2505
2506    #[test]
2507    #[should_panic]
2508    #[allow(clippy::should_panic_without_expect)]
2509    fn iter_row_mut_rowumn_major_out_of_bound() {
2510        let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2511        let _ = grid.iter_row_mut(3);
2512    }
2513
2514    #[test]
2515    #[should_panic]
2516    #[allow(clippy::should_panic_without_expect)]
2517    fn iter_row_mut_rowumn_major_zero() {
2518        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2519        let _ = grid.iter_row_mut(0);
2520    }
2521
2522    #[test]
2523    fn iter_col() {
2524        let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2525        let col: Vec<_> = grid.iter_col(1).collect();
2526        assert_eq!(col, [&2, &5]);
2527    }
2528
2529    #[test]
2530    #[should_panic]
2531    #[allow(clippy::should_panic_without_expect)]
2532    fn iter_col_out_of_bound() {
2533        let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2534        let _ = grid.iter_col(3);
2535    }
2536
2537    #[test]
2538    #[should_panic]
2539    #[allow(clippy::should_panic_without_expect)]
2540    fn iter_col_zero() {
2541        let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2542        let _ = grid.iter_col(0);
2543    }
2544
2545    #[test]
2546    fn iter_col_column_major() {
2547        let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2548        let col: Vec<_> = grid.iter_col(1).collect();
2549        assert_eq!(col, [&2, &5]);
2550    }
2551
2552    #[test]
2553    #[should_panic]
2554    #[allow(clippy::should_panic_without_expect)]
2555    fn iter_col_column_major_out_of_bound() {
2556        let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2557        let _ = grid.iter_col(3);
2558    }
2559
2560    #[test]
2561    #[should_panic]
2562    #[allow(clippy::should_panic_without_expect)]
2563    fn iter_col_column_major_zero() {
2564        let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2565        let _ = grid.iter_col(0);
2566    }
2567
2568    #[test]
2569    fn iter_col_mut() {
2570        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2571        let col: Vec<_> = grid.iter_col_mut(1).collect();
2572        assert_eq!(col, [&mut 2, &mut 5]);
2573    }
2574
2575    #[test]
2576    #[should_panic]
2577    #[allow(clippy::should_panic_without_expect)]
2578    fn iter_col_mut_out_of_bound() {
2579        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
2580        let _ = grid.iter_col_mut(3);
2581    }
2582
2583    #[test]
2584    #[should_panic]
2585    #[allow(clippy::should_panic_without_expect)]
2586    fn iter_col_mut_zero() {
2587        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2588        let _ = grid.iter_col_mut(0);
2589    }
2590
2591    #[test]
2592    fn iter_col_mut_column_major() {
2593        let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2594        let col: Vec<_> = grid.iter_col_mut(1).collect();
2595        assert_eq!(col, [&mut 2, &mut 5]);
2596    }
2597
2598    #[test]
2599    #[should_panic]
2600    #[allow(clippy::should_panic_without_expect)]
2601    fn iter_col_mut_column_major_out_of_bound() {
2602        let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2603        let _ = grid.iter_col_mut(3);
2604    }
2605
2606    #[test]
2607    #[should_panic]
2608    #[allow(clippy::should_panic_without_expect)]
2609    fn iter_col_mut_column_major_zero() {
2610        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2611        let _ = grid.iter_col_mut(0);
2612    }
2613
2614    #[test]
2615    fn iter() {
2616        let grid: Grid<u8> = grid![[1,2][3,4]];
2617        let mut iter = grid.iter();
2618        assert_eq!(iter.next(), Some(&1));
2619        assert_eq!(iter.next(), Some(&2));
2620        assert_eq!(iter.next(), Some(&3));
2621        assert_eq!(iter.next(), Some(&4));
2622        assert_eq!(iter.next(), None);
2623    }
2624
2625    #[test]
2626    fn indexed_iter() {
2627        let grid: Grid<u8> = grid![[1,2][3,4]];
2628        let mut iter = grid.indexed_iter();
2629        assert_eq!(iter.next(), Some(((0, 0), &1)));
2630        assert_eq!(iter.next(), Some(((0, 1), &2)));
2631        assert_eq!(iter.next(), Some(((1, 0), &3)));
2632        assert_eq!(iter.next(), Some(((1, 1), &4)));
2633        assert_eq!(iter.next(), None);
2634    }
2635
2636    #[test]
2637    fn indexed_iter_empty() {
2638        let grid: Grid<u8> = Grid::new(0, 0);
2639        let mut iter = grid.indexed_iter();
2640        assert_eq!(iter.next(), None);
2641    }
2642
2643    #[test]
2644    fn indexed_iter_column_major() {
2645        let grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2646        let mut iter = grid.indexed_iter();
2647        assert_eq!(iter.next(), Some(((0, 0), &1)));
2648        assert_eq!(iter.next(), Some(((1, 0), &3)));
2649        assert_eq!(iter.next(), Some(((0, 1), &2)));
2650        assert_eq!(iter.next(), Some(((1, 1), &4)));
2651        assert_eq!(iter.next(), None);
2652    }
2653
2654    #[test]
2655    fn indexed_iter_empty_column_major() {
2656        let grid: Grid<u8> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2657        let mut iter = grid.indexed_iter();
2658        assert_eq!(iter.next(), None);
2659    }
2660
2661    #[test]
2662    fn indexed_iter_mut() {
2663        let mut grid: Grid<u8> = grid![[1,2][3,4]];
2664        let mut iter = grid.indexed_iter_mut();
2665        assert_eq!(iter.next(), Some(((0, 0), &mut 1)));
2666        assert_eq!(iter.next(), Some(((0, 1), &mut 2)));
2667        assert_eq!(iter.next(), Some(((1, 0), &mut 3)));
2668        assert_eq!(iter.next(), Some(((1, 1), &mut 4)));
2669        assert_eq!(iter.next(), None);
2670    }
2671
2672    #[test]
2673    fn indexed_iter_mut_empty() {
2674        let mut grid: Grid<u8> = Grid::new(0, 0);
2675        let mut iter = grid.indexed_iter_mut();
2676        assert_eq!(iter.next(), None);
2677    }
2678
2679    #[test]
2680    fn indexed_iter_mut_column_major() {
2681        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2682        let mut iter = grid.indexed_iter_mut();
2683        assert_eq!(iter.next(), Some(((0, 0), &mut 1)));
2684        assert_eq!(iter.next(), Some(((1, 0), &mut 3)));
2685        assert_eq!(iter.next(), Some(((0, 1), &mut 2)));
2686        assert_eq!(iter.next(), Some(((1, 1), &mut 4)));
2687        assert_eq!(iter.next(), None);
2688    }
2689
2690    #[test]
2691    fn indexed_iter_mut_empty_column_major() {
2692        let mut grid: Grid<u8> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2693        let mut iter = grid.indexed_iter_mut();
2694        assert_eq!(iter.next(), None);
2695    }
2696
2697    #[test]
2698    fn clear() {
2699        let mut grid: Grid<u8> = grid![[1, 2, 3]];
2700        assert!(!grid.is_empty());
2701        grid.clear();
2702        assert!(grid.is_empty());
2703    }
2704
2705    #[test]
2706    fn is_empty_false() {
2707        let grid: Grid<u8> = grid![[1, 2, 3]];
2708        assert!(!grid.is_empty());
2709    }
2710
2711    #[test]
2712    fn is_empty() {
2713        let mut g: Grid<u8> = grid![[]];
2714        assert!(g.is_empty());
2715        g = grid![];
2716        assert!(g.is_empty());
2717        g = Grid::from_vec(vec![], 0);
2718        assert!(g.is_empty());
2719        g = Grid::new(0, 0);
2720        assert!(g.is_empty());
2721        g = Grid::new(0, 1);
2722        assert!(g.is_empty());
2723        g = Grid::new(1, 0);
2724        assert!(g.is_empty());
2725        g = Grid::init(0, 0, 10);
2726        assert!(g.is_empty());
2727    }
2728
2729    #[test]
2730    fn fmt_empty() {
2731        let grid: Grid<u8> = grid![];
2732        assert_eq!(format!("{grid:?}"), "[]");
2733    }
2734
2735    #[test]
2736    fn fmt_row() {
2737        let grid: Grid<u8> = grid![[1, 2, 3]];
2738        assert_eq!(format!("{grid:?}"), "[[1, 2, 3]]");
2739    }
2740
2741    #[test]
2742    fn fmt_grid() {
2743        let grid: Grid<u8> = grid![[1,2,3][4,5,6][7,8,9]];
2744        assert_eq!(format!("{grid:?}"), "[[1, 2, 3][4, 5, 6][7, 8, 9]]");
2745    }
2746
2747    #[test]
2748    fn fmt_column_major() {
2749        let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2750        assert_eq!(format!("{grid:?}"), "[[1, 2, 3][4, 5, 6]]");
2751    }
2752
2753    #[test]
2754    fn fmt_pretty_empty() {
2755        let grid: Grid<f32> = grid![];
2756        assert_eq!(format!("{grid:#?}"), "[]");
2757    }
2758
2759    #[test]
2760    fn fmt_pretty_int() {
2761        let grid: Grid<u8> = grid![
2762            [1,2,3]
2763            [4,5,6]
2764            [7,8,95]
2765        ];
2766
2767        let expected_output = r"[
2768    [  1,  2,  3]
2769    [  4,  5,  6]
2770    [  7,  8, 95]
2771]";
2772
2773        assert_eq!(format!("{grid:#?}"), expected_output);
2774
2775        let expected_output = r"[
2776    [   1,   2,   3]
2777    [   4,   5,   6]
2778    [   7,   8,  95]
2779]";
2780
2781        assert_eq!(format!("{grid:#3?}"), expected_output);
2782    }
2783
2784    #[test]
2785    fn fmt_pretty_float() {
2786        let grid: Grid<f32> = grid![
2787            [1.5,2.6,3.44]
2788            [4.775,5.,6.]
2789            [7.1,8.23444,95.55]
2790        ];
2791
2792        let expected_output = r"[
2793    [   1.5,   2.6,   3.4]
2794    [   4.8,   5.0,   6.0]
2795    [   7.1,   8.2,  95.6]
2796]";
2797
2798        assert_eq!(format!("{grid:#5.1?}"), expected_output);
2799
2800        let expected_output = r"[
2801    [  1.50000,  2.60000,  3.44000]
2802    [  4.77500,  5.00000,  6.00000]
2803    [  7.10000,  8.23444, 95.55000]
2804]";
2805
2806        assert_eq!(format!("{grid:#8.5?}"), expected_output);
2807    }
2808
2809    #[test]
2810    fn fmt_pretty_tuple() {
2811        let grid: Grid<(i32, i32)> = grid![
2812            [(5,66), (432, 55)]
2813            [(80, 90), (5, 6)]
2814        ];
2815
2816        let expected_output = r"[
2817    [ (        5,        66), (      432,        55)]
2818    [ (       80,        90), (        5,         6)]
2819]";
2820
2821        assert_eq!(format!("{grid:#?}"), expected_output);
2822
2823        let expected_output = r"[
2824    [ (  5,  66), (432,  55)]
2825    [ ( 80,  90), (  5,   6)]
2826]";
2827
2828        assert_eq!(format!("{grid:#3?}"), expected_output);
2829    }
2830
2831    #[test]
2832    fn fmt_pretty_struct_derived() {
2833        #[derive(Debug)]
2834        struct Person {
2835            _name: String,
2836            _precise_age: f32,
2837        }
2838
2839        impl Person {
2840            fn new(name: &str, precise_age: f32) -> Self {
2841                Person {
2842                    _name: name.into(),
2843                    _precise_age: precise_age,
2844                }
2845            }
2846        }
2847
2848        let grid: Grid<Person> = grid![
2849            [Person::new("Vic", 24.5), Person::new("Mr. Very Long Name", 1955.)]
2850            [Person::new("Sam", 8.9995), Person::new("John Doe", 40.14)]
2851        ];
2852
2853        let expected_output = r#"[
2854    [ Person { _name: "Vic", _precise_age: 24.50000 }, Person { _name: "Mr. Very Long Name", _precise_age: 1955.00000 }]
2855    [ Person { _name: "Sam", _precise_age: 8.99950 }, Person { _name: "John Doe", _precise_age: 40.14000 }]
2856]"#;
2857
2858        assert_eq!(format!("{grid:#5.5?}"), expected_output);
2859    }
2860
2861    #[test]
2862    fn fmt_pretty_column_major() {
2863        let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
2864        let expected_output = r"[
2865    [ 1, 2, 3]
2866    [ 4, 5, 6]
2867]";
2868        assert_eq!(format!("{grid:#?}"), expected_output);
2869    }
2870
2871    #[test]
2872    fn clone() {
2873        let grid = grid![[1, 2, 3][4, 5, 6]];
2874        let mut clone = grid.clone();
2875        clone[(0, 2)] = 10;
2876        test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
2877        test_grid(&clone, 2, 3, Order::RowMajor, &[1, 2, 10, 4, 5, 6]);
2878    }
2879
2880    #[test]
2881    fn macro_init() {
2882        let grid = grid![[1, 2, 3][4, 5, 6]];
2883        test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
2884    }
2885
2886    #[test]
2887    fn macro_init_2() {
2888        let grid = grid![[1, 2, 3]
2889                         [4, 5, 6]
2890                         [7, 8, 9]];
2891        test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
2892    }
2893
2894    #[test]
2895    fn macro_init_char() {
2896        let grid = grid![['a', 'b', 'c']
2897                         ['a', 'b', 'c']
2898                         ['a', 'b', 'c']];
2899        let expected = ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'];
2900        test_grid(&grid, 3, 3, Order::RowMajor, &expected);
2901    }
2902
2903    #[test]
2904    fn macro_one_row() {
2905        let grid: Grid<usize> = grid![[1, 2, 3, 4]];
2906        test_grid(&grid, 1, 4, Order::RowMajor, &[1, 2, 3, 4]);
2907    }
2908
2909    #[test]
2910    fn macro2_empty() {
2911        let grid: Grid<u8> = grid_cm![];
2912        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2913    }
2914
2915    #[test]
2916    fn macro2_init() {
2917        let grid = grid_cm![[1, 2, 3]
2918                          [4, 5, 6]
2919                          [7, 8, 9]];
2920        let expected = [1, 4, 7, 2, 5, 8, 3, 6, 9];
2921        test_grid(&grid, 3, 3, Order::ColumnMajor, &expected);
2922    }
2923
2924    #[test]
2925    fn macro2_init_char() {
2926        let grid = grid_cm![['a', 'b']['c', 'd']];
2927        test_grid(&grid, 2, 2, Order::ColumnMajor, &['a', 'c', 'b', 'd']);
2928    }
2929
2930    #[test]
2931    fn macro2_one_row() {
2932        let grid = grid_cm![[1, 2, 3, 4]];
2933        test_grid(&grid, 1, 4, Order::ColumnMajor, &[1, 2, 3, 4]);
2934    }
2935
2936    #[test]
2937    fn init() {
2938        let grid = Grid::init(1, 2, 3);
2939        test_grid(&grid, 1, 2, Order::RowMajor, &[3, 3]);
2940
2941        let grid = Grid::init(1, 2, 1.2);
2942        test_grid(&grid, 1, 2, Order::RowMajor, &[1.2, 1.2]);
2943
2944        let grid = Grid::init(1, 2, 'a');
2945        test_grid(&grid, 1, 2, Order::RowMajor, &['a', 'a']);
2946    }
2947
2948    #[test]
2949    #[should_panic]
2950    #[allow(clippy::should_panic_without_expect)]
2951    fn init_panics() {
2952        Grid::init(usize::MAX, 2, 3);
2953    }
2954
2955    #[test]
2956    fn init_empty() {
2957        let grid = Grid::init(0, 1, 0);
2958        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2959
2960        let grid = Grid::init(1, 0, -1);
2961        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2962    }
2963
2964    #[test]
2965    fn init_with_order() {
2966        let grid = Grid::init_with_order(1, 2, Order::RowMajor, 3);
2967        test_grid(&grid, 1, 2, Order::RowMajor, &[3, 3]);
2968
2969        let grid = Grid::init_with_order(1, 2, Order::ColumnMajor, 1.2);
2970        test_grid(&grid, 1, 2, Order::ColumnMajor, &[1.2, 1.2]);
2971
2972        let grid = Grid::init_with_order(1, 2, Order::ColumnMajor, 'a');
2973        test_grid(&grid, 1, 2, Order::ColumnMajor, &['a', 'a']);
2974    }
2975
2976    #[test]
2977    #[should_panic]
2978    #[allow(clippy::should_panic_without_expect)]
2979    fn init_with_order_panics() {
2980        Grid::init_with_order(usize::MAX, 2, Order::ColumnMajor, 3);
2981    }
2982
2983    #[test]
2984    fn init_with_order_empty() {
2985        let grid = Grid::init_with_order(0, 1, Order::ColumnMajor, 0);
2986        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2987
2988        let grid = Grid::init_with_order(1, 0, Order::RowMajor, -1);
2989        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2990    }
2991
2992    #[test]
2993    fn new() {
2994        let grid: Grid<u8> = Grid::new(1, 2);
2995        test_grid(&grid, 1, 2, Order::RowMajor, &[0, 0]);
2996    }
2997
2998    #[test]
2999    #[should_panic]
3000    #[allow(clippy::should_panic_without_expect)]
3001    fn new_panics() {
3002        let _: Grid<u8> = Grid::new(usize::MAX, 2);
3003    }
3004
3005    #[test]
3006    fn new_empty() {
3007        let grid: Grid<u8> = Grid::new(0, 1);
3008        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3009
3010        let grid: Grid<u8> = Grid::new(1, 0);
3011        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3012    }
3013
3014    #[test]
3015    fn new_with_order() {
3016        let grid: Grid<u8> = Grid::new_with_order(2, 2, Order::ColumnMajor);
3017        test_grid(&grid, 2, 2, Order::ColumnMajor, &[0, 0, 0, 0]);
3018    }
3019
3020    #[test]
3021    #[should_panic]
3022    #[allow(clippy::should_panic_without_expect)]
3023    fn new_with_order_panics() {
3024        let _: Grid<u8> = Grid::new_with_order(usize::MAX, 2, Order::ColumnMajor);
3025    }
3026
3027    #[test]
3028    fn new_with_order_empty() {
3029        let grid: Grid<u8> = Grid::new_with_order(0, 3, Order::RowMajor);
3030        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3031
3032        let grid: Grid<u8> = Grid::new_with_order(3, 0, Order::ColumnMajor);
3033        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3034    }
3035
3036    #[test]
3037    fn get() {
3038        let grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3039        assert_eq!(grid.get(0_i64, 1_i32), Some(&2));
3040    }
3041
3042    #[test]
3043    fn get_column_major() {
3044        let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3045        assert_eq!(grid.get(1, 0), Some(&2));
3046    }
3047
3048    #[test]
3049    fn get_none() {
3050        let grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3051        assert_eq!(grid.get(1, 0), None);
3052    }
3053
3054    #[test]
3055    fn get_none_column_major() {
3056        let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3057        assert_eq!(grid.get(0, 1), None);
3058    }
3059
3060    #[test]
3061    fn get_mut() {
3062        let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3063        assert_eq!(grid.get_mut(0_i64, 1_i32), Some(&mut 2));
3064    }
3065
3066    #[test]
3067    fn get_mut_column_major() {
3068        let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3069        assert_eq!(grid.get_mut(1, 0), Some(&mut 2));
3070    }
3071
3072    #[test]
3073    fn get_mut_none() {
3074        let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3075        assert_eq!(grid.get_mut(1, 0), None);
3076    }
3077
3078    #[test]
3079    fn get_mut_none_column_major() {
3080        let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3081        assert_eq!(grid.get_mut(0, 1), None);
3082    }
3083
3084    #[test]
3085    fn idx_tup() {
3086        let grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
3087        assert_eq!(grid[(0, 0)], 1);
3088        assert_eq!(grid[(0, 1)], 2);
3089        assert_eq!(grid[(1, 0)], 3);
3090        assert_eq!(grid[(1, 1)], 4);
3091    }
3092
3093    #[test]
3094    #[should_panic]
3095    #[allow(clippy::should_panic_without_expect)]
3096    fn idx_tup_panic_1() {
3097        let grid = Grid::init(1, 2, 3);
3098        let _ = grid[(20, 0)];
3099    }
3100
3101    #[test]
3102    #[should_panic]
3103    #[allow(clippy::should_panic_without_expect)]
3104    fn idx_tup_panic_2() {
3105        let grid = Grid::init(1, 2, 3);
3106        let _ = grid[(0, 20)];
3107    }
3108
3109    #[test]
3110    fn idx_tup_set() {
3111        let mut grid = Grid::init(1, 2, 3);
3112        grid[(0, 0)] = 4;
3113        assert_eq!(grid[(0, 0)], 4);
3114    }
3115
3116    #[test]
3117    fn size() {
3118        let grid = Grid::init(1, 2, 3);
3119        assert_eq!(grid.size(), (1, 2));
3120    }
3121
3122    #[test]
3123    fn transpose() {
3124        let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3125        grid.transpose();
3126        assert_eq!(grid, grid![[1,4][2,5][3,6]]);
3127    }
3128
3129    #[test]
3130    fn fill() {
3131        let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3132        grid.fill(7);
3133        test_grid(&grid, 2, 3, Order::RowMajor, &[7, 7, 7, 7, 7, 7]);
3134    }
3135
3136    #[test]
3137    fn fill_with() {
3138        let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3139        grid.fill_with(Default::default);
3140        test_grid(&grid, 2, 3, Order::RowMajor, &[0, 0, 0, 0, 0, 0]);
3141    }
3142
3143    #[test]
3144    #[allow(clippy::redundant_closure_for_method_calls)]
3145    fn iter_rows() {
3146        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3147        let max_by_row: Vec<u8> = grid
3148            .iter_rows()
3149            .map(|row| row.max().unwrap())
3150            .copied()
3151            .collect();
3152        assert_eq!(max_by_row, vec![3, 6]);
3153
3154        let sum_by_row: Vec<u8> = grid.iter_rows().map(|row| row.sum()).collect();
3155        assert_eq!(sum_by_row, vec![1 + 2 + 3, 4 + 5 + 6]);
3156    }
3157
3158    #[test]
3159    #[allow(clippy::redundant_closure_for_method_calls)]
3160    fn iter_rows_rev() {
3161        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3162        let max_by_row: Vec<u8> = grid
3163            .iter_rows()
3164            .rev()
3165            .map(|row| row.max().unwrap())
3166            .copied()
3167            .collect();
3168        assert_eq!(max_by_row, vec![6, 3]);
3169
3170        let sum_by_row: Vec<u8> = grid.iter_rows().rev().map(|row| row.sum()).collect();
3171        assert_eq!(sum_by_row, vec![4 + 5 + 6, 1 + 2 + 3]);
3172    }
3173
3174    #[test]
3175    fn iter_rows_exact_size() {
3176        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3177        let mut row_iter = grid.iter_rows();
3178        assert_eq!(row_iter.len(), 2);
3179        assert!(row_iter.next().is_some());
3180        assert_eq!(row_iter.len(), 1);
3181        assert!(row_iter.next().is_some());
3182        assert_eq!(row_iter.len(), 0);
3183        assert!(row_iter.next().is_none());
3184    }
3185
3186    #[test]
3187    #[allow(clippy::redundant_closure_for_method_calls)]
3188    fn iter_cols() {
3189        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3190        let max_by_col: Vec<u8> = grid
3191            .iter_cols()
3192            .map(|col| col.max().unwrap())
3193            .copied()
3194            .collect();
3195
3196        assert_eq!(max_by_col, vec![4, 5, 6]);
3197
3198        let sum_by_col: Vec<u8> = grid.iter_cols().map(|row| row.sum()).collect();
3199        assert_eq!(sum_by_col, vec![1 + 4, 2 + 5, 3 + 6]);
3200    }
3201
3202    #[test]
3203    #[allow(clippy::redundant_closure_for_method_calls)]
3204    fn iter_cols_rev() {
3205        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3206        let max_by_col: Vec<u8> = grid
3207            .iter_cols()
3208            .rev()
3209            .map(|col| col.max().unwrap())
3210            .copied()
3211            .collect();
3212
3213        assert_eq!(max_by_col, vec![6, 5, 4]);
3214
3215        let sum_by_col: Vec<u8> = grid.iter_cols().rev().map(|row| row.sum()).collect();
3216        assert_eq!(sum_by_col, vec![3 + 6, 2 + 5, 1 + 4]);
3217    }
3218
3219    #[test]
3220    fn iter_cols_exact_size() {
3221        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3222        let mut col_iter = grid.iter_cols();
3223        assert_eq!(col_iter.len(), 3);
3224        assert!(col_iter.next().is_some());
3225        assert_eq!(col_iter.len(), 2);
3226        assert!(col_iter.next().is_some());
3227        assert_eq!(col_iter.len(), 1);
3228        assert!(col_iter.next().is_some());
3229        assert_eq!(col_iter.len(), 0);
3230        assert!(col_iter.next().is_none());
3231    }
3232
3233    #[test]
3234    fn remove_row() {
3235        let mut grid = grid![[1,2][3,4][5,6]];
3236        assert_eq![grid.remove_row(1), Some(vec![3, 4])];
3237        test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 5, 6]);
3238        assert_eq![grid.remove_row(0), Some(vec![1, 2])];
3239        test_grid(&grid, 1, 2, Order::RowMajor, &[5, 6]);
3240        assert_eq![grid.remove_row(0), Some(vec![5, 6])];
3241        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3242        assert_eq![grid.remove_row(0), None];
3243        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3244    }
3245
3246    #[test]
3247    fn remove_row_out_of_bound() {
3248        let mut grid = grid![[1, 2][3, 4]];
3249        assert_eq![grid.remove_row(5), None];
3250        test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
3251        assert_eq![grid.remove_row(1), Some(vec![3, 4])];
3252        test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
3253    }
3254
3255    #[test]
3256    fn remove_row_column_major() {
3257        let mut grid = Grid::from_vec_with_order(vec![1, 3, 5, 2, 4, 6], 2, Order::ColumnMajor);
3258        assert_eq![grid.remove_row(1), Some(vec![3, 4])];
3259        test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 5, 2, 6]);
3260        assert_eq![grid.remove_row(0), Some(vec![1, 2])];
3261        test_grid(&grid, 1, 2, Order::ColumnMajor, &[5, 6]);
3262        assert_eq![grid.remove_row(0), Some(vec![5, 6])];
3263        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3264        assert_eq![grid.remove_row(0), None];
3265        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3266    }
3267
3268    #[test]
3269    fn remove_row_out_of_bound_column_major() {
3270        let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3271        assert_eq![grid.remove_row(5), None];
3272        test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
3273        assert_eq![grid.remove_row(1), Some(vec![3, 4])];
3274        test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
3275    }
3276
3277    #[test]
3278    fn remove_col() {
3279        let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
3280        assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])];
3281        let expected = [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15];
3282        test_grid(&grid, 4, 3, Order::RowMajor, &expected);
3283        assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])];
3284        test_grid(&grid, 4, 2, Order::RowMajor, &[2, 3, 6, 7, 10, 11, 14, 15]);
3285        assert_eq![grid.remove_col(1), Some(vec![3, 7, 11, 15])];
3286        test_grid(&grid, 4, 1, Order::RowMajor, &[2, 6, 10, 14]);
3287        assert_eq![grid.remove_col(0), Some(vec![2, 6, 10, 14])];
3288        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3289        assert_eq![grid.remove_col(0), None];
3290        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3291    }
3292
3293    #[test]
3294    fn remove_col_out_of_bound() {
3295        let mut grid = grid![[1, 2][3, 4]];
3296        assert_eq!(grid.remove_col(5), None);
3297        test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
3298        assert_eq!(grid.remove_col(1), Some(vec![2, 4]));
3299        test_grid(&grid, 2, 1, Order::RowMajor, &[1, 3]);
3300    }
3301
3302    #[test]
3303    fn remove_col_column_major() {
3304        let internal = vec![1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16];
3305        let mut grid = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
3306        assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])];
3307        let expected = [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15];
3308        test_grid(&grid, 4, 3, Order::ColumnMajor, &expected);
3309        assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])];
3310        let expected = [2, 6, 10, 14, 3, 7, 11, 15];
3311        test_grid(&grid, 4, 2, Order::ColumnMajor, &expected);
3312        assert_eq![grid.remove_col(1), Some(vec![3, 7, 11, 15])];
3313        test_grid(&grid, 4, 1, Order::ColumnMajor, &[2, 6, 10, 14]);
3314        assert_eq![grid.remove_col(0), Some(vec![2, 6, 10, 14])];
3315        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3316        assert_eq![grid.remove_col(0), None];
3317        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3318    }
3319
3320    #[test]
3321    fn remove_col_out_of_bound_column_major() {
3322        let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3323        assert_eq!(grid.remove_col(5), None);
3324        test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
3325        assert_eq!(grid.remove_col(1), Some(vec![2, 4]));
3326        test_grid(&grid, 2, 1, Order::ColumnMajor, &[1, 3]);
3327    }
3328
3329    #[test]
3330    fn flip_cols() {
3331        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
3332        grid.flip_cols();
3333        test_grid(&grid, 2, 2, Order::RowMajor, &[2, 1, 4, 3]);
3334    }
3335
3336    #[test]
3337    fn flip_cols_column_major() {
3338        let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3339        grid.flip_cols();
3340        test_grid(&grid, 2, 2, Order::ColumnMajor, &[2, 4, 1, 3]);
3341    }
3342
3343    #[test]
3344    fn flip_rows() {
3345        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
3346        grid.flip_rows();
3347        test_grid(&grid, 2, 2, Order::RowMajor, &[3, 4, 1, 2]);
3348    }
3349
3350    #[test]
3351    fn flip_rows_column_major() {
3352        let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3353        grid.flip_rows();
3354        test_grid(&grid, 2, 2, Order::ColumnMajor, &[3, 1, 4, 2]);
3355    }
3356
3357    #[test]
3358    fn rotate_left() {
3359        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3360        grid.rotate_left();
3361        test_grid(&grid, 3, 2, Order::ColumnMajor, &[3, 2, 1, 6, 5, 4]);
3362        assert_eq!(grid, grid![[3,6][2,5][1,4]]);
3363    }
3364
3365    #[test]
3366    fn rotate_left_column_major() {
3367        let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3368        grid.rotate_left();
3369        test_grid(&grid, 3, 2, Order::RowMajor, &[3, 6, 2, 5, 1, 4]);
3370        assert_eq!(grid, grid![[3,6][2,5][1,4]]);
3371    }
3372
3373    #[test]
3374    fn rotate_right() {
3375        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3376        grid.rotate_right();
3377        test_grid(&grid, 3, 2, Order::ColumnMajor, &[4, 5, 6, 1, 2, 3]);
3378        assert_eq!(grid, grid![[4,1][5,2][6,3]]);
3379    }
3380
3381    #[test]
3382    fn rotate_right_column_major() {
3383        let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3384        grid.rotate_right();
3385        test_grid(&grid, 3, 2, Order::RowMajor, &[4, 1, 5, 2, 6, 3]);
3386        assert_eq!(grid, grid![[4,1][5,2][6,3]]);
3387    }
3388
3389    #[test]
3390    fn iter_cols_clone() {
3391        let grid = grid![[1,2,3][4,5,6]];
3392        let mut cols = grid.iter_cols().skip(1);
3393        let c3: u8 = cols.clone().nth(1).unwrap().sum();
3394        let c2: u8 = cols.next().unwrap().sum();
3395        assert_eq!(c2, 2 + 5);
3396        assert_eq!(c3, 3 + 6);
3397    }
3398
3399    #[test]
3400    fn iter_rows_clone() {
3401        let grid = grid![[1,2,3][4,5,6][7,8,9]];
3402        let mut rows = grid.iter_rows().skip(1);
3403        let r3: u8 = rows.clone().nth(1).unwrap().sum();
3404        let r2: u8 = rows.next().unwrap().sum();
3405        assert_eq!(r2, 4 + 5 + 6);
3406        assert_eq!(r3, 7 + 8 + 9);
3407    }
3408}