grid/
lib.rs

1#![warn(clippy::all, clippy::pedantic, clippy::nursery)]
2/*!
3# Two Dimensional Grid
4Continuous growable 2D data structure.
5The purpose of this crate is to provide an universal data structure that is faster,
6uses less memory, and is easier to use than a naive `Vec<Vec<T>>` solution.
7
8This crate will always provide a 2D data structure. If you need three or more dimensions take a look at the
9[ndarray](https://docs.rs/ndarray/0.13.0/ndarray/) library. The `grid` crate is a container for all kind of data.
10If you need to perform matrix operations, you are better off with a linear algebra lib, such as
11[cgmath](https://docs.rs/cgmath/0.17.0/cgmath/) or [nalgebra](https://docs.rs/nalgebra/0.21.0/nalgebra/).
12No other dependencies except for the std lib are used.
13Most of the functions `std::Vec<T>` offer are also implemented in `grid` and slightly modified for a 2D data object.
14
15# Memory layout
16
17Similar to *C-like* arrays, `grid` uses a flat 1D `Vec<T>` data structure to have a continuous
18memory data layout. See also [this](https://stackoverflow.com/questions/17259877/1d-or-2d-array-whats-faster)
19explanation of why you should probably use a one-dimensional array approach.
20
21Note that this crate uses a [*row-major*](https://eli.thegreenplace.net/2015/memory-layout-of-multi-dimensional-arrays) memory layout by default.
22
23If you need a specific memory layout, please seek the `*_with_order` constructors. You should also take note that some transformation methods
24change the internal memory layout, like [`transpose`](Grid::transpose).
25
26This choice is important, because operations on rows are faster with a row-major memory layout.
27Likewise, operations on columns are faster with column-major memory layout.
28
29# Examples
30```
31use grid::*;
32let mut grid = grid![[1,2,3]
33                     [4,5,6]];
34assert_eq!(grid, Grid::from_vec(vec![1,2,3,4,5,6],3));
35assert_eq!(grid.get(0, 2), Some(&3));
36assert_eq!(grid[(1, 1)], 5);
37assert_eq!(grid.size(), (2, 3));
38grid.push_row(vec![7,8,9]);
39assert_eq!(grid, grid![[1,2,3][4,5,6][7,8,9]])
40 ```
41*/
42
43#![cfg_attr(not(feature = "std"), no_std)]
44
45#[cfg(all(test, not(feature = "std")))]
46extern crate std;
47
48#[cfg(not(feature = "std"))]
49extern crate alloc;
50#[cfg(not(feature = "std"))]
51use alloc::{format, vec, vec::Vec};
52#[cfg(feature = "serde")]
53use serde::{
54    de::{self, Deserialize, Deserializer, MapAccess, SeqAccess, Visitor},
55    ser::{Serialize, SerializeStruct, Serializer},
56};
57
58use core::cmp::Eq;
59use core::fmt;
60use core::hash;
61use core::iter::StepBy;
62use core::ops::Index;
63use core::ops::IndexMut;
64use core::slice::Iter;
65use core::slice::IterMut;
66use core::{cmp, convert::TryInto};
67
68#[doc(hidden)]
69#[macro_export]
70macro_rules! count {
71    () => (0usize);
72    ( $x:tt $($xs:tt)* ) => (1usize + $crate::count!($($xs)*));
73}
74
75/// Init a grid with values.
76///
77/// Each array within `[]` represents a row starting from top to button.
78///
79/// # Examples
80///
81/// In this example a grid of numbers from 1 to 9 is created:
82///
83///  
84/// ```
85/// use grid::grid;
86/// let grid = grid![[1, 2, 3]
87/// [4, 5, 6]
88/// [7, 8, 9]];
89/// assert_eq!(grid.size(), (3, 3))
90/// ```
91///
92/// Note that each row must be of the same length. The following example will not compile:
93///  
94/// ``` ignore
95/// use grid::grid;
96/// let grid = grid![[1, 2, 3]
97/// [4, 5] // This does not work!
98/// [7, 8, 9]];
99/// ```
100#[macro_export]
101macro_rules! grid {
102    () => {
103        $crate::Grid::from_vec(vec![], 0)
104    };
105    ( [$( $x:expr ),* ]) => { {
106        let vec = vec![$($x),*];
107        let len  = vec.len();
108        $crate::Grid::from_vec(vec, len)
109    } };
110    ( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => {
111        {
112            let mut _assert_width0 = [(); $crate::count!($($x0)*)];
113            let cols = $crate::count!($($x0)*);
114            let rows = 1usize;
115
116            $(
117                let _assert_width = [(); $crate::count!($($x)*)];
118                _assert_width0 = _assert_width;
119                let rows = rows + 1usize;
120            )*
121
122            let mut vec = Vec::with_capacity(rows.checked_mul(cols).unwrap());
123
124            $( vec.push($x0); )*
125            $( $( vec.push($x); )* )*
126
127            $crate::Grid::from_vec(vec, cols)
128        }
129    };
130}
131
132/// Init a column-major grid with values.
133///
134/// Each array within `[]` represents a row starting from top to button.
135///
136/// # Examples
137///
138/// In this example a grid of numbers from 1 to 9 is created:
139///
140/// ```
141/// use grid::grid_cm;
142/// let grid = grid_cm![[1, 2, 3]
143/// [4, 5, 6]
144/// [7, 8, 9]];
145/// assert_eq!(grid.size(), (3, 3));
146/// assert_eq!(grid[(1, 1)], 5);
147/// ```
148///
149/// Note that each row must be of the same length. The following example will not compile:
150///
151/// ``` ignore
152/// use grid::grid_cm;
153/// let grid = grid_cm![[1, 2, 3]
154/// [4, 5] // This does not work!
155/// [7, 8, 9]];
156/// ```
157#[macro_export]
158macro_rules! grid_cm {
159    () => {
160        $crate::Grid::from_vec_with_order(vec![], 0, $crate::Order::ColumnMajor)
161    };
162    ( [$( $x:expr ),* ]) => { {
163        let vec = vec![$($x),*];
164        let len  = vec.len();
165        $crate::Grid::from_vec_with_order(vec, len, $crate::Order::ColumnMajor)
166    } };
167    ( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => {
168        {
169            let mut _assert_width0 = [(); $crate::count!($($x0)*)];
170            let cols = $crate::count!($($x0)*);
171            let rows = 1usize;
172
173            $(
174                let _assert_width = [(); $crate::count!($($x)*)];
175                _assert_width0 = _assert_width;
176                let rows = rows + 1usize;
177            )*
178
179            let vec = Vec::with_capacity(rows.checked_mul(cols).unwrap());
180            let mut grid = $crate::Grid::from_vec_with_order(vec, cols, $crate::Order::ColumnMajor);
181
182            grid.push_row(vec![$($x0),*]);
183            $( grid.push_row(vec![$($x),*]); )*
184
185            grid
186        }
187    };
188}
189
190/// Define the internal memory layout of the grid.
191#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
192#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
193pub enum Order {
194    /// The data is ordered row by row.
195    #[default]
196    RowMajor,
197
198    /// The data is ordered column by column.
199    ColumnMajor,
200}
201
202impl Order {
203    const fn counterpart(self) -> Self {
204        match self {
205            Self::RowMajor => Self::ColumnMajor,
206            Self::ColumnMajor => Self::RowMajor,
207        }
208    }
209}
210
211/// Stores elements of a certain type in a 2D grid structure.
212///
213/// Uses a rust `Vec<T>` type to reference the grid data on the heap.
214/// Also the internal memory layout as well as the number of
215/// rows and columns are stored in the grid data structure.
216///
217/// The size limit of a grid is `rows * cols < usize`.
218pub struct Grid<T> {
219    data: Vec<T>,
220    cols: usize,
221    rows: usize,
222    order: Order,
223}
224
225#[cfg(feature = "serde")]
226impl<'de, T: Deserialize<'de>> Deserialize<'de> for Grid<T> {
227    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
228    where
229        D: Deserializer<'de>,
230    {
231        use std::marker::PhantomData;
232        #[derive(serde::Deserialize)]
233        #[serde(field_identifier, rename_all = "lowercase")]
234        enum Field {
235            Data,
236            Cols,
237            Order,
238        }
239
240        struct GridVisitor<T> {
241            _p: PhantomData<T>,
242        }
243
244        impl<'de, T: Deserialize<'de>> Visitor<'de> for GridVisitor<T> {
245            type Value = Grid<T>;
246
247            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
248                formatter.write_str("struct Grid")
249            }
250
251            fn visit_seq<V>(self, mut seq: V) -> Result<Grid<T>, V::Error>
252            where
253                V: SeqAccess<'de>,
254            {
255                let cols = seq
256                    .next_element()?
257                    .ok_or_else(|| de::Error::invalid_length(0, &self))?;
258                let data = seq
259                    .next_element()?
260                    .ok_or_else(|| de::Error::invalid_length(1, &self))?;
261                let order = seq.next_element()?.unwrap_or_default();
262                Ok(Grid::from_vec_with_order(data, cols, order))
263            }
264
265            fn visit_map<V>(self, mut map: V) -> Result<Grid<T>, V::Error>
266            where
267                V: MapAccess<'de>,
268            {
269                let mut cols = None;
270                let mut data = None;
271                let mut order = None;
272                while let Some(key) = map.next_key()? {
273                    match key {
274                        Field::Data => {
275                            if data.is_some() {
276                                return Err(de::Error::duplicate_field("data"));
277                            }
278                            data = Some(map.next_value()?);
279                        }
280                        Field::Cols => {
281                            if cols.is_some() {
282                                return Err(de::Error::duplicate_field("cols"));
283                            }
284                            cols = Some(map.next_value()?);
285                        }
286                        Field::Order => {
287                            if order.is_some() {
288                                return Err(de::Error::duplicate_field("order"));
289                            }
290                            order = Some(map.next_value()?);
291                        }
292                    }
293                }
294                let cols = cols.ok_or_else(|| de::Error::missing_field("cols"))?;
295                let data = data.ok_or_else(|| de::Error::missing_field("data"))?;
296                let order = order.unwrap_or_default();
297                Ok(Grid::from_vec_with_order(data, cols, order))
298            }
299        }
300
301        const FIELDS: &[&str] = &["cols", "data", "order"];
302        deserializer.deserialize_struct("Grid", FIELDS, GridVisitor { _p: PhantomData })
303    }
304}
305
306#[cfg(feature = "serde")]
307impl<T: Serialize> Serialize for Grid<T> {
308    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
309    where
310        S: Serializer,
311    {
312        // 3 is the number of fields in the struct.
313        let mut state = serializer.serialize_struct("Grid", 3)?;
314        state.serialize_field("cols", &self.cols)?;
315        state.serialize_field("data", &self.data)?;
316        state.serialize_field("order", &self.order)?;
317        state.end()
318    }
319}
320
321impl<T> Grid<T> {
322    /// Init a grid of size rows x columns with default values of the given type.
323    /// For example this will generate a 2x3 grid of zeros:
324    ///
325    /// ```
326    /// use grid::Grid;
327    /// let grid : Grid<u8> = Grid::new(2,3);
328    /// assert_eq!(grid[(0, 0)], 0);
329    /// ```
330    ///
331    /// If `rows == 0` or `cols == 0` the grid will be empty with no cols and rows.
332    ///
333    /// This create a grid with a row-major memory layout.
334    /// If you need a column-major one, see [`new_with_order`](Grid::new_with_order).
335    ///
336    /// # Panics
337    ///
338    /// Panics if `rows * cols > usize::MAX`.
339    #[must_use]
340    #[inline]
341    pub fn new(rows: usize, cols: usize) -> Self
342    where
343        T: Default,
344    {
345        Self::new_with_order(rows, cols, Order::default())
346    }
347
348    /// Same as [`new`](Self::new) but with a specific [`Order`].
349    ///
350    /// # Panics
351    ///
352    /// Panics if `rows * cols > usize::MAX`.
353    pub fn new_with_order(rows: usize, cols: usize, order: Order) -> Self
354    where
355        T: Default,
356    {
357        if rows == 0 || cols == 0 {
358            return Self {
359                data: Vec::new(),
360                rows: 0,
361                cols: 0,
362                order,
363            };
364        }
365        let mut data = Vec::new();
366        data.resize_with(rows.checked_mul(cols).unwrap(), T::default);
367        Self {
368            data,
369            cols,
370            rows,
371            order,
372        }
373    }
374
375    /// Init a grid of size rows x columns with the given data element.
376    ///
377    /// If `rows == 0` or `cols == 0` the grid will be empty with no cols and rows.
378    ///
379    /// This create a grid with a row-major memory layout.
380    /// If you need a column-major one, see [`init_with_order`](Grid::init_with_order).
381    ///
382    /// # Panics
383    ///
384    /// Panics if `rows * cols > usize::MAX`.
385    #[inline]
386    pub fn init(rows: usize, cols: usize, data: T) -> Self
387    where
388        T: Clone,
389    {
390        Self::init_with_order(rows, cols, Order::default(), data)
391    }
392
393    /// Same as [`init`](Self::init) but with a specific [`Order`].
394    ///
395    /// # Panics
396    ///
397    /// Panics if `rows * cols > usize::MAX`.
398    pub fn init_with_order(rows: usize, cols: usize, order: Order, data: T) -> Self
399    where
400        T: Clone,
401    {
402        if rows == 0 || cols == 0 {
403            return Self {
404                data: Vec::new(),
405                rows: 0,
406                cols: 0,
407                order,
408            };
409        }
410        Self {
411            data: vec![data; rows.checked_mul(cols).unwrap()],
412            cols,
413            rows,
414            order,
415        }
416    }
417
418    /// Initialises an empty Grid with the capacity to store `cols * rows` elements.
419    /// Similar to `Vec::with_capacity`.
420    ///
421    /// # Panics
422    ///
423    /// Panics if `rows * cols > usize::MAX` or if `rows * cols * size_of::<T>() > isize::MAX`
424    #[must_use]
425    pub fn with_capacity(rows: usize, cols: usize) -> Self {
426        Self::with_capacity_and_order(rows, cols, Order::default())
427    }
428
429    /// Same as [`with_capacity`](Self::with_capacity) but with a specified [`Order`]
430    ///
431    /// # Panics
432    ///
433    /// Panics if `rows * cols > usize::MAX` or if `rows * cols * size_of::<T>() > isize::MAX`
434    #[must_use]
435    pub fn with_capacity_and_order(rows: usize, cols: usize, order: Order) -> Self {
436        Self {
437            data: Vec::with_capacity(rows.checked_mul(cols).unwrap()),
438            cols: 0,
439            rows: 0,
440            order,
441        }
442    }
443
444    /// Returns a grid from a vector with a given column length.
445    /// The length of `vec` must be a multiple of `cols`.
446    ///
447    /// This create a grid with a row-major memory layout.
448    /// If you need a column-major one, see [`from_vec_with_order`](Grid::from_vec_with_order).
449    ///
450    /// For example:
451    ///
452    /// ```
453    /// use grid::Grid;
454    /// let grid = Grid::from_vec(vec![1,2,3,4,5,6], 3);
455    /// assert_eq!(grid.size(), (2, 3));
456    /// ```
457    ///
458    /// will create a grid with the following layout:
459    /// \[1,2,3\]
460    /// \[4,5,6\]
461    ///
462    /// This example will fail, because `vec.len()` is not a multiple of `cols`:
463    ///
464    /// ``` should_panic
465    /// use grid::Grid;
466    /// Grid::from_vec(vec![1,2,3,4,5], 3);
467    /// ```
468    ///
469    /// # Panics
470    ///
471    /// This panics if the vector length isn't a multiple of the number of columns.
472    #[must_use]
473    #[inline]
474    pub fn from_vec(vec: Vec<T>, cols: usize) -> Self {
475        Self::from_vec_with_order(vec, cols, Order::default())
476    }
477
478    /// Same as [`from_vec`](Self::from_vec) but with a specific [`Order`].
479    ///
480    /// # Panics
481    ///
482    /// This panics if the vector length isn't a multiple of the number of columns.
483    #[must_use]
484    pub fn from_vec_with_order(vec: Vec<T>, cols: usize, order: Order) -> Self {
485        let rows = vec.len().checked_div(cols).unwrap_or(0);
486        assert_eq!(
487            rows * cols,
488            vec.len(),
489            "Vector length {:?} should be a multiple of cols = {:?}",
490            vec.len(),
491            cols
492        );
493        if rows == 0 || cols == 0 {
494            Self {
495                data: vec,
496                rows: 0,
497                cols: 0,
498                order,
499            }
500        } else {
501            Self {
502                data: vec,
503                rows,
504                cols,
505                order,
506            }
507        }
508    }
509
510    #[inline]
511    #[must_use]
512    fn safe_add(lhs: usize, rhs: usize) -> usize {
513        lhs.checked_add(rhs).expect("grid dimensions overflow")
514    }
515
516    #[inline]
517    #[must_use]
518    fn safe_multiply(rows: usize, cols: usize) -> usize {
519        rows.checked_mul(cols).expect("grid dimensions overflow")
520    }
521
522    /// Returns the index of the coordinates in the internal vector.
523    #[inline]
524    #[must_use]
525    const fn get_index(&self, row: usize, col: usize) -> usize {
526        match self.order {
527            Order::RowMajor => row * self.cols + col,
528            Order::ColumnMajor => col * self.rows + row,
529        }
530    }
531
532    /// Returns a reference to an element, without performing bound checks.
533    /// Generally not recommended, use with caution!
534    ///
535    /// # Safety
536    ///
537    /// Calling this method with an out-of-bounds index is undefined behavior even if the resulting reference is not used.
538    #[inline]
539    #[must_use]
540    pub unsafe fn get_unchecked(&self, row: impl Into<usize>, col: impl Into<usize>) -> &T {
541        let index = self.get_index(row.into(), col.into());
542        self.data.get_unchecked(index)
543    }
544
545    /// Returns a mutable reference to an element, without performing bound checks.
546    /// Generally not recommended, use with caution!
547    ///
548    /// # Safety
549    ///
550    /// Calling this method with an out-of-bounds index is undefined behavior even if the resulting reference is not used.
551    #[inline]
552    #[must_use]
553    pub unsafe fn get_unchecked_mut(
554        &mut self,
555        row: impl Into<usize>,
556        col: impl Into<usize>,
557    ) -> &mut T {
558        let index = self.get_index(row.into(), col.into());
559        self.data.get_unchecked_mut(index)
560    }
561
562    /// Access a certain element in the grid.
563    /// Returns `None` if an element beyond the grid bounds is tried to be accessed.
564    #[must_use]
565    pub fn get(&self, row: impl TryInto<usize>, col: impl TryInto<usize>) -> Option<&T> {
566        let row_usize = row.try_into().ok()?;
567        let col_usize = col.try_into().ok()?;
568        if row_usize < self.rows && col_usize < self.cols {
569            unsafe { Some(self.get_unchecked(row_usize, col_usize)) }
570        } else {
571            None
572        }
573    }
574
575    /// Mutable access to a certain element in the grid.
576    /// Returns `None` if an element beyond the grid bounds is tried to be accessed.
577    #[must_use]
578    pub fn get_mut(
579        &mut self,
580        row: impl TryInto<usize>,
581        col: impl TryInto<usize>,
582    ) -> Option<&mut T> {
583        let row_usize = row.try_into().ok()?;
584        let col_usize = col.try_into().ok()?;
585        if row_usize < self.rows && col_usize < self.cols {
586            unsafe { Some(self.get_unchecked_mut(row_usize, col_usize)) }
587        } else {
588            None
589        }
590    }
591
592    /// Returns the size of the grid as a two element tuple.
593    /// First element are the number of rows and the second the columns.
594    #[must_use]
595    pub const fn size(&self) -> (usize, usize) {
596        (self.rows, self.cols)
597    }
598
599    /// Returns the number of rows of the grid.
600    #[must_use]
601    pub const fn rows(&self) -> usize {
602        self.rows
603    }
604
605    /// Returns the number of columns of the grid.
606    #[must_use]
607    pub const fn cols(&self) -> usize {
608        self.cols
609    }
610
611    /// Returns the internal memory layout of the grid.
612    #[must_use]
613    pub const fn order(&self) -> Order {
614        self.order
615    }
616
617    /// Returns `true` if the grid contains no elements.
618    /// For example:
619    /// ```
620    /// use grid::*;
621    /// let grid : Grid<u8> = grid![];
622    /// assert!(grid.is_empty());
623    /// ```
624    #[must_use]
625    pub fn is_empty(&self) -> bool {
626        self.data.is_empty()
627    }
628
629    /// Clears the grid.
630    ///
631    /// This doesn't change the grid order.
632    pub fn clear(&mut self) {
633        self.rows = 0;
634        self.cols = 0;
635        self.data.clear();
636    }
637
638    /// Returns an iterator over the whole grid, starting from the first row and column.
639    ///
640    /// The iteration order is dependant on the internal memory layout.
641    /// If you need a specific order, see [`iter_rows`](Grid::iter_rows) or
642    /// [`iter_cols`](Grid::iter_cols).
643    ///
644    /// ```
645    /// use grid::*;
646    /// let grid: Grid<u8> = grid![[1,2][3,4]];
647    /// let mut iter = grid.iter();
648    /// assert_eq!(iter.next(), Some(&1));
649    /// assert_eq!(iter.next(), Some(&2));
650    /// assert_eq!(iter.next(), Some(&3));
651    /// assert_eq!(iter.next(), Some(&4));
652    /// assert_eq!(iter.next(), None);
653    /// ```
654    pub fn iter(&self) -> Iter<'_, T> {
655        self.data.iter()
656    }
657
658    /// Returns an mutable iterator over the whole grid that allows modifying each value.
659    ///
660    /// The iteration order is dependant on the internal memory layout.
661    ///
662    /// ```
663    /// use grid::*;
664    /// let mut grid: Grid<u8> = grid![[1,2][3,4]];
665    /// let mut iter = grid.iter_mut();
666    /// let next = iter.next();
667    /// assert_eq!(next, Some(&mut 1));
668    /// *next.unwrap() = 10;
669    /// ```
670    pub fn iter_mut(&mut self) -> IterMut<'_, T> {
671        self.data.iter_mut()
672    }
673
674    /// Returns an iterator over a column.
675    ///
676    /// # Examples
677    ///
678    /// ```
679    /// use grid::*;
680    /// let grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
681    /// let mut col_iter = grid.iter_col(1);
682    /// assert_eq!(col_iter.next(), Some(&2));
683    /// assert_eq!(col_iter.next(), Some(&4));
684    /// assert_eq!(col_iter.next(), None);
685    /// ```
686    ///
687    /// # Performance
688    ///
689    /// This method will be significantly slower if the grid uses a row-major memory layout,
690    /// which is the default.
691    ///
692    /// # Panics
693    ///
694    /// Panics if the col index is out of bounds.
695    pub fn iter_col(&self, col: usize) -> StepBy<Iter<'_, T>> {
696        assert!(
697            col < self.cols,
698            "out of bounds. Column must be less than {:?}, but is {:?}",
699            self.cols,
700            col
701        );
702        match self.order {
703            Order::RowMajor => self.data[col..].iter().step_by(self.cols),
704            Order::ColumnMajor => {
705                let start = col * self.rows;
706                self.data[start..(start + self.rows)].iter().step_by(1)
707            }
708        }
709    }
710
711    /// Returns a mutable iterator over a column.
712    ///
713    /// # Examples
714    ///
715    /// ```
716    /// use grid::*;
717    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
718    /// let mut col_iter = grid.iter_col_mut(1);
719    /// let next = col_iter.next();
720    /// assert_eq!(next, Some(&mut 2));
721    /// *next.unwrap() = 10;
722    /// assert_eq!(grid[(0, 1)], 10);
723    /// ```
724    ///
725    /// # Performance
726    ///
727    /// This method will be significantly slower if the grid uses a row-major memory layout,
728    /// which is the default.
729    ///
730    /// # Panics
731    ///
732    /// Panics if the col index is out of bounds.
733    pub fn iter_col_mut(&mut self, col: usize) -> StepBy<IterMut<'_, T>> {
734        assert!(
735            col < self.cols,
736            "out of bounds. Column must be less than {:?}, but is {:?}",
737            self.cols,
738            col
739        );
740        match self.order {
741            Order::RowMajor => self.data[col..].iter_mut().step_by(self.cols),
742            Order::ColumnMajor => {
743                let start = col * self.rows;
744                self.data[start..(start + self.rows)].iter_mut().step_by(1)
745            }
746        }
747    }
748
749    /// Returns an iterator over a row.
750    ///
751    /// # Examples
752    ///
753    /// ```
754    /// use grid::*;
755    /// let grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
756    /// let mut col_iter = grid.iter_row(1);
757    /// assert_eq!(col_iter.next(), Some(&3));
758    /// assert_eq!(col_iter.next(), Some(&4));
759    /// assert_eq!(col_iter.next(), Some(&5));
760    /// assert_eq!(col_iter.next(), None);
761    /// ```
762    ///
763    /// # Performance
764    ///
765    /// This method will be significantly slower if the grid uses a column-major memory layout.
766    ///
767    /// # Panics
768    ///
769    /// Panics if the row index is out of bounds.
770    pub fn iter_row(&self, row: usize) -> StepBy<Iter<'_, T>> {
771        assert!(
772            row < self.rows,
773            "out of bounds. Row must be less than {:?}, but is {:?}",
774            self.rows,
775            row
776        );
777        match self.order {
778            Order::RowMajor => {
779                let start = row * self.cols;
780                self.data[start..(start + self.cols)].iter().step_by(1)
781            }
782            Order::ColumnMajor => self.data[row..].iter().step_by(self.rows),
783        }
784    }
785
786    /// Returns a mutable iterator over a row.
787    ///
788    /// # Examples
789    ///
790    /// ```
791    /// use grid::*;
792    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
793    /// let mut col_iter = grid.iter_row_mut(1);
794    /// let next = col_iter.next();
795    /// *next.unwrap() = 10;
796    /// assert_eq!(grid[(1, 0)], 10);
797    /// ```
798    ///
799    /// # Performance
800    ///
801    /// This method will be significantly slower if the grid uses a column-major memory layout.
802    ///
803    /// # Panics
804    ///
805    /// Panics if the row index is out of bounds.
806    pub fn iter_row_mut(&mut self, row: usize) -> StepBy<IterMut<'_, T>> {
807        assert!(
808            row < self.rows,
809            "out of bounds. Row must be less than {:?}, but is {:?}",
810            self.rows,
811            row
812        );
813        match self.order {
814            Order::RowMajor => {
815                let start = row * self.cols;
816                self.data[start..(start + self.cols)].iter_mut().step_by(1)
817            }
818            Order::ColumnMajor => self.data[row..].iter_mut().step_by(self.rows),
819        }
820    }
821
822    /// Traverse the grid with row and column indexes.
823    ///
824    /// The iteration order is dependent on the internal memory layout,
825    /// but the indexes will be accurate either way.
826    ///
827    /// # Examples
828    ///
829    /// ```
830    /// use grid::*;
831    /// let grid: Grid<u8> = grid![[1,2][3,4]];
832    /// let mut iter = grid.indexed_iter();
833    /// assert_eq!(iter.next(), Some(((0, 0), &1)));
834    /// ```
835    ///
836    /// Or simply unpack in a `for` loop:
837    ///
838    /// ```
839    /// use grid::*;
840    /// let grid: Grid<u8> = grid![[1,2][3,4]];
841    /// for ((row, col), i) in grid.indexed_iter() {
842    ///     println!("value at row {row} and column {col} is: {i}");
843    /// }
844    /// ```
845    pub fn indexed_iter(&self) -> impl Iterator<Item = ((usize, usize), &T)> {
846        self.data.iter().enumerate().map(move |(idx, i)| {
847            let position = match self.order {
848                Order::RowMajor => (idx / self.cols, idx % self.cols),
849                Order::ColumnMajor => (idx % self.rows, idx / self.rows),
850            };
851            (position, i)
852        })
853    }
854
855    /// Traverse the grid with row and column indexes,
856    /// and mutable access to each element.
857    ///
858    /// The iteration order is dependent on the internal memory layout,
859    /// but the indexes will be accurate either way.
860    ///
861    /// # Examples
862    ///
863    /// ```
864    /// use grid::*;
865    /// let mut grid: Grid<u8> = grid![[1,2][3,4]];
866    /// let mut iter = grid.indexed_iter_mut();
867    /// assert_eq!(iter.next(), Some(((0, 0), &mut 1)));
868    /// ```
869    ///
870    /// Or simply unpack in a `for` loop:
871    ///
872    /// ```
873    /// use grid::*;
874    /// let mut grid: Grid<u8> = grid![[1,2][3,4]];
875    /// for ((row, col), i) in grid.indexed_iter_mut() {
876    ///     *i += 1;
877    ///     println!("value at row {row} and column {col} is: {i}");
878    /// }
879    ///
880    /// assert_eq!(grid[(0, 0)], 2);
881    /// assert_eq!(grid[(0, 1)], 3);
882    /// assert_eq!(grid[(1, 0)], 4);
883    /// assert_eq!(grid[(1, 1)], 5);
884    /// ```
885    pub fn indexed_iter_mut(&mut self) -> impl Iterator<Item = ((usize, usize), &mut T)> {
886        let order = self.order;
887        let cols = self.cols;
888        let rows = self.rows;
889
890        self.data.iter_mut().enumerate().map(move |(idx, i)| {
891            let position = match order {
892                Order::RowMajor => (idx / cols, idx % cols),
893                Order::ColumnMajor => (idx % rows, idx / rows),
894            };
895            (position, i)
896        })
897    }
898
899    /// Consume grid the grid with row and column indexes.
900    ///
901    /// The iteration order is dependent on the internal memory layout,
902    /// but the indexes will be accurate either way.
903    ///
904    /// # Examples
905    ///
906    /// ```
907    /// use grid::*;
908    /// use std::rc::Rc;
909    ///
910    /// let grid: Grid<Rc<u8>> = grid![[Rc::new(1),Rc::new(2)][Rc::new(3),Rc::new(4)]];
911    /// let mut iter = grid.indexed_into_iter();
912    /// assert_eq!(iter.next(), Some(((0, 0), Rc::new(1))));
913    /// ```
914    ///
915    /// Or simply unpack in a `for` loop:
916    ///
917    /// ```
918    /// use grid::*;
919    /// use std::rc::Rc;
920    ///
921    /// let grid: Grid<Rc<i32>> = grid![[Rc::new(1),Rc::new(2)][Rc::new(3),Rc::new(4)]];
922    /// for ((row, col), i) in grid.indexed_into_iter() {
923    ///     println!("value at row {row} and column {col} is: {i}");
924    /// }
925    /// ```
926    pub fn indexed_into_iter(self) -> impl Iterator<Item = ((usize, usize), T)> {
927        let Self {
928            data,
929            cols,
930            rows,
931            order,
932        } = self;
933        data.into_iter().enumerate().map(move |(idx, i)| {
934            let position = match order {
935                Order::RowMajor => (idx / cols, idx % cols),
936                Order::ColumnMajor => (idx % rows, idx / rows),
937            };
938            (position, i)
939        })
940    }
941
942    /// Add a new row to the grid.
943    ///
944    /// # Examples
945    ///
946    /// ```
947    /// use grid::*;
948    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
949    /// let row = vec![6,7,8];
950    /// grid.push_row(row);
951    /// assert_eq!(grid.rows(), 3);
952    /// assert_eq!(grid[(2, 0)], 6);
953    /// assert_eq!(grid[(2, 1)], 7);
954    /// assert_eq!(grid[(2, 2)], 8);
955    /// ```
956    ///
957    /// Can also be used to init an empty grid:
958    ///
959    /// ```
960    /// use grid::*;
961    /// let mut grid: Grid<u8> = grid![];
962    /// let row = vec![1,2,3];
963    /// grid.push_row(row);
964    /// assert_eq!(grid.size(), (1, 3));
965    /// ```
966    ///
967    /// # Performance
968    ///
969    /// This method will be significantly slower if the grid uses a column-major memory layout.
970    ///
971    /// # Panics
972    ///
973    /// Panics if:
974    ///  - the grid is not empty and `row.len() != grid.cols()`
975    ///  - `row.len() == 0`
976    pub fn push_row(&mut self, row: Vec<T>) {
977        assert_ne!(row.len(), 0);
978        assert!(
979            !(self.rows > 0 && row.len() != self.cols),
980            "pushed row does not match. Length must be {:?}, but was {:?}.",
981            self.cols,
982            row.len()
983        );
984        self.data.extend(row);
985        if self.order == Order::ColumnMajor {
986            for i in (1..self.cols).rev() {
987                let col_idx = i * self.rows;
988                self.data[col_idx..col_idx + self.rows + i].rotate_right(i);
989            }
990        }
991        self.rows = Self::safe_add(self.rows, 1);
992        if self.cols == 0 {
993            self.cols = self.data.len();
994        }
995    }
996
997    /// Add a new column to the grid.
998    ///
999    /// # Examples
1000    ///
1001    /// ```
1002    /// use grid::*;
1003    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
1004    /// let col = vec![4,6];
1005    /// grid.push_col(col);
1006    /// assert_eq!(grid.cols(), 4);
1007    /// assert_eq!(grid[(0, 3)], 4);
1008    /// assert_eq!(grid[(1, 3)], 6);
1009    /// ```
1010    ///
1011    /// Can also be used to init an empty grid:
1012    ///
1013    /// ```
1014    /// use grid::*;
1015    /// let mut grid: Grid<u8> = grid![];
1016    /// let col = vec![1,2,3];
1017    /// grid.push_col(col);
1018    /// assert_eq!(grid.size(), (3, 1));
1019    /// ```
1020    ///
1021    /// # Performance
1022    ///
1023    /// This method will be significantly slower if the grid uses a row-major memory layout,
1024    /// which is the default.
1025    ///
1026    /// # Panics
1027    ///
1028    /// Panics if:
1029    ///  - the grid is not empty and `col.len() != grid.rows()`
1030    ///  - `col.len() == 0`
1031    pub fn push_col(&mut self, col: Vec<T>) {
1032        assert_ne!(col.len(), 0);
1033        assert!(
1034            !(self.cols > 0 && col.len() != self.rows),
1035            "pushed column does not match. Length must be {:?}, but was {:?}.",
1036            self.rows,
1037            col.len()
1038        );
1039        self.data.extend(col);
1040        if self.order == Order::RowMajor {
1041            for i in (1..self.rows).rev() {
1042                let row_idx = i * self.cols;
1043                self.data[row_idx..row_idx + self.cols + i].rotate_right(i);
1044            }
1045        }
1046        self.cols = Self::safe_add(self.cols, 1);
1047        if self.rows == 0 {
1048            self.rows = self.data.len();
1049        }
1050    }
1051
1052    /// Removes the last row from a grid and returns it, or None if it is empty.
1053    ///
1054    /// # Examples
1055    /// ```
1056    /// use grid::*;
1057    /// let mut grid = grid![[1,2,3][4,5,6]];
1058    /// assert_eq![grid.pop_row(), Some(vec![4,5,6])];
1059    /// assert_eq![grid.pop_row(), Some(vec![1,2,3])];
1060    /// assert_eq![grid.pop_row(), None];
1061    /// ```
1062    ///
1063    /// # Performance
1064    ///
1065    /// This method will be significantly slower if the grid uses a column-major memory layout.
1066    pub fn pop_row(&mut self) -> Option<Vec<T>> {
1067        if self.rows == 0 {
1068            return None;
1069        }
1070        if self.order == Order::ColumnMajor {
1071            for i in 1..self.cols {
1072                let col_idx = i * (self.rows - 1);
1073                self.data[col_idx..col_idx + self.rows + i - 1].rotate_left(i);
1074            }
1075        }
1076        let row = self.data.split_off(self.data.len() - self.cols);
1077        self.rows -= 1;
1078        if self.rows == 0 {
1079            self.cols = 0;
1080        }
1081        Some(row)
1082    }
1083
1084    /// Remove a Row at the index and return a vector of it.
1085    ///
1086    /// # Examples
1087    /// ```
1088    /// use grid::*;
1089    /// let mut grid = grid![[1,2][3,4][5,6]];
1090    /// assert_eq![grid.remove_row(1), Some(vec![3,4])];   
1091    /// assert_eq![grid.remove_row(0), Some(vec![1,2])];
1092    /// assert_eq![grid.remove_row(0), Some(vec![5,6])];
1093    /// assert_eq![grid.remove_row(0), None];
1094    /// ```
1095    ///
1096    /// # Performance
1097    ///
1098    /// This method will be significantly slower if the grid uses a column-major memory layout.
1099    pub fn remove_row(&mut self, row_index: usize) -> Option<Vec<T>> {
1100        if self.cols == 0 || self.rows == 0 || row_index >= self.rows {
1101            return None;
1102        }
1103        let row = match self.order {
1104            Order::RowMajor => self
1105                .data
1106                .drain((row_index * self.cols)..((row_index + 1) * self.cols))
1107                .collect(),
1108            Order::ColumnMajor => {
1109                for i in 0..self.cols {
1110                    let col_idx = row_index + i * (self.rows - 1);
1111                    let end = cmp::min(col_idx + self.rows + i, self.data.len());
1112                    self.data[col_idx..end].rotate_left(i + 1);
1113                }
1114                self.data.split_off(self.data.len() - self.cols)
1115            }
1116        };
1117        self.rows -= 1;
1118        if self.rows == 0 {
1119            self.cols = 0;
1120        }
1121        Some(row)
1122    }
1123
1124    /// Removes the last column from a grid and returns it, or None if it is empty.
1125    ///
1126    /// Note that this operation is much slower than the `pop_row()` because the memory layout
1127    /// of `Grid` is row-major and removing a column requires a lot of move operations.
1128    ///
1129    /// # Examples
1130    /// ```
1131    /// use grid::*;
1132    /// let mut grid = grid![[1,2,3][4,5,6]];
1133    /// assert_eq![grid.pop_col(), Some(vec![3,6])];
1134    /// assert_eq![grid.pop_col(), Some(vec![2,5])];
1135    /// assert_eq![grid.pop_col(), Some(vec![1,4])];
1136    /// assert_eq![grid.pop_col(), None];
1137    /// ```
1138    ///
1139    /// # Performance
1140    ///
1141    /// This method will be significantly slower if the grid uses a row-major memory layout,
1142    /// which is the default.
1143    pub fn pop_col(&mut self) -> Option<Vec<T>> {
1144        if self.cols == 0 {
1145            return None;
1146        }
1147        if self.order == Order::RowMajor {
1148            for i in 1..self.rows {
1149                let row_idx = i * (self.cols - 1);
1150                self.data[row_idx..row_idx + self.cols + i - 1].rotate_left(i);
1151            }
1152        }
1153        let col = self.data.split_off(self.data.len() - self.rows);
1154        self.cols -= 1;
1155        if self.cols == 0 {
1156            self.rows = 0;
1157        }
1158        Some(col)
1159    }
1160
1161    /// Remove a column at the index and return a vector of it.
1162    ///
1163    /// # Examples
1164    /// ```
1165    /// use grid::*;
1166    /// let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
1167    /// assert_eq![grid.remove_col(3), Some(vec![4,8,12,16])];
1168    /// assert_eq![grid.remove_col(0), Some(vec![1,5,9,13])];
1169    /// assert_eq![grid.remove_col(1), Some(vec![3,7,11,15])];
1170    /// assert_eq![grid.remove_col(0), Some(vec![2,6,10,14])];
1171    /// assert_eq![grid.remove_col(0), None];
1172    /// ```
1173    ///
1174    /// # Performance
1175    ///
1176    /// This method will be significantly slower if the grid uses a row-major memory layout,
1177    /// which is the default.
1178    pub fn remove_col(&mut self, col_index: usize) -> Option<Vec<T>> {
1179        if self.cols == 0 || self.rows == 0 || col_index >= self.cols {
1180            return None;
1181        }
1182        let col = match self.order {
1183            Order::RowMajor => {
1184                for i in 0..self.rows {
1185                    let row_idx = col_index + i * (self.cols - 1);
1186                    let end = cmp::min(row_idx + self.cols + i, self.data.len());
1187                    self.data[row_idx..end].rotate_left(i + 1);
1188                }
1189                self.data.split_off(self.data.len() - self.rows)
1190            }
1191            Order::ColumnMajor => self
1192                .data
1193                .drain((col_index * self.rows)..((col_index + 1) * self.rows))
1194                .collect(),
1195        };
1196        self.cols -= 1;
1197        if self.cols == 0 {
1198            self.rows = 0;
1199        }
1200        Some(col)
1201    }
1202
1203    /// Delete a row at the index without returning it, avoiding allocation.
1204    ///
1205    /// This method is more efficient than [`remove_row`](Grid::remove_row) when you don't need
1206    /// the removed elements, as it avoids allocating a `Vec<T>` to hold them.
1207    ///
1208    /// # Examples
1209    /// ```
1210    /// use grid::*;
1211    /// let mut grid = grid![[1,2][3,4][5,6]];
1212    /// assert!(grid.delete_row(1));
1213    /// assert_eq!(grid, grid![[1,2][5,6]]);
1214    /// assert!(grid.delete_row(0));
1215    /// assert_eq!(grid, grid![[5,6]]);
1216    /// assert!(grid.delete_row(0));
1217    /// assert!(grid.is_empty());
1218    /// assert!(!grid.delete_row(0));
1219    /// ```
1220    ///
1221    /// # Performance
1222    ///
1223    /// This method will be significantly slower if the grid uses a column-major memory layout.
1224    ///
1225    /// # Returns
1226    ///
1227    /// Returns `true` if the row was successfully deleted, `false` if the index was out of bounds.
1228    pub fn delete_row(&mut self, row_index: usize) -> bool {
1229        if self.cols == 0 || self.rows == 0 || row_index >= self.rows {
1230            return false;
1231        }
1232        match self.order {
1233            Order::RowMajor => {
1234                let start = row_index * self.cols;
1235                let end = (row_index + 1) * self.cols;
1236                self.data.drain(start..end);
1237            }
1238            Order::ColumnMajor => {
1239                for i in 0..self.cols {
1240                    let col_idx = row_index + i * (self.rows - 1);
1241                    let end = cmp::min(col_idx + self.rows + i, self.data.len());
1242                    self.data[col_idx..end].rotate_left(i + 1);
1243                }
1244                self.data.truncate(self.data.len() - self.cols);
1245            }
1246        }
1247        self.rows -= 1;
1248        if self.rows == 0 {
1249            self.cols = 0;
1250        }
1251        true
1252    }
1253
1254    /// Delete a column at the index without returning it, avoiding allocation.
1255    ///
1256    /// This method is more efficient than [`remove_col`](Grid::remove_col) when you don't need
1257    /// the removed elements, as it avoids allocating a `Vec<T>` to hold them.
1258    ///
1259    /// # Examples
1260    /// ```
1261    /// use grid::*;
1262    /// let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
1263    /// assert!(grid.delete_col(3));
1264    /// assert_eq!(grid, grid![[1,2,3][5,6,7][9,10,11][13,14,15]]);
1265    /// assert!(grid.delete_col(0));
1266    /// assert_eq!(grid, grid![[2,3][6,7][10,11][14,15]]);
1267    /// ```
1268    ///
1269    /// # Performance
1270    ///
1271    /// This method will be significantly slower if the grid uses a row-major memory layout,
1272    /// which is the default.
1273    ///
1274    /// # Returns
1275    ///
1276    /// Returns `true` if the column was successfully deleted, `false` if the index was out of bounds.
1277    pub fn delete_col(&mut self, col_index: usize) -> bool {
1278        if self.cols == 0 || self.rows == 0 || col_index >= self.cols {
1279            return false;
1280        }
1281        match self.order {
1282            Order::RowMajor => {
1283                for i in 0..self.rows {
1284                    let row_idx = col_index + i * (self.cols - 1);
1285                    let end = cmp::min(row_idx + self.cols + i, self.data.len());
1286                    self.data[row_idx..end].rotate_left(i + 1);
1287                }
1288                self.data.truncate(self.data.len() - self.rows);
1289            }
1290            Order::ColumnMajor => {
1291                let start = col_index * self.rows;
1292                let end = (col_index + 1) * self.rows;
1293                self.data.drain(start..end);
1294            }
1295        }
1296        self.cols -= 1;
1297        if self.cols == 0 {
1298            self.rows = 0;
1299        }
1300        true
1301    }
1302
1303    /// Insert a new row at the index and shifts all rows after down.
1304    ///
1305    /// # Examples
1306    /// ```
1307    /// use grid::*;
1308    /// let mut grid = grid![[1,2,3][4,5,6]];
1309    /// grid.insert_row(1, vec![7,8,9]);
1310    /// assert_eq!(grid, grid![[1,2,3][7,8,9][4,5,6]]);
1311    /// ```
1312    ///
1313    /// # Performance
1314    ///
1315    /// This method will be significantly slower if the grid uses a column-major memory layout.
1316    ///
1317    /// # Panics
1318    ///
1319    /// Panics if:
1320    /// - the grid is not empty and `row.len() != grid.cols()`.
1321    /// - the index is greater than the number of rows
1322    /// - inserted row is empty
1323    pub fn insert_row(&mut self, index: usize, row: Vec<T>) {
1324        let input_len = row.len();
1325        assert_ne!(input_len, 0, "Inserted row must not be empty.");
1326        assert!(
1327            !(self.cols > 0 && input_len != self.cols),
1328            "Inserted row must be of length {}, but was {}.",
1329            self.cols,
1330            row.len()
1331        );
1332        assert!(
1333            index <= self.rows,
1334            "Out of range. Index was {}, but must be less or equal to {}.",
1335            index,
1336            self.rows
1337        );
1338        match self.order {
1339            Order::RowMajor => {
1340                let data_idx = index * input_len;
1341                self.data.splice(data_idx..data_idx, row);
1342            }
1343            Order::ColumnMajor => {
1344                for (col_iter, row_val) in row.into_iter().enumerate() {
1345                    let data_idx = col_iter * self.rows + index + col_iter;
1346                    self.data.insert(data_idx, row_val);
1347                }
1348            }
1349        }
1350        self.cols = input_len;
1351        self.rows = Self::safe_add(self.rows, 1);
1352    }
1353
1354    /// Insert a new column at the index.
1355    ///
1356    /// Important! Insertion of columns is a lot slower than the lines insertion.
1357    /// This is because of the memory layout of the grid data structure.
1358    ///
1359    /// # Examples
1360    /// ```
1361    /// use grid::*;
1362    /// let mut grid = grid![[1,2,3][4,5,6]];
1363    /// grid.insert_col(1, vec![9,9]);
1364    /// assert_eq!(grid, grid![[1,9,2,3][4,9,5,6]])
1365    /// ```
1366    ///
1367    /// # Performance
1368    ///
1369    /// This method will be significantly slower if the grid uses a row-major memory layout,
1370    /// which is the default.
1371    ///
1372    /// # Panics
1373    ///
1374    /// Panics if:
1375    /// - the grid is not empty and `col.len() != grid.rows()`.
1376    /// - the index is greater than the number of columns
1377    /// - inserted row is empty
1378    pub fn insert_col(&mut self, index: usize, col: Vec<T>) {
1379        let input_len = col.len();
1380        assert_ne!(input_len, 0, "Inserted col must not be empty.");
1381        assert!(
1382            !(self.rows > 0 && input_len != self.rows),
1383            "Inserted col must be of length {}, but was {}.",
1384            self.rows,
1385            col.len()
1386        );
1387        assert!(
1388            index <= self.cols,
1389            "Out of range. Index was {}, but must be less or equal to {}.",
1390            index,
1391            self.cols
1392        );
1393        match self.order {
1394            Order::RowMajor => {
1395                for (row_iter, col_val) in col.into_iter().enumerate() {
1396                    let data_idx = row_iter * self.cols + index + row_iter;
1397                    self.data.insert(data_idx, col_val);
1398                }
1399            }
1400            Order::ColumnMajor => {
1401                let data_idx = index * input_len;
1402                self.data.splice(data_idx..data_idx, col);
1403            }
1404        }
1405        self.rows = input_len;
1406        self.cols = Self::safe_add(self.cols, 1);
1407    }
1408
1409    /// Returns a reference to the internal data structure of the grid.
1410    ///
1411    /// The order of the elements depends on the internal memory layout, which is
1412    /// row-major by default.
1413    ///
1414    /// # Examples
1415    /// ```
1416    /// use grid::*;
1417    /// let grid = grid![[1,2,3][4,5,6]];
1418    /// let flat = grid.flatten();
1419    /// assert_eq!(flat, &vec![1,2,3,4,5,6]);
1420    /// ```
1421    #[must_use]
1422    pub const fn flatten(&self) -> &Vec<T> {
1423        &self.data
1424    }
1425
1426    /// Converts self into a vector without clones or allocation.
1427    ///
1428    /// The order of the elements depends on the internal memory layout, which is
1429    /// row-major by default.
1430    #[must_use]
1431    pub fn into_vec(self) -> Vec<T> {
1432        self.data
1433    }
1434
1435    /// Transpose the grid so that columns become rows in new grid.
1436    ///
1437    /// This method changes the internal memory layout.
1438    pub fn transpose(&mut self) {
1439        self.order = self.order.counterpart();
1440        core::mem::swap(&mut self.rows, &mut self.cols);
1441    }
1442
1443    /// Flip (or mirrors) the columns.
1444    ///
1445    /// # Examples
1446    ///
1447    /// ```
1448    /// use grid::*;
1449    /// let mut grid = grid![[1,2,3][4,5,6]];
1450    /// grid.flip_cols();
1451    /// assert_eq!(grid, grid![[3,2,1][6,5,4]])
1452    /// ```
1453    ///
1454    /// # Performance
1455    ///
1456    /// This method will be significantly slower if the grid uses a column-major memory layout.
1457    pub fn flip_cols(&mut self) {
1458        match self.order {
1459            Order::RowMajor => {
1460                for row in 0..self.rows {
1461                    let idx = row * self.cols;
1462                    self.data[idx..idx + self.cols].reverse();
1463                }
1464            }
1465            Order::ColumnMajor => {
1466                for col in 0..self.cols / 2 {
1467                    for row in 0..self.rows {
1468                        let cell1 = self.get_index(row, col);
1469                        let cell2 = self.get_index(row, self.cols - col - 1);
1470                        self.data.swap(cell1, cell2);
1471                    }
1472                }
1473            }
1474        }
1475    }
1476
1477    /// Flip (or mirrors) the rows.
1478    ///
1479    /// # Examples
1480    ///
1481    /// ```
1482    /// use grid::*;
1483    /// let mut grid = grid![[1,2,3][4,5,6]];
1484    /// grid.flip_rows();
1485    /// assert_eq!(grid, grid![[4,5,6][1,2,3]])
1486    /// ```
1487    ///
1488    /// # Performance
1489    ///
1490    /// This method will be significantly slower if the grid uses a row-major memory layout,
1491    /// which is the default.
1492    pub fn flip_rows(&mut self) {
1493        match self.order {
1494            Order::RowMajor => {
1495                for row in 0..self.rows / 2 {
1496                    for col in 0..self.cols {
1497                        let cell1 = self.get_index(row, col);
1498                        let cell2 = self.get_index(self.rows - row - 1, col);
1499                        self.data.swap(cell1, cell2);
1500                    }
1501                }
1502            }
1503            Order::ColumnMajor => {
1504                for col in 0..self.cols {
1505                    let idx = col * self.rows;
1506                    self.data[idx..idx + self.rows].reverse();
1507                }
1508            }
1509        }
1510    }
1511
1512    /// Rotate the grid 90° counter-clockwise.
1513    ///
1514    /// This method changes the internal memory layout.
1515    ///
1516    /// # Examples
1517    ///
1518    /// ```
1519    /// use grid::*;
1520    /// let mut grid = grid![[1,2][3,4]];
1521    /// grid.rotate_left();
1522    /// assert_eq!(grid, grid![[2,4][1,3]]);
1523    /// ```
1524    ///
1525    /// # Performance
1526    ///
1527    /// This method will be significantly slower if the grid initialy uses a column-major memory layout,
1528    /// which is the default.
1529    pub fn rotate_left(&mut self) {
1530        self.transpose();
1531        self.flip_rows();
1532    }
1533
1534    /// Rotate the grid 90° clockwise.
1535    ///
1536    /// This method changes the internal memory layout.
1537    ///
1538    /// # Examples
1539    ///
1540    /// ```
1541    /// use grid::*;
1542    /// let mut grid = grid![[1,2][3,4]];
1543    /// grid.rotate_right();
1544    /// assert_eq!(grid, grid![[3,1][4,2]]);
1545    /// ```
1546    ///
1547    /// # Performance
1548    ///
1549    /// This method will be significantly slower if the grid initialy uses a row-major memory layout,
1550    /// which is the default.
1551    pub fn rotate_right(&mut self) {
1552        self.transpose();
1553        self.flip_cols();
1554    }
1555
1556    /// Rotate the grid 180°.
1557    ///
1558    /// This method **doesn't** change the internal memory layout.
1559    ///
1560    /// # Examples
1561    ///
1562    /// ```
1563    /// use grid::*;
1564    /// let mut grid = grid![[1,2,3][4,5,6]];
1565    /// grid.rotate_half();
1566    /// assert_eq!(grid, grid![[6,5,4][3,2,1]]);
1567    /// ```
1568    ///
1569    /// # Performance
1570    ///
1571    /// The performances of this method is not affected by the internal memory layout.
1572    pub fn rotate_half(&mut self) {
1573        self.data.reverse();
1574    }
1575
1576    /// Fills the grid with elements by cloning `value`.
1577    ///
1578    /// # Examples
1579    ///
1580    /// ```
1581    /// use grid::*;
1582    /// let mut grid = grid![[1,2,3][4,5,6]];
1583    /// grid.fill(7);
1584    /// assert_eq!(grid, grid![[7,7,7][7,7,7]]);
1585    /// ```
1586    pub fn fill(&mut self, value: T)
1587    where
1588        T: Clone,
1589    {
1590        self.data.fill(value);
1591    }
1592
1593    /// Fills the grid with elements returned by calling a closure repeatedly.
1594    ///
1595    /// This method uses a closure to create new values. If you'd rather
1596    /// [`Clone`] a given value, use [`fill`]. If you want to use the [`Default`]
1597    /// trait to generate values, you can pass [`Default::default`] as the
1598    /// argument.
1599    ///
1600    /// [`fill`]: Grid::fill
1601    ///
1602    /// # Examples
1603    ///
1604    /// ```
1605    /// use grid::*;
1606    /// let mut grid = grid![[1,2,3][4,5,6]];
1607    /// grid.fill_with(Default::default);
1608    /// assert_eq!(grid, grid![[0,0,0][0,0,0]]);
1609    /// ```
1610    pub fn fill_with<F>(&mut self, f: F)
1611    where
1612        F: FnMut() -> T,
1613    {
1614        self.data.fill_with(f);
1615    }
1616
1617    /// Returns a new grid with the same dimensions, but with each element transformed by the closure.
1618    ///
1619    /// # Examples
1620    ///
1621    /// ```
1622    /// use grid::*;
1623    /// let grid = grid![[1,2][3,4]];
1624    /// let new_grid = grid.map(|x| x * 2);
1625    /// assert_eq!(new_grid, grid![[2,4][6,8]]);
1626    ///
1627    /// let grid = grid![[1,2][3,4]];
1628    /// let new_grid = grid.map(|x| x > 2);
1629    /// assert_eq!(new_grid, grid![[false,false][true,true]]);
1630    /// ```
1631    pub fn map<U, F>(self, f: F) -> Grid<U>
1632    where
1633        F: FnMut(T) -> U,
1634    {
1635        Grid {
1636            data: self.data.into_iter().map(f).collect(),
1637            cols: self.cols,
1638            rows: self.rows,
1639            order: self.order,
1640        }
1641    }
1642
1643    /// Returns a new grid with the same dimensions, but with each element
1644    /// transformed by the closure. Does not consume the grid.
1645    ///
1646    /// # Examples
1647    ///
1648    /// ```
1649    /// use grid::*;
1650    /// let grid = grid![[1,2][3,4]];
1651    /// let new_grid = grid.map(|x| x * 2);
1652    /// assert_eq!(new_grid, grid![[2,4][6,8]]);
1653    ///
1654    /// let grid = grid![[1,2][3,4]];
1655    /// let new_grid = grid.map(|x| x > 2);
1656    /// assert_eq!(new_grid, grid![[false,false][true,true]]);
1657    /// ```
1658    #[must_use]
1659    pub fn map_ref<U, F>(&self, f: F) -> Grid<U>
1660    where
1661        F: Fn(&T) -> U,
1662    {
1663        Grid {
1664            data: self.data.iter().map(f).collect(),
1665            cols: self.cols,
1666            rows: self.rows,
1667            order: self.order,
1668        }
1669    }
1670
1671    /// Iterate over the rows of the grid. Each time an iterator over a single
1672    /// row is returned.
1673    ///
1674    /// An item in this iterator is equal to a call to `Grid.iter_row(row_index)`
1675    /// of the corresponding row.
1676    ///
1677    /// # Examples
1678    ///
1679    /// ```
1680    /// use grid::*;
1681    /// let mut grid = grid![[1,2,3][4,5,6]];
1682    /// let sum_by_row: Vec<u8> = grid.iter_rows().map(|row| row.sum()).collect();
1683    /// assert_eq!(sum_by_row, vec![1+2+3, 4+5+6])
1684    /// ```
1685    #[must_use]
1686    pub const fn iter_rows(&self) -> GridRowIter<'_, T> {
1687        GridRowIter {
1688            grid: self,
1689            row_start_index: 0,
1690            row_end_index: self.rows,
1691        }
1692    }
1693
1694    /// Iterate over the columns of the grid. Each time an iterator over a single
1695    /// column is returned.
1696    ///
1697    /// An item in this iterator is equal to a call to `Grid.iter_col(col_index)`
1698    /// of the corresponding column.
1699    ///
1700    /// # Examples
1701    ///
1702    /// ```
1703    /// use grid::*;
1704    /// let mut grid = grid![[1,2,3][4,5,6]];
1705    /// let sum_by_col: Vec<u8> = grid.iter_cols().map(|col| col.sum()).collect();
1706    /// assert_eq!(sum_by_col, vec![1+4, 2+5, 3+6])
1707    /// ```
1708    #[must_use]
1709    pub const fn iter_cols(&self) -> GridColIter<'_, T> {
1710        GridColIter {
1711            grid: self,
1712            col_start_index: 0,
1713            col_end_index: self.cols,
1714        }
1715    }
1716
1717    /// Swaps two elements in the Grid.
1718    /// Similar to `Vec::swap()`.
1719    ///
1720    /// # Panics
1721    ///
1722    /// Panics if either index is out of bounds.
1723    pub fn swap(&mut self, (row_a, col_a): (usize, usize), (row_b, col_b): (usize, usize)) {
1724        assert!(
1725            !(row_a >= self.rows || col_a >= self.cols),
1726            "grid index out of bounds: ({row_a},{col_a}) out of ({},{})",
1727            self.rows,
1728            self.cols
1729        );
1730        assert!(
1731            !(row_b >= self.rows || col_b >= self.cols),
1732            "grid index out of bounds: ({row_b},{col_b}) out of ({},{})",
1733            self.rows,
1734            self.cols
1735        );
1736
1737        let a_idx = self.get_index(row_a, col_a);
1738        let b_idx = self.get_index(row_b, col_b);
1739
1740        self.data.swap(a_idx, b_idx);
1741    }
1742}
1743
1744impl<T: Default> Grid<T> {
1745    /// Expands the grid with the given amount of rows filling the new rows with `T::default()`.
1746    /// If the grid has no rows or no columns, nothing will happen.
1747    ///
1748    /// # Examples
1749    ///
1750    /// ```
1751    /// use grid::*;
1752    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
1753    /// grid.expand_rows(2);
1754    /// assert_eq!(grid.rows(), 4);
1755    /// assert_eq!(grid[(2, 0)], 0);
1756    /// assert_eq!(grid[(2, 1)], 0);
1757    /// assert_eq!(grid[(2, 2)], 0);
1758    /// assert_eq!(grid[(3, 0)], 0);
1759    /// assert_eq!(grid[(3, 1)], 0);
1760    /// assert_eq!(grid[(3, 2)], 0);
1761    /// ```
1762    ///
1763    /// # Performance
1764    ///
1765    /// This method will be significantly slower if the grid uses a column-major memory layout.
1766    pub fn expand_rows(&mut self, rows: usize) {
1767        if rows > 0 && self.cols > 0 {
1768            let new_rows = Self::safe_add(self.rows, rows);
1769            let new_len = Self::safe_multiply(new_rows, self.cols);
1770            self.data.resize_with(new_len, T::default);
1771
1772            if self.order == Order::ColumnMajor {
1773                for row_added in 0..rows {
1774                    for i in (1..self.cols).rev() {
1775                        let total_rows = self.rows + row_added;
1776                        let col_idx = i * total_rows;
1777                        self.data[col_idx..col_idx + total_rows + i].rotate_right(i);
1778                    }
1779                }
1780            }
1781            self.rows = new_rows;
1782        }
1783    }
1784
1785    /// Expands the grid with the given amount of cols filling the new cols with `T::default()`.
1786    /// If the grid has no rows or no columns, nothing will happen.
1787    ///
1788    /// # Examples
1789    ///
1790    /// ```
1791    /// use grid::*;
1792    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
1793    /// grid.expand_cols(2);
1794    /// assert_eq!(grid.cols(), 5);
1795    /// assert_eq!(grid[(0, 3)], 0);
1796    /// assert_eq!(grid[(0, 4)], 0);
1797    /// assert_eq!(grid[(1, 3)], 0);
1798    /// assert_eq!(grid[(1, 4)], 0);
1799    /// ```
1800    ///
1801    /// # Performance
1802    ///
1803    /// This method will be significantly slower if the grid uses a row-major memory layout.
1804    pub fn expand_cols(&mut self, cols: usize) {
1805        if cols > 0 && self.rows > 0 {
1806            let new_cols = Self::safe_add(self.cols, cols);
1807            let new_len = Self::safe_multiply(self.rows, new_cols);
1808            self.data.resize_with(new_len, T::default);
1809
1810            if self.order == Order::RowMajor {
1811                for col_added in 0..cols {
1812                    for i in (1..self.rows).rev() {
1813                        let total_cols = self.cols + col_added;
1814                        let row_idx = i * total_cols;
1815                        self.data[row_idx..row_idx + total_cols + i].rotate_right(i);
1816                    }
1817                }
1818            }
1819            self.cols = new_cols;
1820        }
1821    }
1822
1823    /// Expands the grid by inserting a given amount of rows at the beginning, filling the new rows with `T::default()`.
1824    /// If the grid has no rows or no columns, nothing will happen.
1825    ///
1826    /// # Examples
1827    ///
1828    /// ```
1829    /// use grid::*;
1830    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
1831    /// grid.prepend_rows(2);
1832    /// assert_eq!(grid.rows(), 4);
1833    /// assert_eq!(grid[(0, 0)], 0);
1834    /// assert_eq!(grid[(0, 1)], 0);
1835    /// assert_eq!(grid[(0, 2)], 0);
1836    /// assert_eq!(grid[(1, 0)], 0);
1837    /// assert_eq!(grid[(1, 1)], 0);
1838    /// assert_eq!(grid[(1, 2)], 0);
1839    /// ```
1840    ///
1841    /// # Performance
1842    ///
1843    /// This method will be significantly slower if the grid uses a column-major memory layout.
1844    pub fn prepend_rows(&mut self, rows: usize) {
1845        if rows > 0 && self.cols > 0 {
1846            let new_rows = Self::safe_add(self.rows, rows);
1847            let new_len = Self::safe_multiply(new_rows, self.cols);
1848            self.data.resize_with(new_len, T::default);
1849
1850            match self.order {
1851                Order::RowMajor => {
1852                    for i in (0..self.rows).rev() {
1853                        let s = i * self.cols;
1854                        let e = (i + rows + 1) * self.cols;
1855                        self.data[s..e].rotate_left(self.cols);
1856                    }
1857                }
1858                Order::ColumnMajor => {
1859                    for row_added in 0..rows {
1860                        for i in (0..self.cols).rev() {
1861                            let total_rows = self.rows + row_added;
1862                            let col_idx = i * total_rows;
1863                            self.data[col_idx..=col_idx + total_rows + i].rotate_right(i + 1);
1864                        }
1865                    }
1866                }
1867            }
1868            self.rows = new_rows;
1869        }
1870    }
1871
1872    /// Expands the grid by inserting a given amount of columns at the beginning, filling the new columns with `T::default()`.
1873    /// If the grid has no rows or no columns, nothing will happen.
1874    ///
1875    /// # Examples
1876    ///
1877    /// ```
1878    /// use grid::*;
1879    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
1880    /// grid.prepend_cols(2);
1881    /// assert_eq!(grid.cols(), 5);
1882    /// assert_eq!(grid[(0, 0)], 0);
1883    /// assert_eq!(grid[(0, 1)], 0);
1884    /// assert_eq!(grid[(1, 0)], 0);
1885    /// assert_eq!(grid[(1, 1)], 0);
1886    /// ```
1887    ///
1888    /// # Performance
1889    ///
1890    /// This method will be significantly slower if the grid uses a row-major memory layout.
1891    pub fn prepend_cols(&mut self, cols: usize) {
1892        if cols > 0 && self.rows > 0 {
1893            let new_cols = Self::safe_add(self.cols, cols);
1894            let new_len = Self::safe_multiply(self.rows, new_cols);
1895            self.data.resize_with(new_len, T::default);
1896
1897            match self.order {
1898                Order::RowMajor => {
1899                    for col_added in 0..cols {
1900                        for i in (0..self.rows).rev() {
1901                            let total_cols = self.cols + col_added;
1902                            let row_idx = i * total_cols;
1903                            self.data[row_idx..=row_idx + total_cols + i].rotate_right(i + 1);
1904                        }
1905                    }
1906                }
1907                Order::ColumnMajor => {
1908                    for i in (0..self.cols).rev() {
1909                        let s = i * self.rows;
1910                        let e = (i + cols + 1) * self.rows;
1911                        self.data[s..e].rotate_left(self.rows);
1912                    }
1913                }
1914            }
1915            self.cols = new_cols;
1916        }
1917    }
1918}
1919
1920impl<T> Default for Grid<T> {
1921    fn default() -> Self {
1922        Self {
1923            data: Vec::default(),
1924            cols: 0,
1925            rows: 0,
1926            order: Order::default(),
1927        }
1928    }
1929}
1930
1931impl<T: Clone> Clone for Grid<T> {
1932    fn clone(&self) -> Self {
1933        Self {
1934            rows: self.rows,
1935            cols: self.cols,
1936            data: self.data.clone(),
1937            order: self.order,
1938        }
1939    }
1940}
1941
1942impl<T: hash::Hash> hash::Hash for Grid<T> {
1943    #[inline]
1944    fn hash<H: hash::Hasher>(&self, state: &mut H) {
1945        self.rows.hash(state);
1946        self.cols.hash(state);
1947        self.order.hash(state);
1948        self.data.hash(state);
1949    }
1950}
1951
1952impl<T> Index<(usize, usize)> for Grid<T> {
1953    type Output = T;
1954
1955    #[inline]
1956    fn index(&self, (row, col): (usize, usize)) -> &T {
1957        assert!(
1958            !(row >= self.rows || col >= self.cols),
1959            "grid index out of bounds: ({row},{col}) out of ({},{})",
1960            self.rows,
1961            self.cols
1962        );
1963        let index = self.get_index(row, col);
1964        &self.data[index]
1965    }
1966}
1967
1968impl<T> IndexMut<(usize, usize)> for Grid<T> {
1969    #[inline]
1970    fn index_mut(&mut self, (row, col): (usize, usize)) -> &mut T {
1971        assert!(
1972            !(row >= self.rows || col >= self.cols),
1973            "grid index out of bounds: ({row},{col}) out of ({},{})",
1974            self.rows,
1975            self.cols
1976        );
1977        let index = self.get_index(row, col);
1978        &mut self.data[index]
1979    }
1980}
1981
1982impl<T> IntoIterator for Grid<T> {
1983    type IntoIter = <Vec<T> as IntoIterator>::IntoIter;
1984    type Item = T;
1985
1986    fn into_iter(self) -> Self::IntoIter {
1987        self.data.into_iter()
1988    }
1989}
1990
1991impl<'a, T> IntoIterator for &'a Grid<T> {
1992    type IntoIter = core::slice::Iter<'a, T>;
1993    type Item = &'a T;
1994
1995    fn into_iter(self) -> Self::IntoIter {
1996        self.iter()
1997    }
1998}
1999
2000impl<'a, T> IntoIterator for &'a mut Grid<T> {
2001    type IntoIter = core::slice::IterMut<'a, T>;
2002    type Item = &'a mut T;
2003
2004    fn into_iter(self) -> Self::IntoIter {
2005        self.iter_mut()
2006    }
2007}
2008
2009impl<T: fmt::Debug> fmt::Debug for Grid<T> {
2010    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
2011        write!(f, "[")?;
2012        if self.cols > 0 {
2013            if f.alternate() {
2014                writeln!(f)?;
2015                /*
2016                    WARNING
2017
2018                    Compound types becoming enormous as the entire `fmt::Debug` width is applied to each item individually.
2019                    For tuples and structs define padding and precision arguments manually to improve readability.
2020                */
2021                let width = f.width().unwrap_or_else(|| {
2022                    // Conditionally calculate the longest item by default.
2023                    self.data
2024                        .iter()
2025                        .map(|i| format!("{i:?}").len())
2026                        .max()
2027                        .unwrap()
2028                });
2029                let precision = f.precision().unwrap_or(2);
2030                for mut row in self.iter_rows().map(Iterator::peekable) {
2031                    write!(f, "    [")?;
2032                    while let Some(item) = row.next() {
2033                        write!(f, " {item:width$.precision$?}")?;
2034                        if row.peek().is_some() {
2035                            write!(f, ",")?;
2036                        }
2037                    }
2038                    writeln!(f, "]")?;
2039                }
2040            } else {
2041                for row in self.iter_rows() {
2042                    f.debug_list().entries(row).finish()?;
2043                }
2044            }
2045        }
2046        write!(f, "]")
2047    }
2048}
2049
2050impl<T: PartialEq> PartialEq for Grid<T> {
2051    fn eq(&self, other: &Self) -> bool {
2052        if self.rows != other.rows || self.cols != other.cols {
2053            return false;
2054        }
2055        if self.order == other.order {
2056            return self.data == other.data;
2057        }
2058        for (self_row, other_row) in core::iter::zip(self.iter_rows(), other.iter_rows()) {
2059            if self_row.ne(other_row) {
2060                return false;
2061            }
2062        }
2063        true
2064    }
2065}
2066
2067impl<T: Eq> Eq for Grid<T> {}
2068
2069impl<T> From<Vec<Vec<T>>> for Grid<T> {
2070    #[allow(clippy::redundant_closure_for_method_calls)]
2071    fn from(vec: Vec<Vec<T>>) -> Self {
2072        let cols = vec.first().map_or(0, |row| row.len());
2073        Self::from_vec_with_order(vec.into_iter().flatten().collect(), cols, Order::default())
2074    }
2075}
2076
2077impl<T: Clone> From<&Vec<Vec<T>>> for Grid<T> {
2078    #[allow(clippy::redundant_closure_for_method_calls)]
2079    fn from(vec: &Vec<Vec<T>>) -> Self {
2080        let cols = vec.first().map_or(0, |row| row.len());
2081        Self::from_vec_with_order(
2082            vec.clone().into_iter().flatten().collect(),
2083            cols,
2084            Order::default(),
2085        )
2086    }
2087}
2088
2089impl<T: Clone> From<&Vec<&Vec<T>>> for Grid<T> {
2090    #[allow(clippy::redundant_closure_for_method_calls)]
2091    fn from(vec: &Vec<&Vec<T>>) -> Self {
2092        let cols = vec.first().map_or(0, |row| row.len());
2093        Self::from_vec_with_order(
2094            vec.clone()
2095                .into_iter()
2096                .flat_map(|inner| inner.clone())
2097                .collect(),
2098            cols,
2099            Order::default(),
2100        )
2101    }
2102}
2103
2104impl<T> From<(Vec<T>, usize)> for Grid<T> {
2105    fn from(value: (Vec<T>, usize)) -> Self {
2106        Self::from_vec_with_order(value.0, value.1, Order::default())
2107    }
2108}
2109
2110impl<T: Clone> From<(&Vec<T>, usize)> for Grid<T> {
2111    fn from(value: (&Vec<T>, usize)) -> Self {
2112        Self::from_vec_with_order(value.0.clone(), value.1, Order::default())
2113    }
2114}
2115
2116impl<T: Clone> From<(&Vec<T>, &usize)> for Grid<T> {
2117    fn from(value: (&Vec<T>, &usize)) -> Self {
2118        Self::from_vec_with_order(value.0.clone(), *value.1, Order::default())
2119    }
2120}
2121
2122#[derive(Clone)]
2123pub struct GridRowIter<'a, T> {
2124    grid: &'a Grid<T>,
2125    row_start_index: usize,
2126    row_end_index: usize,
2127}
2128
2129#[derive(Clone)]
2130pub struct GridColIter<'a, T> {
2131    grid: &'a Grid<T>,
2132    col_start_index: usize,
2133    col_end_index: usize,
2134}
2135
2136impl<'a, T> Iterator for GridRowIter<'a, T> {
2137    type Item = StepBy<Iter<'a, T>>;
2138
2139    fn next(&mut self) -> Option<Self::Item> {
2140        if self.row_start_index >= self.row_end_index {
2141            return None;
2142        }
2143
2144        let row_iter = self.grid.iter_row(self.row_start_index);
2145        self.row_start_index += 1;
2146        Some(row_iter)
2147    }
2148
2149    fn size_hint(&self) -> (usize, Option<usize>) {
2150        let size = self.row_end_index - self.row_start_index;
2151        (size, Some(size))
2152    }
2153}
2154
2155impl<T> ExactSizeIterator for GridRowIter<'_, T> {}
2156
2157impl<T> DoubleEndedIterator for GridRowIter<'_, T> {
2158    fn next_back(&mut self) -> Option<Self::Item> {
2159        if self.row_start_index >= self.row_end_index {
2160            return None;
2161        }
2162
2163        let row_iter = self.grid.iter_row(self.row_end_index - 1);
2164        self.row_end_index -= 1;
2165        Some(row_iter)
2166    }
2167}
2168
2169impl<'a, T> Iterator for GridColIter<'a, T> {
2170    type Item = StepBy<Iter<'a, T>>;
2171
2172    fn next(&mut self) -> Option<Self::Item> {
2173        if self.col_start_index >= self.col_end_index {
2174            return None;
2175        }
2176
2177        let col_iter = self.grid.iter_col(self.col_start_index);
2178        self.col_start_index += 1;
2179        Some(col_iter)
2180    }
2181
2182    fn size_hint(&self) -> (usize, Option<usize>) {
2183        let size = self.col_end_index - self.col_start_index;
2184        (size, Some(size))
2185    }
2186}
2187
2188impl<T> ExactSizeIterator for GridColIter<'_, T> {}
2189
2190impl<T> DoubleEndedIterator for GridColIter<'_, T> {
2191    fn next_back(&mut self) -> Option<Self::Item> {
2192        if self.col_start_index >= self.col_end_index {
2193            return None;
2194        }
2195
2196        let col_iter = self.grid.iter_col(self.col_end_index - 1);
2197        self.col_end_index -= 1;
2198        Some(col_iter)
2199    }
2200}
2201
2202#[cfg(test)]
2203mod test {
2204    use super::*;
2205    #[cfg(not(feature = "std"))]
2206    use alloc::string::String;
2207
2208    fn test_grid<T>(grid: &Grid<T>, rows: usize, cols: usize, order: Order, data: &[T])
2209    where
2210        T: fmt::Debug + PartialEq,
2211    {
2212        assert_eq!(grid.rows, rows, "number of rows is unexpected");
2213        assert_eq!(grid.cols, cols, "number of cols is unexpected");
2214        assert_eq!(grid.order, order, "grid order is unexpected");
2215        assert_eq!(grid.data, data, "internal data is unexpected");
2216    }
2217
2218    #[test]
2219    fn from_1d_vec() {
2220        let grid: Grid<u8> = Grid::from((vec![1, 2, 3], 1));
2221        test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
2222    }
2223
2224    #[test]
2225    #[should_panic]
2226    #[allow(clippy::should_panic_without_expect)]
2227    fn from_1d_vec_panic() {
2228        let _: Grid<u8> = Grid::from((vec![1, 2, 3], 2));
2229    }
2230
2231    #[test]
2232    fn from_1d_vec_reference() {
2233        let vec = vec![1, 2, 3];
2234        let grid: Grid<u8> = Grid::from((&vec, 1));
2235        test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
2236    }
2237
2238    #[test]
2239    #[should_panic]
2240    #[allow(clippy::should_panic_without_expect)]
2241    fn from_1d_vec_reference_panic() {
2242        let vec = vec![1, 2, 3];
2243        let _: Grid<u8> = Grid::from((&vec, 2));
2244    }
2245
2246    #[test]
2247    fn from_1d_vec_reference_and_reference() {
2248        let vec = vec![1, 2, 3];
2249        let cols = 1;
2250        let grid: Grid<u8> = Grid::from((&vec, &cols));
2251        test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
2252    }
2253
2254    #[test]
2255    #[should_panic]
2256    #[allow(clippy::should_panic_without_expect)]
2257    fn from_1d_vec_reference_and_reference_panic() {
2258        let vec = vec![1, 2, 3];
2259        let cols = 2;
2260        let _: Grid<u8> = Grid::from((&vec, &cols));
2261    }
2262
2263    #[test]
2264    fn from_2d_vec() {
2265        let grid: Grid<u8> = Grid::from(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]);
2266        test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
2267    }
2268
2269    #[test]
2270    #[should_panic]
2271    #[allow(clippy::should_panic_without_expect)]
2272    fn from_2d_vec_panic() {
2273        let _: Grid<u8> = Grid::from(vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8]]);
2274    }
2275
2276    #[test]
2277    fn from_2d_vec_reference() {
2278        let vec = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
2279        let grid: Grid<u8> = Grid::from(&vec);
2280        test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
2281    }
2282
2283    #[test]
2284    #[should_panic]
2285    #[allow(clippy::should_panic_without_expect)]
2286    fn from_2d_vec_reference_panic() {
2287        let vec = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8]];
2288        let _: Grid<u8> = Grid::from(&vec);
2289    }
2290
2291    #[test]
2292    fn from_2d_vec_reference_of_references() {
2293        let inner_vec1 = vec![1, 2, 3];
2294        let inner_vec2 = vec![4, 5, 6];
2295        let inner_vec3 = vec![7, 8, 9];
2296        let vec = vec![&inner_vec1, &inner_vec2, &inner_vec3];
2297        let grid: Grid<u8> = Grid::from(&vec);
2298        test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
2299    }
2300
2301    #[test]
2302    #[should_panic]
2303    #[allow(clippy::should_panic_without_expect)]
2304    fn from_2d_vec_reference_of_references_panic() {
2305        let inner_vec1 = vec![1, 2, 3];
2306        let inner_vec2 = vec![4, 5, 6];
2307        let inner_vec3 = vec![7, 8];
2308        let vec = vec![&inner_vec1, &inner_vec2, &inner_vec3];
2309        let _: Grid<u8> = Grid::from(&vec);
2310    }
2311
2312    #[test]
2313    fn from_vec_zero_with_cols() {
2314        let grid: Grid<u8> = Grid::from_vec(vec![], 1);
2315        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2316    }
2317
2318    #[test]
2319    fn from_vec_zero() {
2320        let grid: Grid<u8> = Grid::from_vec(vec![], 0);
2321        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2322    }
2323
2324    #[test]
2325    #[should_panic]
2326    #[allow(clippy::should_panic_without_expect)]
2327    fn from_vec_panics_1() {
2328        let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 0);
2329    }
2330
2331    #[test]
2332    #[should_panic]
2333    #[allow(clippy::should_panic_without_expect)]
2334    fn from_vec_panics_2() {
2335        let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 2);
2336    }
2337
2338    #[test]
2339    fn from_vec_uses_original_vec() {
2340        let capacity = 10_000_000;
2341        let vec = Vec::with_capacity(capacity);
2342        let grid: Grid<u8> = Grid::from_vec(vec, 0);
2343        assert!(grid.into_vec().capacity() >= capacity);
2344    }
2345
2346    #[test]
2347    fn from_vec_with_order_zero_with_cols() {
2348        let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 1, Order::ColumnMajor);
2349        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2350    }
2351
2352    #[test]
2353    fn from_vec_with_order_zero() {
2354        let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2355        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2356    }
2357
2358    #[test]
2359    #[should_panic]
2360    #[allow(clippy::should_panic_without_expect)]
2361    fn from_vec_with_order_panics_1() {
2362        let _: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 0, Order::ColumnMajor);
2363    }
2364
2365    #[test]
2366    #[should_panic]
2367    #[allow(clippy::should_panic_without_expect)]
2368    fn from_vec_with_order_panics_2() {
2369        let _: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 2, Order::ColumnMajor);
2370    }
2371
2372    #[test]
2373    fn from_vec_with_order_uses_original_vec() {
2374        let capacity = 10_000_000;
2375        let vec = Vec::with_capacity(capacity);
2376        let grid: Grid<u8> = Grid::from_vec_with_order(vec, 0, Order::ColumnMajor);
2377        assert!(grid.into_vec().capacity() >= capacity);
2378    }
2379
2380    #[test]
2381    fn insert_col_at_end() {
2382        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2383        grid.insert_col(2, vec![5, 6]);
2384        test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 5, 3, 4, 6]);
2385    }
2386
2387    #[test]
2388    #[should_panic]
2389    #[allow(clippy::should_panic_without_expect)]
2390    fn insert_col_out_of_idx() {
2391        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2392        grid.insert_col(3, vec![4, 5]);
2393    }
2394
2395    #[test]
2396    fn insert_col_empty() {
2397        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2398        grid.insert_col(0, vec![1, 2, 3]);
2399        test_grid(&grid, 3, 1, Order::RowMajor, &[1, 2, 3]);
2400    }
2401
2402    #[test]
2403    #[should_panic]
2404    #[allow(clippy::should_panic_without_expect)]
2405    fn insert_col_empty_input_panics() {
2406        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2407        grid.insert_col(0, vec![]);
2408    }
2409
2410    #[test]
2411    fn insert_col_at_end_column_major() {
2412        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2413        grid.insert_col(2, vec![5, 6]);
2414        test_grid(&grid, 2, 3, Order::ColumnMajor, &[1, 3, 2, 4, 5, 6]);
2415    }
2416
2417    #[test]
2418    #[should_panic]
2419    #[allow(clippy::should_panic_without_expect)]
2420    fn insert_col_out_of_idx_column_major() {
2421        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2422        grid.insert_col(3, vec![4, 5]);
2423    }
2424
2425    #[test]
2426    fn insert_col_empty_column_major() {
2427        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2428        grid.insert_col(0, vec![1, 2, 3]);
2429        test_grid(&grid, 3, 1, Order::ColumnMajor, &[1, 2, 3]);
2430    }
2431
2432    #[test]
2433    #[should_panic]
2434    #[allow(clippy::should_panic_without_expect)]
2435    fn insert_col_empty_input_panics_column_major() {
2436        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2437        grid.insert_col(0, vec![]);
2438    }
2439
2440    #[test]
2441    fn insert_row_at_end() {
2442        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2443        grid.insert_row(2, vec![5, 6]);
2444        test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
2445    }
2446
2447    #[test]
2448    fn insert_row_empty() {
2449        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2450        grid.insert_row(0, vec![1, 2, 3]);
2451        test_grid(&grid, 1, 3, Order::RowMajor, &[1, 2, 3]);
2452    }
2453
2454    #[test]
2455    #[should_panic]
2456    #[allow(clippy::should_panic_without_expect)]
2457    fn insert_row_empty_input_panics() {
2458        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2459        grid.insert_row(0, vec![]);
2460    }
2461
2462    #[test]
2463    #[should_panic]
2464    #[allow(clippy::should_panic_without_expect)]
2465    fn insert_row_out_of_idx() {
2466        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2467        grid.insert_row(3, vec![4, 5]);
2468    }
2469
2470    #[test]
2471    #[should_panic]
2472    #[allow(clippy::should_panic_without_expect)]
2473    fn insert_row_wrong_size_of_idx() {
2474        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2475        grid.insert_row(1, vec![4, 5, 4]);
2476    }
2477
2478    #[test]
2479    fn insert_row_start() {
2480        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2481        grid.insert_row(1, vec![5, 6]);
2482        test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 5, 6, 3, 4]);
2483    }
2484
2485    #[test]
2486    fn insert_row_at_end_column_major() {
2487        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2488        grid.insert_row(2, vec![5, 6]);
2489        test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 3, 5, 2, 4, 6]);
2490    }
2491
2492    #[test]
2493    fn insert_row_empty_column_major() {
2494        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2495        grid.insert_row(0, vec![1, 2, 3]);
2496        test_grid(&grid, 1, 3, Order::ColumnMajor, &[1, 2, 3]);
2497    }
2498
2499    #[test]
2500    #[should_panic]
2501    #[allow(clippy::should_panic_without_expect)]
2502    fn insert_row_empty_input_panics_column_major() {
2503        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2504        grid.insert_row(0, vec![]);
2505    }
2506
2507    #[test]
2508    #[should_panic]
2509    #[allow(clippy::should_panic_without_expect)]
2510    fn insert_row_out_of_idx_column_major() {
2511        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::ColumnMajor);
2512        grid.insert_row(3, vec![4, 5]);
2513    }
2514
2515    #[test]
2516    #[should_panic]
2517    #[allow(clippy::should_panic_without_expect)]
2518    fn insert_row_wrong_size_of_idx_column_major() {
2519        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::ColumnMajor);
2520        grid.insert_row(1, vec![4, 5, 4]);
2521    }
2522
2523    #[test]
2524    fn insert_row_start_column_major() {
2525        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2526        grid.insert_row(1, vec![5, 6]);
2527        test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 5, 3, 2, 6, 4]);
2528    }
2529
2530    #[test]
2531    fn pop_col_1x3() {
2532        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 3, Order::RowMajor);
2533        assert_eq!(grid.pop_col(), Some(vec![3]));
2534        test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
2535        assert_eq!(grid.pop_col(), Some(vec![2]));
2536        test_grid(&grid, 1, 1, Order::RowMajor, &[1]);
2537        assert_eq!(grid.pop_col(), Some(vec![1]));
2538        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2539        assert_eq!(grid.pop_col(), None);
2540        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2541    }
2542
2543    #[test]
2544    fn pop_col_3x1() {
2545        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 1, Order::RowMajor);
2546        assert_eq!(grid.pop_col(), Some(vec![1, 2, 3]));
2547        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2548        assert_eq!(grid.pop_col(), None);
2549        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2550    }
2551
2552    #[test]
2553    fn pop_col_2x2() {
2554        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2555        assert_eq!(grid.pop_col(), Some(vec![2, 4]));
2556        assert_eq!(grid.size(), (2, 1));
2557        test_grid(&grid, 2, 1, Order::RowMajor, &[1, 3]);
2558        assert_eq!(grid.pop_col(), Some(vec![1, 3]));
2559        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2560        assert_eq!(grid.pop_col(), None);
2561        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2562    }
2563
2564    #[test]
2565    fn pop_col_3x4() {
2566        let internal = vec![1, 2, 3, 4, 11, 22, 33, 44, 111, 222, 333, 444];
2567        let mut grid: Grid<u16> = Grid::from_vec_with_order(internal, 4, Order::RowMajor);
2568        assert_eq!(grid.pop_col(), Some(vec![4, 44, 444]));
2569        let expected = [1, 2, 3, 11, 22, 33, 111, 222, 333];
2570        test_grid(&grid, 3, 3, Order::RowMajor, &expected);
2571        assert_eq!(grid.pop_col(), Some(vec![3, 33, 333]));
2572        test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 11, 22, 111, 222]);
2573        assert_eq!(grid.pop_col(), Some(vec![2, 22, 222]));
2574        test_grid(&grid, 3, 1, Order::RowMajor, &[1, 11, 111]);
2575        assert_eq!(grid.pop_col(), Some(vec![1, 11, 111]));
2576        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2577        assert_eq!(grid.pop_col(), None);
2578        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2579    }
2580
2581    #[test]
2582    fn pop_col_empty() {
2583        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
2584        assert_eq!(grid.pop_col(), None);
2585        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2586    }
2587
2588    #[test]
2589    fn pop_col_1x3_column_major() {
2590        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 3, Order::ColumnMajor);
2591        assert_eq!(grid.pop_col(), Some(vec![3]));
2592        test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
2593        assert_eq!(grid.pop_col(), Some(vec![2]));
2594        test_grid(&grid, 1, 1, Order::ColumnMajor, &[1]);
2595        assert_eq!(grid.pop_col(), Some(vec![1]));
2596        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2597        assert_eq!(grid.pop_col(), None);
2598        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2599    }
2600
2601    #[test]
2602    fn pop_col_3x1_column_major() {
2603        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 2, 3], 1, Order::ColumnMajor);
2604        assert_eq!(grid.pop_col(), Some(vec![1, 2, 3]));
2605        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2606        assert_eq!(grid.pop_col(), None);
2607        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2608    }
2609
2610    #[test]
2611    fn pop_col_2x2_column_major() {
2612        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2613        assert_eq!(grid.pop_col(), Some(vec![2, 4]));
2614        assert_eq!(grid.size(), (2, 1));
2615        test_grid(&grid, 2, 1, Order::ColumnMajor, &[1, 3]);
2616        assert_eq!(grid.pop_col(), Some(vec![1, 3]));
2617        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2618        assert_eq!(grid.pop_col(), None);
2619        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2620    }
2621
2622    #[test]
2623    fn pop_col_3x4_column_major() {
2624        let internal = vec![1, 11, 111, 2, 22, 222, 3, 33, 333, 4, 44, 444];
2625        let mut grid: Grid<u16> = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
2626        assert_eq!(grid.pop_col(), Some(vec![4, 44, 444]));
2627        let expected = [1, 11, 111, 2, 22, 222, 3, 33, 333];
2628        test_grid(&grid, 3, 3, Order::ColumnMajor, &expected);
2629        assert_eq!(grid.pop_col(), Some(vec![3, 33, 333]));
2630        test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 11, 111, 2, 22, 222]);
2631        assert_eq!(grid.pop_col(), Some(vec![2, 22, 222]));
2632        test_grid(&grid, 3, 1, Order::ColumnMajor, &[1, 11, 111]);
2633        assert_eq!(grid.pop_col(), Some(vec![1, 11, 111]));
2634        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2635        assert_eq!(grid.pop_col(), None);
2636        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2637    }
2638
2639    #[test]
2640    fn pop_col_empty_column_major() {
2641        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2642        assert_eq!(grid.pop_col(), None);
2643        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2644    }
2645
2646    #[test]
2647    fn pop_row_2x2() {
2648        let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
2649        assert_eq!(grid.pop_row(), Some(vec![3, 4]));
2650        test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
2651        assert_eq!(grid.pop_row(), Some(vec![1, 2]));
2652        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2653        assert_eq!(grid.pop_row(), None);
2654        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2655    }
2656
2657    #[test]
2658    fn pop_row_empty() {
2659        let mut grid: Grid<u8> = Grid::from_vec(vec![], 0);
2660        assert_eq!(grid.pop_row(), None);
2661        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
2662    }
2663
2664    #[test]
2665    fn pop_row_2x2_column_major() {
2666        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2667        assert_eq!(grid.pop_row(), Some(vec![3, 4]));
2668        test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
2669        assert_eq!(grid.pop_row(), Some(vec![1, 2]));
2670        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2671        assert_eq!(grid.pop_row(), None);
2672        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2673    }
2674
2675    #[test]
2676    fn pop_row_empty_column_major() {
2677        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
2678        assert_eq!(grid.pop_row(), None);
2679        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
2680    }
2681
2682    #[test]
2683    fn ne_full_empty() {
2684        let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2685        let g2: Grid<u8> = grid![];
2686        assert_ne!(g1, g2);
2687    }
2688
2689    #[test]
2690    fn ne() {
2691        let g1 = Grid::from_vec(vec![1, 2, 3, 5], 2);
2692        let g2 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2693        assert_ne!(g1, g2);
2694    }
2695
2696    #[test]
2697    fn ne_dif_rows() {
2698        let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
2699        let g2 = Grid::from_vec(vec![1, 2, 3, 4], 1);
2700        assert_ne!(g1, g2);
2701    }
2702
2703    #[test]
2704    fn equal_empty() {
2705        let grid: Grid<char> = grid![];
2706        let grid2: Grid<char> = grid![];
2707        assert_eq!(grid, grid2);
2708    }
2709
2710    #[test]
2711    fn equal() {
2712        let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2713        let grid2: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2714        assert_eq!(grid, grid2);
2715    }
2716
2717    #[test]
2718    fn equal_different_order() {
2719        let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
2720        let grid2 = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2721        assert_eq!(grid, grid2);
2722    }
2723
2724    #[test]
2725    fn equal_partial_eq() {
2726        let grid = grid![[1.0]];
2727        let grid2 = Grid::from_vec(vec![1.0], 1);
2728        assert_eq!(grid, grid2);
2729    }
2730
2731    #[test]
2732    fn ne_partial_eq() {
2733        let grid = grid![[f64::NAN]];
2734        assert_ne!(grid, grid);
2735    }
2736
2737    #[test]
2738    #[should_panic]
2739    #[allow(clippy::should_panic_without_expect)]
2740    fn idx_tup_out_of_col_bounds() {
2741        let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
2742        let _ = grid[(0, 5)];
2743    }
2744
2745    #[test]
2746    fn push_col_2x3() {
2747        let mut grid: Grid<u8> = grid![
2748                    [0, 1, 2]
2749                    [10, 11, 12]];
2750        grid.push_col(vec![3, 13]);
2751        test_grid(&grid, 2, 4, Order::RowMajor, &[0, 1, 2, 3, 10, 11, 12, 13]);
2752    }
2753
2754    #[test]
2755    fn push_col_3x4() {
2756        let mut grid: Grid<char> = grid![
2757                    ['a', 'b', 'c', 'd']
2758                    ['a', 'b', 'c', 'd']
2759                    ['a', 'b', 'c', 'd']];
2760        grid.push_col(vec!['x', 'y', 'z']);
2761        let expected = [
2762            'a', 'b', 'c', 'd', 'x', 'a', 'b', 'c', 'd', 'y', 'a', 'b', 'c', 'd', 'z',
2763        ];
2764        test_grid(&grid, 3, 5, Order::RowMajor, &expected);
2765    }
2766
2767    #[test]
2768    fn push_col_1x3() {
2769        let mut grid: Grid<char> = grid![['a', 'b', 'c']];
2770        grid.push_col(vec!['d']);
2771        test_grid(&grid, 1, 4, Order::RowMajor, &['a', 'b', 'c', 'd']);
2772    }
2773
2774    #[test]
2775    fn push_col_empty() {
2776        let mut grid: Grid<char> = grid![];
2777        grid.push_col(vec!['b', 'b', 'b', 'b']);
2778        test_grid(&grid, 4, 1, Order::RowMajor, &['b', 'b', 'b', 'b']);
2779    }
2780
2781    #[test]
2782    #[should_panic]
2783    #[allow(clippy::should_panic_without_expect)]
2784    fn push_col_wrong_size() {
2785        let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
2786        grid.push_col(vec!['b']);
2787        grid.push_col(vec!['b', 'b']);
2788    }
2789
2790    #[test]
2791    #[should_panic]
2792    #[allow(clippy::should_panic_without_expect)]
2793    fn push_col_zero_len() {
2794        let mut grid: Grid<char> = grid![];
2795        grid.push_col(vec![]);
2796    }
2797
2798    #[test]
2799    fn push_col_2x3_column_major() {
2800        let internal = vec![0, 10, 1, 11, 2, 12];
2801        let mut grid: Grid<u8> = Grid::from_vec_with_order(internal, 3, Order::ColumnMajor);
2802        grid.push_col(vec![3, 13]);
2803        let expected = [0, 10, 1, 11, 2, 12, 3, 13];
2804        test_grid(&grid, 2, 4, Order::ColumnMajor, &expected);
2805    }
2806
2807    #[test]
2808    fn push_col_3x4_column_major() {
2809        let internal = vec!['a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'];
2810        let mut grid: Grid<char> = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
2811        grid.push_col(vec!['x', 'y', 'z']);
2812        let expected = [
2813            'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd', 'x', 'y', 'z',
2814        ];
2815        test_grid(&grid, 3, 5, Order::ColumnMajor, &expected);
2816    }
2817
2818    #[test]
2819    fn push_col_1x3_column_major() {
2820        let mut grid: Grid<char> =
2821            Grid::from_vec_with_order(vec!['a', 'b', 'c'], 3, Order::ColumnMajor);
2822        grid.push_col(vec!['d']);
2823        test_grid(&grid, 1, 4, Order::ColumnMajor, &['a', 'b', 'c', 'd']);
2824    }
2825
2826    #[test]
2827    fn push_col_empty_column_major() {
2828        let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2829        grid.push_col(vec!['b', 'b', 'b', 'b']);
2830        test_grid(&grid, 4, 1, Order::ColumnMajor, &['b', 'b', 'b', 'b']);
2831    }
2832
2833    #[test]
2834    #[should_panic]
2835    #[allow(clippy::should_panic_without_expect)]
2836    fn push_col_wrong_size_column_major() {
2837        let mut grid: Grid<char> = Grid::init_with_order(2, 3, Order::ColumnMajor, 'a');
2838        grid.push_col(vec!['b']);
2839        grid.push_col(vec!['b', 'b']);
2840    }
2841
2842    #[test]
2843    #[should_panic]
2844    #[allow(clippy::should_panic_without_expect)]
2845    fn push_col_zero_len_column_major() {
2846        let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2847        grid.push_col(vec![]);
2848    }
2849
2850    #[test]
2851    fn push_row() {
2852        let mut grid: Grid<u8> = grid![[1, 2][3, 4]];
2853        grid.push_row(vec![5, 6]);
2854        test_grid(&grid, 3, 2, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
2855    }
2856
2857    #[test]
2858    fn push_row_empty() {
2859        let mut grid: Grid<char> = grid![];
2860        grid.push_row(vec!['b', 'b', 'b', 'b']);
2861        test_grid(&grid, 1, 4, Order::RowMajor, &['b', 'b', 'b', 'b']);
2862    }
2863
2864    #[test]
2865    #[should_panic]
2866    #[allow(clippy::should_panic_without_expect)]
2867    fn push_empty_row() {
2868        let mut grid = Grid::init(0, 1, 0);
2869        grid.push_row(vec![]);
2870    }
2871
2872    #[test]
2873    #[should_panic]
2874    #[allow(clippy::should_panic_without_expect)]
2875    fn push_row_wrong_size() {
2876        let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
2877        grid.push_row(vec!['b']);
2878        grid.push_row(vec!['b', 'b', 'b', 'b']);
2879    }
2880
2881    #[test]
2882    fn push_row_column_major() {
2883        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
2884        grid.push_row(vec![5, 6]);
2885        test_grid(&grid, 3, 2, Order::ColumnMajor, &[1, 3, 5, 2, 4, 6]);
2886    }
2887
2888    #[test]
2889    fn push_row_empty_column_major() {
2890        let mut grid: Grid<char> = Grid::new_with_order(0, 0, Order::ColumnMajor);
2891        grid.push_row(vec!['b', 'b', 'b', 'b']);
2892        test_grid(&grid, 1, 4, Order::ColumnMajor, &['b', 'b', 'b', 'b']);
2893    }
2894
2895    #[test]
2896    #[should_panic]
2897    #[allow(clippy::should_panic_without_expect)]
2898    fn push_empty_row_column_major() {
2899        let mut grid = Grid::init_with_order(0, 1, Order::ColumnMajor, 0);
2900        grid.push_row(vec![]);
2901    }
2902
2903    #[test]
2904    #[should_panic]
2905    #[allow(clippy::should_panic_without_expect)]
2906    fn push_row_wrong_size_column_major() {
2907        let mut grid: Grid<char> =
2908            Grid::from_vec_with_order(vec!['a', 'a', 'a', 'a', 'a', 'a'], 3, Order::ColumnMajor);
2909        grid.push_row(vec!['b']);
2910        grid.push_row(vec!['b', 'b', 'b', 'b']);
2911    }
2912
2913    #[test]
2914    fn expand_rows() {
2915        let mut grid = Grid::from_vec_with_order(vec![1, 1, 1, 2, 2, 2], 3, Order::RowMajor);
2916        grid.expand_rows(2);
2917
2918        assert_eq!(grid.size(), (4, 3));
2919        assert_eq!(grid.order, Order::RowMajor);
2920        assert_eq!(grid.rows(), 4);
2921        assert_eq!(grid.cols(), 3);
2922        assert_eq!(grid.into_vec(), vec![1, 1, 1, 2, 2, 2, 0, 0, 0, 0, 0, 0]);
2923    }
2924
2925    #[test]
2926    fn expand_rows_column_major() {
2927        let mut grid = Grid::from_vec_with_order(vec![1, 2, 1, 2, 1, 2], 3, Order::ColumnMajor);
2928        grid.expand_rows(2);
2929
2930        assert_eq!(grid.size(), (4, 3));
2931        assert_eq!(grid.order, Order::ColumnMajor);
2932        assert_eq!(grid.rows(), 4);
2933        assert_eq!(grid.cols(), 3);
2934        assert_eq!(grid.into_vec(), vec![1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0]);
2935    }
2936
2937    #[test]
2938    fn expand_rows_zero() {
2939        let mut grid = Grid::from_vec_with_order(vec![1, 1, 1], 3, Order::RowMajor);
2940        grid.expand_rows(0);
2941
2942        assert_eq!(grid.size(), (1, 3));
2943        assert_eq!(grid.order, Order::RowMajor);
2944        assert_eq!(grid.rows(), 1);
2945        assert_eq!(grid.cols(), 3);
2946        assert_eq!(grid.into_vec(), vec![1, 1, 1]);
2947    }
2948
2949    fn assert_growth_overflow_keeps_grid_valid(grow: impl FnOnce(&mut Grid<u8>)) {
2950        let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
2951
2952        let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| grow(&mut grid)));
2953
2954        assert!(result.is_err());
2955        assert_eq!(grid.size(), (1, 2));
2956        assert_eq!(grid.get(0, 0), Some(&1));
2957        assert_eq!(grid.get(0, 1), Some(&2));
2958        assert_eq!(grid.get(1, 0), None);
2959    }
2960
2961    #[test]
2962    fn expand_rows_overflow_keeps_grid_valid() {
2963        assert_growth_overflow_keeps_grid_valid(|grid| grid.expand_rows(usize::MAX / 2));
2964    }
2965
2966    #[test]
2967    fn expand_rows_overflow_safe_get_regression() {
2968        let mut grid = Grid::from_vec(vec![1_u8, 2_u8], 2);
2969
2970        let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
2971            grid.expand_rows(usize::MAX / 2);
2972        }));
2973
2974        assert!(result.is_err());
2975        assert_eq!(grid.get(0, 0), Some(&1));
2976    }
2977
2978    #[test]
2979    fn expand_cols_overflow_keeps_grid_valid() {
2980        assert_growth_overflow_keeps_grid_valid(|grid| grid.expand_cols(usize::MAX));
2981    }
2982
2983    #[test]
2984    fn prepend_rows_overflow_keeps_grid_valid() {
2985        assert_growth_overflow_keeps_grid_valid(|grid| grid.prepend_rows(usize::MAX / 2));
2986    }
2987
2988    #[test]
2989    fn prepend_cols_overflow_keeps_grid_valid() {
2990        assert_growth_overflow_keeps_grid_valid(|grid| grid.prepend_cols(usize::MAX));
2991    }
2992
2993    fn assert_failed_insert_row_keeps_grid_valid<T>(mut grid: Grid<T>)
2994    where
2995        T: fmt::Debug + PartialEq,
2996    {
2997        let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
2998            grid.insert_row(0, vec![]);
2999        }));
3000
3001        assert!(result.is_err());
3002        assert_eq!(grid.size(), (0, 0));
3003        assert!(grid.is_empty());
3004        assert_eq!(grid.get(0, 0), None);
3005    }
3006
3007    fn assert_failed_insert_col_keeps_grid_valid<T>(mut grid: Grid<T>)
3008    where
3009        T: fmt::Debug + PartialEq,
3010    {
3011        let result = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| {
3012            grid.insert_col(0, vec![]);
3013        }));
3014
3015        assert!(result.is_err());
3016        assert_eq!(grid.size(), (0, 0));
3017        assert!(grid.is_empty());
3018        assert_eq!(grid.get(0, 0), None);
3019    }
3020
3021    #[test]
3022    fn insert_row_empty_input_keeps_empty_grid_valid() {
3023        assert_failed_insert_row_keeps_grid_valid(Grid::<u8>::new(0, 0));
3024    }
3025
3026    #[test]
3027    fn insert_col_empty_input_keeps_empty_grid_valid() {
3028        assert_failed_insert_col_keeps_grid_valid(Grid::<u8>::new(0, 0));
3029    }
3030
3031    #[test]
3032    fn insert_row_empty_input_keeps_zst_grid_valid() {
3033        assert_failed_insert_row_keeps_grid_valid(Grid::<()>::new(0, 0));
3034    }
3035
3036    #[test]
3037    fn insert_col_empty_input_keeps_zst_grid_valid() {
3038        assert_failed_insert_col_keeps_grid_valid(Grid::<()>::new(0, 0));
3039    }
3040
3041    #[test]
3042    fn expand_rows_empty_grid() {
3043        let mut grid: Grid<u8> = Grid::init(0, 0, 0);
3044        grid.expand_rows(2);
3045
3046        assert_eq!(grid.size(), (0, 0));
3047        assert_eq!(grid.order, Order::RowMajor);
3048        assert_eq!(grid.rows(), 0);
3049        assert_eq!(grid.cols(), 0);
3050        assert_eq!(grid.into_vec(), Vec::<u8>::new());
3051    }
3052
3053    #[test]
3054    fn expand_cols() {
3055        let mut grid = Grid::from_vec_with_order(vec![1, 1, 1, 2, 2, 2], 3, Order::RowMajor);
3056        grid.expand_cols(2);
3057
3058        assert_eq!(grid.size(), (2, 5));
3059        assert_eq!(grid.order, Order::RowMajor);
3060        assert_eq!(grid.rows(), 2);
3061        assert_eq!(grid.cols(), 5);
3062        assert_eq!(grid.into_vec(), vec![1, 1, 1, 0, 0, 2, 2, 2, 0, 0]);
3063    }
3064
3065    #[test]
3066    fn expand_cols_column_major() {
3067        let mut grid = Grid::from_vec_with_order(vec![1, 2, 1, 2, 1, 2], 3, Order::ColumnMajor);
3068        grid.expand_cols(2);
3069
3070        assert_eq!(grid.size(), (2, 5));
3071        assert_eq!(grid.order, Order::ColumnMajor);
3072        assert_eq!(grid.rows(), 2);
3073        assert_eq!(grid.cols(), 5);
3074        assert_eq!(grid.into_vec(), vec![1, 2, 1, 2, 1, 2, 0, 0, 0, 0]);
3075    }
3076
3077    #[test]
3078    fn expand_cols_zero() {
3079        let mut grid = Grid::from_vec_with_order(vec![1, 2, 1, 2], 2, Order::RowMajor);
3080        grid.expand_cols(0);
3081
3082        assert_eq!(grid.size(), (2, 2));
3083        assert_eq!(grid.order, Order::RowMajor);
3084        assert_eq!(grid.rows(), 2);
3085        assert_eq!(grid.cols(), 2);
3086        assert_eq!(grid.into_vec(), vec![1, 2, 1, 2]);
3087    }
3088
3089    #[test]
3090    fn expand_cols_empty_grid() {
3091        let mut grid: Grid<u8> = Grid::init(0, 0, 0);
3092        grid.expand_cols(2);
3093
3094        assert_eq!(grid.size(), (0, 0));
3095        assert_eq!(grid.order, Order::RowMajor);
3096        assert_eq!(grid.rows(), 0);
3097        assert_eq!(grid.cols(), 0);
3098        assert_eq!(grid.into_vec(), Vec::<u8>::new());
3099    }
3100
3101    #[test]
3102    fn prepend_rows() {
3103        let mut grid = Grid::from_vec_with_order(vec![1, 1, 1, 2, 2, 2], 3, Order::RowMajor);
3104        grid.prepend_rows(2);
3105
3106        assert_eq!(grid.size(), (4, 3));
3107        assert_eq!(grid.order, Order::RowMajor);
3108        assert_eq!(grid.rows(), 4);
3109        assert_eq!(grid.cols(), 3);
3110        assert_eq!(grid.into_vec(), vec![0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 2, 2]);
3111    }
3112
3113    #[test]
3114    fn prepend_rows_column_major() {
3115        let mut grid = Grid::from_vec_with_order(vec![1, 2, 1, 2, 1, 2], 3, Order::ColumnMajor);
3116        grid.prepend_rows(2);
3117
3118        assert_eq!(grid.size(), (4, 3));
3119        assert_eq!(grid.order, Order::ColumnMajor);
3120        assert_eq!(grid.rows(), 4);
3121        assert_eq!(grid.cols(), 3);
3122        assert_eq!(grid.into_vec(), vec![0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2]);
3123    }
3124
3125    #[test]
3126    fn prepend_rows_zero() {
3127        let mut grid = Grid::from_vec_with_order(vec![1, 1, 1], 3, Order::RowMajor);
3128        grid.prepend_rows(0);
3129
3130        assert_eq!(grid.size(), (1, 3));
3131        assert_eq!(grid.order, Order::RowMajor);
3132        assert_eq!(grid.rows(), 1);
3133        assert_eq!(grid.cols(), 3);
3134        assert_eq!(grid.into_vec(), vec![1, 1, 1]);
3135    }
3136
3137    #[test]
3138    fn prepend_rows_empty_grid() {
3139        let mut grid: Grid<u8> = Grid::init(0, 0, 0);
3140        grid.prepend_rows(2);
3141
3142        assert_eq!(grid.size(), (0, 0));
3143        assert_eq!(grid.order, Order::RowMajor);
3144        assert_eq!(grid.rows(), 0);
3145        assert_eq!(grid.cols(), 0);
3146        assert_eq!(grid.into_vec(), Vec::<u8>::new());
3147    }
3148
3149    #[test]
3150    fn prepend_cols() {
3151        let mut grid = Grid::from_vec_with_order(vec![1, 1, 1, 2, 2, 2], 3, Order::RowMajor);
3152        grid.prepend_cols(2);
3153
3154        assert_eq!(grid.size(), (2, 5));
3155        assert_eq!(grid.order, Order::RowMajor);
3156        assert_eq!(grid.rows(), 2);
3157        assert_eq!(grid.cols(), 5);
3158        assert_eq!(grid.into_vec(), vec![0, 0, 1, 1, 1, 0, 0, 2, 2, 2]);
3159    }
3160
3161    #[test]
3162    fn prepend_cols_column_major() {
3163        let mut grid = Grid::from_vec_with_order(vec![1, 2, 1, 2, 1, 2], 3, Order::ColumnMajor);
3164        grid.prepend_cols(2);
3165
3166        assert_eq!(grid.size(), (2, 5));
3167        assert_eq!(grid.order, Order::ColumnMajor);
3168        assert_eq!(grid.rows(), 2);
3169        assert_eq!(grid.cols(), 5);
3170        assert_eq!(grid.into_vec(), vec![0, 0, 0, 0, 1, 2, 1, 2, 1, 2]);
3171    }
3172
3173    #[test]
3174    fn prepend_cols_zero() {
3175        let mut grid = Grid::from_vec_with_order(vec![1, 2, 1, 2], 2, Order::RowMajor);
3176        grid.prepend_cols(0);
3177
3178        assert_eq!(grid.size(), (2, 2));
3179        assert_eq!(grid.order, Order::RowMajor);
3180        assert_eq!(grid.rows(), 2);
3181        assert_eq!(grid.cols(), 2);
3182        assert_eq!(grid.into_vec(), vec![1, 2, 1, 2]);
3183    }
3184
3185    #[test]
3186    fn prepend_cols_empty_grid() {
3187        let mut grid: Grid<u8> = Grid::init(0, 0, 0);
3188        grid.prepend_cols(2);
3189
3190        assert_eq!(grid.size(), (0, 0));
3191        assert_eq!(grid.order, Order::RowMajor);
3192        assert_eq!(grid.rows(), 0);
3193        assert_eq!(grid.cols(), 0);
3194        assert_eq!(grid.into_vec(), Vec::<u8>::new());
3195    }
3196
3197    #[test]
3198    fn iter_row() {
3199        let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3200        let row: Vec<_> = grid.iter_row(1).collect();
3201        assert_eq!(row, [&4, &5, &6]);
3202    }
3203
3204    #[test]
3205    #[should_panic]
3206    #[allow(clippy::should_panic_without_expect)]
3207    fn iter_row_out_of_bound() {
3208        let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3209        let _ = grid.iter_row(3);
3210    }
3211
3212    #[test]
3213    #[should_panic]
3214    #[allow(clippy::should_panic_without_expect)]
3215    fn iter_row_zero() {
3216        let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
3217        let _ = grid.iter_row(0);
3218    }
3219
3220    #[test]
3221    fn iter_row_rowumn_major() {
3222        let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3223        let row: Vec<_> = grid.iter_row(1).collect();
3224        assert_eq!(row, [&4, &5, &6]);
3225    }
3226
3227    #[test]
3228    #[should_panic]
3229    #[allow(clippy::should_panic_without_expect)]
3230    fn iter_row_rowumn_major_out_of_bound() {
3231        let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3232        let _ = grid.iter_row(3);
3233    }
3234
3235    #[test]
3236    #[should_panic]
3237    #[allow(clippy::should_panic_without_expect)]
3238    fn iter_row_rowumn_major_zero() {
3239        let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
3240        let _ = grid.iter_row(0);
3241    }
3242
3243    #[test]
3244    fn iter_row_mut() {
3245        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3246        let row: Vec<_> = grid.iter_row_mut(1).collect();
3247        assert_eq!(row, [&mut 4, &mut 5, &mut 6]);
3248    }
3249
3250    #[test]
3251    #[should_panic]
3252    #[allow(clippy::should_panic_without_expect)]
3253    fn iter_row_mut_out_of_bound() {
3254        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3255        let _ = grid.iter_row_mut(3);
3256    }
3257
3258    #[test]
3259    #[should_panic]
3260    #[allow(clippy::should_panic_without_expect)]
3261    fn iter_row_mut_zero() {
3262        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
3263        let _ = grid.iter_row_mut(0);
3264    }
3265
3266    #[test]
3267    fn iter_row_mut_rowumn_major() {
3268        let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3269        let row: Vec<_> = grid.iter_row_mut(1).collect();
3270        assert_eq!(row, [&mut 4, &mut 5, &mut 6]);
3271    }
3272
3273    #[test]
3274    #[should_panic]
3275    #[allow(clippy::should_panic_without_expect)]
3276    fn iter_row_mut_rowumn_major_out_of_bound() {
3277        let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3278        let _ = grid.iter_row_mut(3);
3279    }
3280
3281    #[test]
3282    #[should_panic]
3283    #[allow(clippy::should_panic_without_expect)]
3284    fn iter_row_mut_rowumn_major_zero() {
3285        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
3286        let _ = grid.iter_row_mut(0);
3287    }
3288
3289    #[test]
3290    fn iter_col() {
3291        let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3292        let col: Vec<_> = grid.iter_col(1).collect();
3293        assert_eq!(col, [&2, &5]);
3294    }
3295
3296    #[test]
3297    #[should_panic]
3298    #[allow(clippy::should_panic_without_expect)]
3299    fn iter_col_out_of_bound() {
3300        let grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3301        let _ = grid.iter_col(3);
3302    }
3303
3304    #[test]
3305    #[should_panic]
3306    #[allow(clippy::should_panic_without_expect)]
3307    fn iter_col_zero() {
3308        let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
3309        let _ = grid.iter_col(0);
3310    }
3311
3312    #[test]
3313    fn iter_col_column_major() {
3314        let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3315        let col: Vec<_> = grid.iter_col(1).collect();
3316        assert_eq!(col, [&2, &5]);
3317    }
3318
3319    #[test]
3320    #[should_panic]
3321    #[allow(clippy::should_panic_without_expect)]
3322    fn iter_col_column_major_out_of_bound() {
3323        let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3324        let _ = grid.iter_col(3);
3325    }
3326
3327    #[test]
3328    #[should_panic]
3329    #[allow(clippy::should_panic_without_expect)]
3330    fn iter_col_column_major_zero() {
3331        let grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
3332        let _ = grid.iter_col(0);
3333    }
3334
3335    #[test]
3336    fn iter_col_mut() {
3337        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3338        let col: Vec<_> = grid.iter_col_mut(1).collect();
3339        assert_eq!(col, [&mut 2, &mut 5]);
3340    }
3341
3342    #[test]
3343    #[should_panic]
3344    #[allow(clippy::should_panic_without_expect)]
3345    fn iter_col_mut_out_of_bound() {
3346        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
3347        let _ = grid.iter_col_mut(3);
3348    }
3349
3350    #[test]
3351    #[should_panic]
3352    #[allow(clippy::should_panic_without_expect)]
3353    fn iter_col_mut_zero() {
3354        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::RowMajor);
3355        let _ = grid.iter_col_mut(0);
3356    }
3357
3358    #[test]
3359    fn iter_col_mut_column_major() {
3360        let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3361        let col: Vec<_> = grid.iter_col_mut(1).collect();
3362        assert_eq!(col, [&mut 2, &mut 5]);
3363    }
3364
3365    #[test]
3366    #[should_panic]
3367    #[allow(clippy::should_panic_without_expect)]
3368    fn iter_col_mut_column_major_out_of_bound() {
3369        let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3370        let _ = grid.iter_col_mut(3);
3371    }
3372
3373    #[test]
3374    #[should_panic]
3375    #[allow(clippy::should_panic_without_expect)]
3376    fn iter_col_mut_column_major_zero() {
3377        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![], 0, Order::ColumnMajor);
3378        let _ = grid.iter_col_mut(0);
3379    }
3380
3381    #[test]
3382    fn iter() {
3383        let grid: Grid<u8> = grid![[1,2][3,4]];
3384        let mut iter = grid.iter();
3385        assert_eq!(iter.next(), Some(&1));
3386        assert_eq!(iter.next(), Some(&2));
3387        assert_eq!(iter.next(), Some(&3));
3388        assert_eq!(iter.next(), Some(&4));
3389        assert_eq!(iter.next(), None);
3390    }
3391
3392    #[test]
3393    fn into_iter() {
3394        let grid: Grid<u8> = grid![[1,1][1,1]];
3395        for val in grid {
3396            assert_eq!(val, 1);
3397        }
3398    }
3399
3400    #[test]
3401    fn into_iter_ref() {
3402        let grid: Grid<u8> = grid![[1,1][1,1]];
3403        for val in &grid {
3404            assert_eq!(val, &1);
3405        }
3406    }
3407
3408    #[test]
3409    fn into_iter_mut() {
3410        let mut grid: Grid<u8> = grid![[1,1][1,1]];
3411        grid.fill(2);
3412        assert_eq!(grid, grid![[2, 2][2, 2]]);
3413    }
3414
3415    #[test]
3416    fn indexed_iter() {
3417        let grid: Grid<u8> = grid![[1,2][3,4]];
3418        let mut iter = grid.indexed_iter();
3419        assert_eq!(iter.next(), Some(((0, 0), &1)));
3420        assert_eq!(iter.next(), Some(((0, 1), &2)));
3421        assert_eq!(iter.next(), Some(((1, 0), &3)));
3422        assert_eq!(iter.next(), Some(((1, 1), &4)));
3423        assert_eq!(iter.next(), None);
3424    }
3425
3426    #[test]
3427    fn indexed_iter_empty() {
3428        let grid: Grid<u8> = Grid::new(0, 0);
3429        let mut iter = grid.indexed_iter();
3430        assert_eq!(iter.next(), None);
3431    }
3432
3433    #[test]
3434    fn indexed_into_iter() {
3435        let grid: Grid<u8> = grid![[1,2][3,4]];
3436        let mut iter = grid.indexed_into_iter();
3437        assert_eq!(iter.next(), Some(((0, 0), 1)));
3438        assert_eq!(iter.next(), Some(((0, 1), 2)));
3439        assert_eq!(iter.next(), Some(((1, 0), 3)));
3440        assert_eq!(iter.next(), Some(((1, 1), 4)));
3441        assert_eq!(iter.next(), None);
3442    }
3443
3444    #[test]
3445    fn indexed_iter_column_major() {
3446        let grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3447        let mut iter = grid.indexed_iter();
3448        assert_eq!(iter.next(), Some(((0, 0), &1)));
3449        assert_eq!(iter.next(), Some(((1, 0), &3)));
3450        assert_eq!(iter.next(), Some(((0, 1), &2)));
3451        assert_eq!(iter.next(), Some(((1, 1), &4)));
3452        assert_eq!(iter.next(), None);
3453    }
3454
3455    #[test]
3456    fn indexed_iter_empty_column_major() {
3457        let grid: Grid<u8> = Grid::new_with_order(0, 0, Order::ColumnMajor);
3458        let mut iter = grid.indexed_iter();
3459        assert_eq!(iter.next(), None);
3460    }
3461
3462    #[test]
3463    fn indexed_iter_mut() {
3464        let mut grid: Grid<u8> = grid![[1,2][3,4]];
3465        let mut iter = grid.indexed_iter_mut();
3466        assert_eq!(iter.next(), Some(((0, 0), &mut 1)));
3467        assert_eq!(iter.next(), Some(((0, 1), &mut 2)));
3468        assert_eq!(iter.next(), Some(((1, 0), &mut 3)));
3469        assert_eq!(iter.next(), Some(((1, 1), &mut 4)));
3470        assert_eq!(iter.next(), None);
3471    }
3472
3473    #[test]
3474    fn indexed_iter_mut_empty() {
3475        let mut grid: Grid<u8> = Grid::new(0, 0);
3476        let mut iter = grid.indexed_iter_mut();
3477        assert_eq!(iter.next(), None);
3478    }
3479
3480    #[test]
3481    fn indexed_iter_mut_column_major() {
3482        let mut grid: Grid<u8> = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
3483        let mut iter = grid.indexed_iter_mut();
3484        assert_eq!(iter.next(), Some(((0, 0), &mut 1)));
3485        assert_eq!(iter.next(), Some(((1, 0), &mut 3)));
3486        assert_eq!(iter.next(), Some(((0, 1), &mut 2)));
3487        assert_eq!(iter.next(), Some(((1, 1), &mut 4)));
3488        assert_eq!(iter.next(), None);
3489    }
3490
3491    #[test]
3492    fn indexed_iter_mut_empty_column_major() {
3493        let mut grid: Grid<u8> = Grid::new_with_order(0, 0, Order::ColumnMajor);
3494        let mut iter = grid.indexed_iter_mut();
3495        assert_eq!(iter.next(), None);
3496    }
3497
3498    #[test]
3499    fn clear() {
3500        let mut grid: Grid<u8> = grid![[1, 2, 3]];
3501        assert!(!grid.is_empty());
3502        grid.clear();
3503        assert!(grid.is_empty());
3504    }
3505
3506    #[test]
3507    fn is_empty_false() {
3508        let grid: Grid<u8> = grid![[1, 2, 3]];
3509        assert!(!grid.is_empty());
3510    }
3511
3512    #[test]
3513    fn is_empty() {
3514        let mut g: Grid<u8> = grid![[]];
3515        assert!(g.is_empty());
3516        g = grid![];
3517        assert!(g.is_empty());
3518        g = Grid::from_vec(vec![], 0);
3519        assert!(g.is_empty());
3520        g = Grid::new(0, 0);
3521        assert!(g.is_empty());
3522        g = Grid::new(0, 1);
3523        assert!(g.is_empty());
3524        g = Grid::new(1, 0);
3525        assert!(g.is_empty());
3526        g = Grid::init(0, 0, 10);
3527        assert!(g.is_empty());
3528    }
3529
3530    #[test]
3531    fn fmt_empty() {
3532        let grid: Grid<u8> = grid![];
3533        assert_eq!(format!("{grid:?}"), "[]");
3534    }
3535
3536    #[test]
3537    fn fmt_row() {
3538        let grid: Grid<u8> = grid![[1, 2, 3]];
3539        assert_eq!(format!("{grid:?}"), "[[1, 2, 3]]");
3540    }
3541
3542    #[test]
3543    fn fmt_grid() {
3544        let grid: Grid<u8> = grid![[1,2,3][4,5,6][7,8,9]];
3545        assert_eq!(format!("{grid:?}"), "[[1, 2, 3][4, 5, 6][7, 8, 9]]");
3546    }
3547
3548    #[test]
3549    fn fmt_column_major() {
3550        let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3551        assert_eq!(format!("{grid:?}"), "[[1, 2, 3][4, 5, 6]]");
3552    }
3553
3554    #[test]
3555    fn fmt_pretty_empty() {
3556        let grid: Grid<f32> = grid![];
3557        assert_eq!(format!("{grid:#?}"), "[]");
3558    }
3559
3560    #[test]
3561    fn fmt_pretty_int() {
3562        let grid: Grid<u8> = grid![
3563            [1,2,3]
3564            [4,5,6]
3565            [7,8,95]
3566        ];
3567
3568        let expected_output = r"[
3569    [  1,  2,  3]
3570    [  4,  5,  6]
3571    [  7,  8, 95]
3572]";
3573
3574        assert_eq!(format!("{grid:#?}"), expected_output);
3575
3576        let expected_output = r"[
3577    [   1,   2,   3]
3578    [   4,   5,   6]
3579    [   7,   8,  95]
3580]";
3581
3582        assert_eq!(format!("{grid:#3?}"), expected_output);
3583    }
3584
3585    #[test]
3586    fn fmt_pretty_float() {
3587        let grid: Grid<f32> = grid![
3588            [1.5,2.6,3.44]
3589            [4.775,5.,6.]
3590            [7.1,8.23444,95.55]
3591        ];
3592
3593        let expected_output = r"[
3594    [   1.5,   2.6,   3.4]
3595    [   4.8,   5.0,   6.0]
3596    [   7.1,   8.2,  95.6]
3597]";
3598
3599        assert_eq!(format!("{grid:#5.1?}"), expected_output);
3600
3601        let expected_output = r"[
3602    [  1.50000,  2.60000,  3.44000]
3603    [  4.77500,  5.00000,  6.00000]
3604    [  7.10000,  8.23444, 95.55000]
3605]";
3606
3607        assert_eq!(format!("{grid:#8.5?}"), expected_output);
3608    }
3609
3610    #[test]
3611    fn fmt_pretty_tuple() {
3612        let grid: Grid<(i32, i32)> = grid![
3613            [(5,66), (432, 55)]
3614            [(80, 90), (5, 6)]
3615        ];
3616
3617        let expected_output = r"[
3618    [ (        5,        66), (      432,        55)]
3619    [ (       80,        90), (        5,         6)]
3620]";
3621
3622        assert_eq!(format!("{grid:#?}"), expected_output);
3623
3624        let expected_output = r"[
3625    [ (  5,  66), (432,  55)]
3626    [ ( 80,  90), (  5,   6)]
3627]";
3628
3629        assert_eq!(format!("{grid:#3?}"), expected_output);
3630    }
3631
3632    #[test]
3633    fn fmt_pretty_struct_derived() {
3634        #[derive(Debug)]
3635        struct Person {
3636            _name: String,
3637            _precise_age: f32,
3638        }
3639
3640        impl Person {
3641            fn new(name: &str, precise_age: f32) -> Self {
3642                Self {
3643                    _name: name.into(),
3644                    _precise_age: precise_age,
3645                }
3646            }
3647        }
3648
3649        let grid: Grid<Person> = grid![
3650            [Person::new("Vic", 24.5), Person::new("Mr. Very Long Name", 1955.)]
3651            [Person::new("Sam", 8.9995), Person::new("John Doe", 40.14)]
3652        ];
3653
3654        let expected_output = r#"[
3655    [ Person { _name: "Vic", _precise_age: 24.50000 }, Person { _name: "Mr. Very Long Name", _precise_age: 1955.00000 }]
3656    [ Person { _name: "Sam", _precise_age: 8.99950 }, Person { _name: "John Doe", _precise_age: 40.14000 }]
3657]"#;
3658
3659        assert_eq!(format!("{grid:#5.5?}"), expected_output);
3660    }
3661
3662    #[test]
3663    fn fmt_pretty_column_major() {
3664        let grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
3665        let expected_output = r"[
3666    [ 1, 2, 3]
3667    [ 4, 5, 6]
3668]";
3669        assert_eq!(format!("{grid:#?}"), expected_output);
3670    }
3671
3672    #[test]
3673    fn clone() {
3674        let grid = grid![[1, 2, 3][4, 5, 6]];
3675        let mut clone = grid.clone();
3676        clone[(0, 2)] = 10;
3677        test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
3678        test_grid(&clone, 2, 3, Order::RowMajor, &[1, 2, 10, 4, 5, 6]);
3679    }
3680
3681    #[cfg(feature = "std")]
3682    #[test]
3683    fn hash_std() {
3684        let mut set = std::collections::HashSet::new();
3685        set.insert(grid![[1,2,3][4,5,6]]);
3686        set.insert(grid![[1,3,3][4,5,6]]);
3687        set.insert(grid![[1,2,3][4,5,6]]);
3688        assert_eq!(set.len(), 2);
3689    }
3690
3691    #[test]
3692    fn macro_init() {
3693        let grid = grid![[1, 2, 3][4, 5, 6]];
3694        test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6]);
3695    }
3696
3697    #[test]
3698    fn macro_init_2() {
3699        let grid = grid![[1, 2, 3]
3700                         [4, 5, 6]
3701                         [7, 8, 9]];
3702        test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 3, 4, 5, 6, 7, 8, 9]);
3703    }
3704
3705    #[test]
3706    fn macro_init_char() {
3707        let grid = grid![['a', 'b', 'c']
3708                         ['a', 'b', 'c']
3709                         ['a', 'b', 'c']];
3710        let expected = ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'];
3711        test_grid(&grid, 3, 3, Order::RowMajor, &expected);
3712    }
3713
3714    #[test]
3715    fn macro_one_row() {
3716        let grid: Grid<usize> = grid![[1, 2, 3, 4]];
3717        test_grid(&grid, 1, 4, Order::RowMajor, &[1, 2, 3, 4]);
3718    }
3719
3720    #[test]
3721    fn macro2_empty() {
3722        let grid: Grid<u8> = grid_cm![];
3723        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3724    }
3725
3726    #[test]
3727    fn macro2_init() {
3728        let grid = grid_cm![[1, 2, 3]
3729                          [4, 5, 6]
3730                          [7, 8, 9]];
3731        let expected = [1, 4, 7, 2, 5, 8, 3, 6, 9];
3732        test_grid(&grid, 3, 3, Order::ColumnMajor, &expected);
3733    }
3734
3735    #[test]
3736    fn macro2_init_char() {
3737        let grid = grid_cm![['a', 'b']['c', 'd']];
3738        test_grid(&grid, 2, 2, Order::ColumnMajor, &['a', 'c', 'b', 'd']);
3739    }
3740
3741    #[test]
3742    fn macro2_one_row() {
3743        let grid = grid_cm![[1, 2, 3, 4]];
3744        test_grid(&grid, 1, 4, Order::ColumnMajor, &[1, 2, 3, 4]);
3745    }
3746
3747    #[test]
3748    fn init() {
3749        let grid = Grid::init(1, 2, 3);
3750        test_grid(&grid, 1, 2, Order::RowMajor, &[3, 3]);
3751
3752        let grid = Grid::init(1, 2, 1.2);
3753        test_grid(&grid, 1, 2, Order::RowMajor, &[1.2, 1.2]);
3754
3755        let grid = Grid::init(1, 2, 'a');
3756        test_grid(&grid, 1, 2, Order::RowMajor, &['a', 'a']);
3757    }
3758
3759    #[test]
3760    #[should_panic]
3761    #[allow(clippy::should_panic_without_expect)]
3762    fn init_panics() {
3763        Grid::init(usize::MAX, 2, 3);
3764    }
3765
3766    #[test]
3767    fn init_empty() {
3768        let grid = Grid::init(0, 1, 0);
3769        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3770
3771        let grid = Grid::init(1, 0, -1);
3772        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3773    }
3774
3775    #[test]
3776    fn init_with_order() {
3777        let grid = Grid::init_with_order(1, 2, Order::RowMajor, 3);
3778        test_grid(&grid, 1, 2, Order::RowMajor, &[3, 3]);
3779
3780        let grid = Grid::init_with_order(1, 2, Order::ColumnMajor, 1.2);
3781        test_grid(&grid, 1, 2, Order::ColumnMajor, &[1.2, 1.2]);
3782
3783        let grid = Grid::init_with_order(1, 2, Order::ColumnMajor, 'a');
3784        test_grid(&grid, 1, 2, Order::ColumnMajor, &['a', 'a']);
3785    }
3786
3787    #[test]
3788    #[should_panic]
3789    #[allow(clippy::should_panic_without_expect)]
3790    fn init_with_order_panics() {
3791        Grid::init_with_order(usize::MAX, 2, Order::ColumnMajor, 3);
3792    }
3793
3794    #[test]
3795    fn init_with_order_empty() {
3796        let grid = Grid::init_with_order(0, 1, Order::ColumnMajor, 0);
3797        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3798
3799        let grid = Grid::init_with_order(1, 0, Order::RowMajor, -1);
3800        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3801    }
3802
3803    #[test]
3804    fn new() {
3805        let grid: Grid<u8> = Grid::new(1, 2);
3806        test_grid(&grid, 1, 2, Order::RowMajor, &[0, 0]);
3807    }
3808
3809    #[test]
3810    #[should_panic]
3811    #[allow(clippy::should_panic_without_expect)]
3812    fn new_panics() {
3813        let _: Grid<u8> = Grid::new(usize::MAX, 2);
3814    }
3815
3816    #[test]
3817    fn new_empty() {
3818        let grid: Grid<u8> = Grid::new(0, 1);
3819        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3820
3821        let grid: Grid<u8> = Grid::new(1, 0);
3822        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3823    }
3824
3825    #[test]
3826    fn new_with_order() {
3827        let grid: Grid<u8> = Grid::new_with_order(2, 2, Order::ColumnMajor);
3828        test_grid(&grid, 2, 2, Order::ColumnMajor, &[0, 0, 0, 0]);
3829    }
3830
3831    #[test]
3832    #[should_panic]
3833    #[allow(clippy::should_panic_without_expect)]
3834    fn new_with_order_panics() {
3835        let _: Grid<u8> = Grid::new_with_order(usize::MAX, 2, Order::ColumnMajor);
3836    }
3837
3838    #[test]
3839    fn new_with_order_empty() {
3840        let grid: Grid<u8> = Grid::new_with_order(0, 3, Order::RowMajor);
3841        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
3842
3843        let grid: Grid<u8> = Grid::new_with_order(3, 0, Order::ColumnMajor);
3844        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
3845    }
3846
3847    #[test]
3848    fn with_capacity() {
3849        // doesn't impl Default
3850        struct Foo();
3851
3852        let grid: Grid<Foo> = Grid::with_capacity(20, 20);
3853        assert!(grid.is_empty());
3854        assert_eq!(grid.order(), Order::default());
3855    }
3856
3857    #[test]
3858    fn with_capacity_and_order() {
3859        // doesn't impl Default
3860        struct Foo();
3861
3862        let grid: Grid<Foo> = Grid::with_capacity_and_order(20, 20, Order::ColumnMajor);
3863        assert!(grid.is_empty());
3864        assert_eq!(grid.order(), Order::ColumnMajor);
3865    }
3866
3867    #[test]
3868    #[should_panic]
3869    #[allow(clippy::should_panic_without_expect)]
3870    fn with_capacity_panics_internal() {
3871        // doesn't impl Default
3872        struct Foo();
3873
3874        let _grid: Grid<Foo> = Grid::with_capacity_and_order(usize::MAX, 2, Order::RowMajor);
3875    }
3876
3877    #[test]
3878    #[should_panic]
3879    #[allow(clippy::should_panic_without_expect)]
3880    fn with_capacity_panics_vec() {
3881        let rows: usize = isize::MAX.try_into().expect("isize::MAX is positive");
3882        assert!(
3883            core::mem::size_of::<u8>() * rows < usize::MAX,
3884            "shows that panic is from Vec::with_capacity, not internal check"
3885        );
3886
3887        let _grid: Grid<u8> = Grid::with_capacity_and_order(rows, 2, Order::RowMajor);
3888    }
3889
3890    #[test]
3891    fn get() {
3892        let grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3893        assert_eq!(grid.get(0_i64, 1_i32), Some(&2));
3894    }
3895
3896    #[test]
3897    fn get_column_major() {
3898        let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3899        assert_eq!(grid.get(1, 0), Some(&2));
3900    }
3901
3902    #[test]
3903    fn get_none() {
3904        let grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3905        assert_eq!(grid.get(1, 0), None);
3906    }
3907
3908    #[test]
3909    fn get_none_column_major() {
3910        let grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3911        assert_eq!(grid.get(0, 1), None);
3912    }
3913
3914    #[test]
3915    fn get_mut() {
3916        let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3917        assert_eq!(grid.get_mut(0_i64, 1_i32), Some(&mut 2));
3918    }
3919
3920    #[test]
3921    fn get_mut_column_major() {
3922        let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3923        assert_eq!(grid.get_mut(1, 0), Some(&mut 2));
3924    }
3925
3926    #[test]
3927    fn get_mut_none() {
3928        let mut grid = Grid::from_vec_with_order(vec![1, 2], 2, Order::RowMajor);
3929        assert_eq!(grid.get_mut(1, 0), None);
3930    }
3931
3932    #[test]
3933    fn get_mut_none_column_major() {
3934        let mut grid = Grid::from_vec_with_order(vec![1, 2], 1, Order::ColumnMajor);
3935        assert_eq!(grid.get_mut(0, 1), None);
3936    }
3937
3938    #[test]
3939    fn idx_tup() {
3940        let grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
3941        assert_eq!(grid[(0, 0)], 1);
3942        assert_eq!(grid[(0, 1)], 2);
3943        assert_eq!(grid[(1, 0)], 3);
3944        assert_eq!(grid[(1, 1)], 4);
3945    }
3946
3947    #[test]
3948    #[should_panic]
3949    #[allow(clippy::should_panic_without_expect)]
3950    fn idx_tup_panic_1() {
3951        let grid = Grid::init(1, 2, 3);
3952        let _ = grid[(20, 0)];
3953    }
3954
3955    #[test]
3956    #[should_panic]
3957    #[allow(clippy::should_panic_without_expect)]
3958    fn idx_tup_panic_2() {
3959        let grid = Grid::init(1, 2, 3);
3960        let _ = grid[(0, 20)];
3961    }
3962
3963    #[test]
3964    fn idx_tup_set() {
3965        let mut grid = Grid::init(1, 2, 3);
3966        grid[(0, 0)] = 4;
3967        assert_eq!(grid[(0, 0)], 4);
3968    }
3969
3970    #[test]
3971    fn size() {
3972        let grid = Grid::init(1, 2, 3);
3973        assert_eq!(grid.size(), (1, 2));
3974    }
3975
3976    #[test]
3977    fn transpose() {
3978        let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3979        grid.transpose();
3980        assert_eq!(grid, grid![[1,4][2,5][3,6]]);
3981    }
3982
3983    #[test]
3984    fn fill() {
3985        let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3986        grid.fill(7);
3987        test_grid(&grid, 2, 3, Order::RowMajor, &[7, 7, 7, 7, 7, 7]);
3988    }
3989
3990    #[test]
3991    fn fill_with() {
3992        let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
3993        grid.fill_with(Default::default);
3994        test_grid(&grid, 2, 3, Order::RowMajor, &[0, 0, 0, 0, 0, 0]);
3995    }
3996
3997    #[test]
3998    fn map() {
3999        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4000        let mapped = grid.map(|x| x * 2);
4001        test_grid(&mapped, 2, 3, Order::RowMajor, &[2, 4, 6, 8, 10, 12]);
4002    }
4003
4004    #[test]
4005    fn map_ref() {
4006        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4007        let mapped = grid.map_ref(|x| *x * 2);
4008        test_grid(&mapped, 2, 3, Order::RowMajor, &[2, 4, 6, 8, 10, 12]);
4009    }
4010
4011    #[test]
4012    #[allow(clippy::redundant_closure_for_method_calls)]
4013    fn iter_rows() {
4014        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4015        let max_by_row: Vec<u8> = grid
4016            .iter_rows()
4017            .map(|row| row.max().unwrap())
4018            .copied()
4019            .collect();
4020        assert_eq!(max_by_row, vec![3, 6]);
4021
4022        let sum_by_row: Vec<u8> = grid.iter_rows().map(|row| row.sum()).collect();
4023        assert_eq!(sum_by_row, vec![1 + 2 + 3, 4 + 5 + 6]);
4024    }
4025
4026    #[test]
4027    #[allow(clippy::redundant_closure_for_method_calls)]
4028    fn iter_rows_rev() {
4029        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4030        let max_by_row: Vec<u8> = grid
4031            .iter_rows()
4032            .rev()
4033            .map(|row| row.max().unwrap())
4034            .copied()
4035            .collect();
4036        assert_eq!(max_by_row, vec![6, 3]);
4037
4038        let sum_by_row: Vec<u8> = grid.iter_rows().rev().map(|row| row.sum()).collect();
4039        assert_eq!(sum_by_row, vec![4 + 5 + 6, 1 + 2 + 3]);
4040    }
4041
4042    #[test]
4043    fn iter_rows_exact_size() {
4044        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4045        let mut row_iter = grid.iter_rows();
4046        assert_eq!(row_iter.len(), 2);
4047        assert!(row_iter.next().is_some());
4048        assert_eq!(row_iter.len(), 1);
4049        assert!(row_iter.next().is_some());
4050        assert_eq!(row_iter.len(), 0);
4051        assert!(row_iter.next().is_none());
4052    }
4053
4054    #[test]
4055    #[allow(clippy::redundant_closure_for_method_calls)]
4056    fn iter_cols() {
4057        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4058        let max_by_col: Vec<u8> = grid
4059            .iter_cols()
4060            .map(|col| col.max().unwrap())
4061            .copied()
4062            .collect();
4063
4064        assert_eq!(max_by_col, vec![4, 5, 6]);
4065
4066        let sum_by_col: Vec<u8> = grid.iter_cols().map(|row| row.sum()).collect();
4067        assert_eq!(sum_by_col, vec![1 + 4, 2 + 5, 3 + 6]);
4068    }
4069
4070    #[test]
4071    #[allow(clippy::redundant_closure_for_method_calls)]
4072    fn iter_cols_rev() {
4073        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4074        let max_by_col: Vec<u8> = grid
4075            .iter_cols()
4076            .rev()
4077            .map(|col| col.max().unwrap())
4078            .copied()
4079            .collect();
4080
4081        assert_eq!(max_by_col, vec![6, 5, 4]);
4082
4083        let sum_by_col: Vec<u8> = grid.iter_cols().rev().map(|row| row.sum()).collect();
4084        assert_eq!(sum_by_col, vec![3 + 6, 2 + 5, 1 + 4]);
4085    }
4086
4087    #[test]
4088    fn iter_cols_exact_size() {
4089        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
4090        let mut col_iter = grid.iter_cols();
4091        assert_eq!(col_iter.len(), 3);
4092        assert!(col_iter.next().is_some());
4093        assert_eq!(col_iter.len(), 2);
4094        assert!(col_iter.next().is_some());
4095        assert_eq!(col_iter.len(), 1);
4096        assert!(col_iter.next().is_some());
4097        assert_eq!(col_iter.len(), 0);
4098        assert!(col_iter.next().is_none());
4099    }
4100
4101    #[test]
4102    fn remove_row() {
4103        let mut grid = grid![[1,2][3,4][5,6]];
4104        assert_eq![grid.remove_row(1), Some(vec![3, 4])];
4105        test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 5, 6]);
4106        assert_eq![grid.remove_row(0), Some(vec![1, 2])];
4107        test_grid(&grid, 1, 2, Order::RowMajor, &[5, 6]);
4108        assert_eq![grid.remove_row(0), Some(vec![5, 6])];
4109        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4110        assert_eq![grid.remove_row(0), None];
4111        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4112    }
4113
4114    #[test]
4115    fn remove_row_out_of_bound() {
4116        let mut grid = grid![[1, 2][3, 4]];
4117        assert_eq![grid.remove_row(5), None];
4118        test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
4119        assert_eq![grid.remove_row(1), Some(vec![3, 4])];
4120        test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
4121    }
4122
4123    #[test]
4124    fn remove_row_column_major() {
4125        let mut grid = Grid::from_vec_with_order(vec![1, 3, 5, 2, 4, 6], 2, Order::ColumnMajor);
4126        assert_eq![grid.remove_row(1), Some(vec![3, 4])];
4127        test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 5, 2, 6]);
4128        assert_eq![grid.remove_row(0), Some(vec![1, 2])];
4129        test_grid(&grid, 1, 2, Order::ColumnMajor, &[5, 6]);
4130        assert_eq![grid.remove_row(0), Some(vec![5, 6])];
4131        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4132        assert_eq![grid.remove_row(0), None];
4133        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4134    }
4135
4136    #[test]
4137    fn remove_row_out_of_bound_column_major() {
4138        let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
4139        assert_eq![grid.remove_row(5), None];
4140        test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
4141        assert_eq![grid.remove_row(1), Some(vec![3, 4])];
4142        test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
4143    }
4144
4145    #[test]
4146    fn remove_col() {
4147        let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
4148        assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])];
4149        let expected = [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15];
4150        test_grid(&grid, 4, 3, Order::RowMajor, &expected);
4151        assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])];
4152        test_grid(&grid, 4, 2, Order::RowMajor, &[2, 3, 6, 7, 10, 11, 14, 15]);
4153        assert_eq![grid.remove_col(1), Some(vec![3, 7, 11, 15])];
4154        test_grid(&grid, 4, 1, Order::RowMajor, &[2, 6, 10, 14]);
4155        assert_eq![grid.remove_col(0), Some(vec![2, 6, 10, 14])];
4156        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4157        assert_eq![grid.remove_col(0), None];
4158        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4159    }
4160
4161    #[test]
4162    fn remove_col_out_of_bound() {
4163        let mut grid = grid![[1, 2][3, 4]];
4164        assert_eq!(grid.remove_col(5), None);
4165        test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
4166        assert_eq!(grid.remove_col(1), Some(vec![2, 4]));
4167        test_grid(&grid, 2, 1, Order::RowMajor, &[1, 3]);
4168    }
4169
4170    #[test]
4171    fn remove_col_column_major() {
4172        let internal = vec![1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16];
4173        let mut grid = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
4174        assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])];
4175        let expected = [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15];
4176        test_grid(&grid, 4, 3, Order::ColumnMajor, &expected);
4177        assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])];
4178        let expected = [2, 6, 10, 14, 3, 7, 11, 15];
4179        test_grid(&grid, 4, 2, Order::ColumnMajor, &expected);
4180        assert_eq![grid.remove_col(1), Some(vec![3, 7, 11, 15])];
4181        test_grid(&grid, 4, 1, Order::ColumnMajor, &[2, 6, 10, 14]);
4182        assert_eq![grid.remove_col(0), Some(vec![2, 6, 10, 14])];
4183        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4184        assert_eq![grid.remove_col(0), None];
4185        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4186    }
4187
4188    #[test]
4189    fn remove_col_out_of_bound_column_major() {
4190        let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
4191        assert_eq!(grid.remove_col(5), None);
4192        test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
4193        assert_eq!(grid.remove_col(1), Some(vec![2, 4]));
4194        test_grid(&grid, 2, 1, Order::ColumnMajor, &[1, 3]);
4195    }
4196
4197    #[test]
4198    fn delete_row() {
4199        let mut grid = grid![[1,2][3,4][5,6]];
4200        assert!(grid.delete_row(1));
4201        test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 5, 6]);
4202        assert!(grid.delete_row(0));
4203        test_grid(&grid, 1, 2, Order::RowMajor, &[5, 6]);
4204        assert!(grid.delete_row(0));
4205        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4206        assert!(!grid.delete_row(0));
4207        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4208    }
4209
4210    #[test]
4211    fn delete_row_out_of_bound() {
4212        let mut grid = grid![[1, 2][3, 4]];
4213        assert!(!grid.delete_row(5));
4214        test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
4215        assert!(grid.delete_row(1));
4216        test_grid(&grid, 1, 2, Order::RowMajor, &[1, 2]);
4217    }
4218
4219    #[test]
4220    fn delete_row_column_major() {
4221        let mut grid = Grid::from_vec_with_order(vec![1, 3, 5, 2, 4, 6], 2, Order::ColumnMajor);
4222        assert!(grid.delete_row(1));
4223        test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 5, 2, 6]);
4224        assert!(grid.delete_row(0));
4225        test_grid(&grid, 1, 2, Order::ColumnMajor, &[5, 6]);
4226        assert!(grid.delete_row(0));
4227        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4228        assert!(!grid.delete_row(0));
4229        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4230    }
4231
4232    #[test]
4233    fn delete_row_out_of_bound_column_major() {
4234        let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
4235        assert!(!grid.delete_row(5));
4236        test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
4237        assert!(grid.delete_row(1));
4238        test_grid(&grid, 1, 2, Order::ColumnMajor, &[1, 2]);
4239    }
4240
4241    #[test]
4242    fn delete_col() {
4243        let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
4244        assert!(grid.delete_col(3));
4245        let expected = [1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15];
4246        test_grid(&grid, 4, 3, Order::RowMajor, &expected);
4247        assert!(grid.delete_col(0));
4248        test_grid(&grid, 4, 2, Order::RowMajor, &[2, 3, 6, 7, 10, 11, 14, 15]);
4249        assert!(grid.delete_col(1));
4250        test_grid(&grid, 4, 1, Order::RowMajor, &[2, 6, 10, 14]);
4251        assert!(grid.delete_col(0));
4252        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4253        assert!(!grid.delete_col(0));
4254        test_grid(&grid, 0, 0, Order::RowMajor, &[]);
4255    }
4256
4257    #[test]
4258    fn delete_col_out_of_bound() {
4259        let mut grid = grid![[1, 2][3, 4]];
4260        assert!(!grid.delete_col(5));
4261        test_grid(&grid, 2, 2, Order::RowMajor, &[1, 2, 3, 4]);
4262        assert!(grid.delete_col(1));
4263        test_grid(&grid, 2, 1, Order::RowMajor, &[1, 3]);
4264    }
4265
4266    #[test]
4267    fn delete_col_column_major() {
4268        let internal = vec![1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16];
4269        let mut grid = Grid::from_vec_with_order(internal, 4, Order::ColumnMajor);
4270        assert!(grid.delete_col(3));
4271        let expected = [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15];
4272        test_grid(&grid, 4, 3, Order::ColumnMajor, &expected);
4273        assert!(grid.delete_col(0));
4274        let expected = [2, 6, 10, 14, 3, 7, 11, 15];
4275        test_grid(&grid, 4, 2, Order::ColumnMajor, &expected);
4276        assert!(grid.delete_col(1));
4277        test_grid(&grid, 4, 1, Order::ColumnMajor, &[2, 6, 10, 14]);
4278        assert!(grid.delete_col(0));
4279        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4280        assert!(!grid.delete_col(0));
4281        test_grid(&grid, 0, 0, Order::ColumnMajor, &[]);
4282    }
4283
4284    #[test]
4285    fn delete_col_out_of_bound_column_major() {
4286        let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
4287        assert!(!grid.delete_col(5));
4288        test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
4289        assert!(grid.delete_col(1));
4290        test_grid(&grid, 2, 1, Order::ColumnMajor, &[1, 3]);
4291    }
4292
4293    #[test]
4294    fn delete_row_multiple() {
4295        // Test deleting multiple rows to ensure correctness
4296        let mut grid = grid![[1,2,3][4,5,6][7,8,9][10,11,12]];
4297        assert!(grid.delete_row(2));
4298        test_grid(
4299            &grid,
4300            3,
4301            3,
4302            Order::RowMajor,
4303            &[1, 2, 3, 4, 5, 6, 10, 11, 12],
4304        );
4305        assert!(grid.delete_row(1));
4306        test_grid(&grid, 2, 3, Order::RowMajor, &[1, 2, 3, 10, 11, 12]);
4307        assert!(grid.delete_row(0));
4308        test_grid(&grid, 1, 3, Order::RowMajor, &[10, 11, 12]);
4309    }
4310
4311    #[test]
4312    fn delete_col_multiple() {
4313        // Test deleting multiple columns to ensure correctness
4314        let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12]];
4315        assert!(grid.delete_col(2));
4316        test_grid(&grid, 3, 3, Order::RowMajor, &[1, 2, 4, 5, 6, 8, 9, 10, 12]);
4317        assert!(grid.delete_col(1));
4318        test_grid(&grid, 3, 2, Order::RowMajor, &[1, 4, 5, 8, 9, 12]);
4319        assert!(grid.delete_col(0));
4320        test_grid(&grid, 3, 1, Order::RowMajor, &[4, 8, 12]);
4321    }
4322
4323    #[test]
4324    fn delete_row_vs_remove_row_equivalence() {
4325        // Verify delete_row produces same result as remove_row
4326        let mut grid1 = grid![[1,2][3,4][5,6]];
4327        let mut grid2 = grid![[1,2][3,4][5,6]];
4328
4329        grid1.delete_row(1);
4330        let _ = grid2.remove_row(1);
4331        assert_eq!(grid1, grid2);
4332    }
4333
4334    #[test]
4335    fn delete_col_vs_remove_col_equivalence() {
4336        // Verify delete_col produces same result as remove_col
4337        let mut grid1 = grid![[1,2,3][4,5,6][7,8,9]];
4338        let mut grid2 = grid![[1,2,3][4,5,6][7,8,9]];
4339
4340        grid1.delete_col(1);
4341        let _ = grid2.remove_col(1);
4342        assert_eq!(grid1, grid2);
4343    }
4344
4345    #[test]
4346    fn flip_cols() {
4347        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
4348        grid.flip_cols();
4349        test_grid(&grid, 2, 2, Order::RowMajor, &[2, 1, 4, 3]);
4350    }
4351
4352    #[test]
4353    fn flip_cols_column_major() {
4354        let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
4355        grid.flip_cols();
4356        test_grid(&grid, 2, 2, Order::ColumnMajor, &[2, 4, 1, 3]);
4357    }
4358
4359    #[test]
4360    fn flip_rows() {
4361        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4], 2, Order::RowMajor);
4362        grid.flip_rows();
4363        test_grid(&grid, 2, 2, Order::RowMajor, &[3, 4, 1, 2]);
4364    }
4365
4366    #[test]
4367    fn flip_rows_column_major() {
4368        let mut grid = Grid::from_vec_with_order(vec![1, 3, 2, 4], 2, Order::ColumnMajor);
4369        grid.flip_rows();
4370        test_grid(&grid, 2, 2, Order::ColumnMajor, &[3, 1, 4, 2]);
4371    }
4372
4373    #[test]
4374    fn rotate_left() {
4375        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
4376        grid.rotate_left();
4377        test_grid(&grid, 3, 2, Order::ColumnMajor, &[3, 2, 1, 6, 5, 4]);
4378        assert_eq!(grid, grid![[3,6][2,5][1,4]]);
4379    }
4380
4381    #[test]
4382    fn rotate_left_column_major() {
4383        let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
4384        grid.rotate_left();
4385        test_grid(&grid, 3, 2, Order::RowMajor, &[3, 6, 2, 5, 1, 4]);
4386        assert_eq!(grid, grid![[3,6][2,5][1,4]]);
4387    }
4388
4389    #[test]
4390    fn rotate_right() {
4391        let mut grid = Grid::from_vec_with_order(vec![1, 2, 3, 4, 5, 6], 3, Order::RowMajor);
4392        grid.rotate_right();
4393        test_grid(&grid, 3, 2, Order::ColumnMajor, &[4, 5, 6, 1, 2, 3]);
4394        assert_eq!(grid, grid![[4,1][5,2][6,3]]);
4395    }
4396
4397    #[test]
4398    fn rotate_right_column_major() {
4399        let mut grid = Grid::from_vec_with_order(vec![1, 4, 2, 5, 3, 6], 3, Order::ColumnMajor);
4400        grid.rotate_right();
4401        test_grid(&grid, 3, 2, Order::RowMajor, &[4, 1, 5, 2, 6, 3]);
4402        assert_eq!(grid, grid![[4,1][5,2][6,3]]);
4403    }
4404
4405    #[test]
4406    fn iter_cols_clone() {
4407        let grid = grid![[1,2,3][4,5,6]];
4408        let mut cols = grid.iter_cols().skip(1);
4409        let c3: u8 = cols.clone().nth(1).unwrap().sum();
4410        let c2: u8 = cols.next().unwrap().sum();
4411        assert_eq!(c2, 2 + 5);
4412        assert_eq!(c3, 3 + 6);
4413    }
4414
4415    #[test]
4416    fn iter_rows_clone() {
4417        let grid = grid![[1,2,3][4,5,6][7,8,9]];
4418        let mut rows = grid.iter_rows().skip(1);
4419        let r3: u8 = rows.clone().nth(1).unwrap().sum();
4420        let r2: u8 = rows.next().unwrap().sum();
4421        assert_eq!(r2, 4 + 5 + 6);
4422        assert_eq!(r3, 7 + 8 + 9);
4423    }
4424
4425    #[test]
4426    fn swap() {
4427        let mut grid = grid![[1,2][4,5]];
4428        grid.swap((0, 0), (1, 0));
4429        let end_grid = grid![[4,2][1,5]];
4430        assert_eq!(grid, end_grid);
4431    }
4432
4433    #[test]
4434    #[should_panic(expected = "grid index out of bounds: (2,0) out of (2,2)")]
4435    fn swap_out_of_bounds() {
4436        let mut grid = grid![[1,2][4,5]];
4437        grid.swap((0, 0), (2, 0));
4438    }
4439
4440    #[cfg(feature = "serde")]
4441    mod serde_tests {
4442        use super::*;
4443
4444        #[test]
4445        fn serialize() {
4446            let grid: Grid<u8> = grid![[1, 2][3, 4]];
4447            let s = serde_json::to_string(&grid).unwrap();
4448            assert_eq!(s, r#"{"cols":2,"data":[1,2,3,4],"order":"RowMajor"}"#);
4449        }
4450
4451        #[test]
4452        fn deserialize() {
4453            let s = "{ \"cols\": 2, \"data\": [1, 2, 3, 4] }";
4454            let grid: Grid<u8> = serde_json::from_str(s).unwrap();
4455            assert_eq!(grid, grid![[1, 2][3, 4]]);
4456        }
4457
4458        #[test]
4459        fn deserialize_with_order() {
4460            let s = "{ \"cols\": 2, \"data\": [1, 3, 2, 4], \"order\": \"ColumnMajor\" }";
4461            let grid: Grid<u8> = serde_json::from_str(s).unwrap();
4462            test_grid(&grid, 2, 2, Order::ColumnMajor, &[1, 3, 2, 4]);
4463        }
4464    }
4465}