grid/
lib.rs

1#![warn(clippy::all, clippy::pedantic)]
2
3/*!
4# Two Dimensional Grid
5Continuous growable 2D data structure.
6The purpose of this crate is to provide an universal data structure that is faster,
7uses less memory, and is easier to use than a naive `Vec<Vec<T>>` solution.
8
9Similar to *C-like* arrays `grid` uses a flat 1D `Vec<T>` data structure to have a continuous
10memory data layout. See also [this](https://stackoverflow.com/questions/17259877/1d-or-2d-array-whats-faster)
11explanation of why you should probably use a one-dimensional array approach.
12
13Note that this crate uses a [*row-major*](https://eli.thegreenplace.net/2015/memory-layout-of-multi-dimensional-arrays) memory layout.
14Therefore, `grid.push_row()` is way faster then the `grid.push_col()` operation.
15
16This crate will always provide a 2D data structure. If you need three or more dimensions take a look at the
17[ndarray](https://docs.rs/ndarray/0.13.0/ndarray/) library. The `grid` create is a container for all kind of data.
18If you need to perform matrix operations, you are better of with a linear algebra lib, such as
19[cgmath](https://docs.rs/cgmath/0.17.0/cgmath/) or [nalgebra](https://docs.rs/nalgebra/0.21.0/nalgebra/).
20No other dependencies except for the std lib are used.
21Most of the functions `std::Vec<T>` offer are also implemented in `grid` and slightly modified for a 2D data object.
22# Examples
23```
24use grid::*;
25let mut grid = grid![[1,2,3]
26                     [4,5,6]];
27assert_eq!(grid, Grid::from_vec(vec![1,2,3,4,5,6],3));
28assert_eq!(grid.get(0,2), Some(&3));
29assert_eq!(grid[1][1], 5);
30assert_eq!(grid.size(), (2,3));
31grid.push_row(vec![7,8,9]);
32assert_eq!(grid, grid![[1,2,3][4,5,6][7,8,9]])
33 ```
34*/
35
36#![cfg_attr(not(feature = "std"), no_std)]
37
38#[cfg(all(not(feature = "std")))]
39extern crate alloc;
40#[cfg(all(not(feature = "std")))]
41use alloc::{format, vec, vec::Vec};
42#[cfg(feature = "serde")]
43use serde::{
44    ser::{Serialize, Serializer, SerializeStruct},
45    de::{self, Deserialize, Deserializer, Visitor, SeqAccess, MapAccess}
46};
47
48use core::cmp;
49use core::cmp::Eq;
50use core::fmt;
51use core::iter::StepBy;
52use core::ops::Index;
53use core::ops::IndexMut;
54use core::slice::Iter;
55use core::slice::IterMut;
56
57#[doc(hidden)]
58#[macro_export]
59macro_rules! count {
60    () => (0usize);
61    ( $x:tt $($xs:tt)* ) => (1usize + $crate::count!($($xs)*));
62}
63
64/// Init a grid with values.
65///
66/// Each array within `[]` represents a row starting from top to button.
67///
68/// # Examples
69///
70/// In this example a grid of numbers from 1 to 9 is created:
71///
72///  
73/// ```
74/// use grid::grid;
75/// let grid = grid![[1, 2, 3]
76/// [4, 5, 6]
77/// [7, 8, 9]];
78/// assert_eq!(grid.size(), (3, 3))
79/// ```
80///
81/// # Examples
82///
83/// Not that each row must be of the same length. The following example will not compile:  
84///  
85/// ``` ignore
86/// use grid::grid;
87/// let grid = grid![[1, 2, 3]
88/// [4, 5] // This does not work!
89/// [7, 8, 9]];
90/// ```
91#[macro_export]
92macro_rules! grid {
93    () => {
94        $crate::Grid::from_vec(vec![], 0)
95    };
96    ( [$( $x:expr ),* ]) => { {
97        let vec = vec![$($x),*];
98        let len  = vec.len();
99        $crate::Grid::from_vec(vec, len)
100    } };
101    ( [$( $x0:expr ),*] $([$( $x:expr ),*])* ) => {
102        {
103            let mut _assert_width0 = [(); $crate::count!($($x0)*)];
104            let cols = $crate::count!($($x0)*);
105            let rows = 1usize;
106
107            $(
108                let _assert_width = [(); $crate::count!($($x)*)];
109                _assert_width0 = _assert_width;
110                let rows = rows + 1usize;
111            )*
112
113            let mut vec = Vec::with_capacity(rows.checked_mul(cols).unwrap());
114
115            $( vec.push($x0); )*
116            $( $( vec.push($x); )* )*
117
118            $crate::Grid::from_vec(vec, cols)
119        }
120    };
121}
122
123/// Stores elements of a certain type in a 2D grid structure.
124///
125/// Uses a rust `Vec<T>` type to reference the grid data on the heap.
126/// Also the number of rows and columns are stored in the grid data structure.
127///
128/// The size limit of a grid is `rows * cols < usize`.
129///
130/// The grid data is stored in a row-major memory layout.
131pub struct Grid<T> {
132    data: Vec<T>,
133    cols: usize,
134    rows: usize,
135}
136
137#[cfg(feature = "serde")]
138impl<'de, T: Deserialize<'de>> Deserialize<'de> for Grid<T> {
139
140    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
141    where
142        D: Deserializer<'de>,
143    {
144        use std::marker::PhantomData;
145        #[derive(serde::Deserialize)]
146        #[serde(field_identifier, rename_all = "lowercase")]
147        enum Field { Data, Cols }
148
149        struct GridVisitor<T> {
150            _p: PhantomData<T>,
151        }
152
153        impl<'de, T: Deserialize<'de>> Visitor<'de> for GridVisitor<T> {
154            type Value = Grid<T>;
155
156            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
157                formatter.write_str("struct Grid")
158            }
159
160            fn visit_seq<V>(self, mut seq: V) -> Result<Grid<T>, V::Error>
161            where
162                V: SeqAccess<'de>,
163            {
164                let cols = seq.next_element()?
165                    .ok_or_else(|| de::Error::invalid_length(0, &self))?;
166                let data = seq.next_element()?
167                    .ok_or_else(|| de::Error::invalid_length(1, &self))?;
168                Ok(Grid::from_vec(data, cols))
169            }
170
171            fn visit_map<V>(self, mut map: V) -> Result<Grid<T>, V::Error>
172            where
173                V: MapAccess<'de>,
174            {
175                let mut cols = None;
176                let mut data = None;
177                while let Some(key) = map.next_key()? {
178                    match key {
179                        Field::Data => {
180                            if data.is_some() {
181                                return Err(de::Error::duplicate_field("data"));
182                            }
183                            data = Some(map.next_value()?);
184                        }
185                        Field::Cols => {
186                            if cols.is_some() {
187                                return Err(de::Error::duplicate_field("cols"));
188                            }
189                            cols = Some(map.next_value()?);
190                        }
191                    }
192                }
193                let cols = cols.ok_or_else(|| de::Error::missing_field("cols"))?;
194                let data = data.ok_or_else(|| de::Error::missing_field("data"))?;
195                Ok(Grid::from_vec(data, cols))
196            }
197        }
198
199        const FIELDS: &'static [&'static str] = &["cols", "data"];
200        deserializer.deserialize_struct("Grid", FIELDS, GridVisitor{ _p: PhantomData})
201    }
202}
203
204#[cfg(feature = "serde")]
205impl<T: Serialize> Serialize for Grid<T> {
206    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
207    where
208        S: Serializer,
209    {
210        // 3 is the number of fields in the struct.
211        let mut state = serializer.serialize_struct("Grid", 3)?;
212        state.serialize_field("cols", &self.cols)?;
213        state.serialize_field("data", &self.data)?;
214        state.end()
215    }
216}
217
218impl<T> Grid<T> {
219    /// Init a grid of size rows x columns with default values of the given type.
220    /// For example this will generate a 2x3 grid of zeros:
221    ///
222    /// ```
223    /// use grid::Grid;
224    /// let grid : Grid<u8> = Grid::new(2,3);
225    /// assert_eq!(grid[0][0], 0);
226    /// ```
227    ///
228    /// If `rows == 0` or `cols == 0` the grid will be empty with no cols and rows.
229    ///
230    /// # Panics
231    ///
232    /// Panics if `rows * cols > usize`.
233    pub fn new(rows: usize, cols: usize) -> Grid<T>
234    where
235        T: Default,
236    {
237        if rows == 0 || cols == 0 {
238            return Grid {
239                data: Vec::new(),
240                rows: 0,
241                cols: 0,
242            };
243        }
244        let mut data = Vec::new();
245        data.resize_with(rows.checked_mul(cols).unwrap(), T::default);
246        Grid { data, cols, rows }
247    }
248
249    /// Init a grid of size rows x columns with the given data element.
250    ///
251    /// If `rows == 0` or `cols == 0` the grid will be empty with no cols and rows.
252    ///
253    /// # Panics
254    ///
255    /// Panics if `rows * cols > usize`.
256    pub fn init(rows: usize, cols: usize, data: T) -> Grid<T>
257    where
258        T: Clone,
259    {
260        if rows == 0 || cols == 0 {
261            return Grid {
262                data: Vec::new(),
263                rows: 0,
264                cols: 0,
265            };
266        }
267        Grid {
268            data: vec![data; rows.checked_mul(cols).unwrap()],
269            cols,
270            rows,
271        }
272    }
273
274    /// Returns a grid from a vector with a given column length.
275    /// The length of `vec` must be a multiple of `cols`.
276    ///
277    /// For example:
278    ///
279    /// ```
280    /// use grid::Grid;
281    /// let grid = Grid::from_vec(vec![1,2,3,4,5,6], 3);
282    /// assert_eq!(grid.size(), (2, 3));
283    /// ```
284    ///
285    /// will create a grid with the following layout:
286    /// \[1,2,3\]
287    /// \[4,5,6\]
288    ///
289    /// This example will fail, because `vec.len()` is not a multiple of `cols`:
290    ///
291    /// ``` should_panic
292    /// use grid::Grid;
293    /// Grid::from_vec(vec![1,2,3,4,5], 3);
294    /// ```
295    ///
296    /// # Panics
297    ///
298    /// This panics if the vector length isn't a multiple of the number of columns.
299    #[must_use]
300    pub fn from_vec(vec: Vec<T>, cols: usize) -> Grid<T> {
301        let rows = vec.len().checked_div(cols).unwrap_or(0);
302        assert_eq!(
303            rows * cols,
304            vec.len(),
305            "Vector length {:?} should be a multiple of cols = {:?}",
306            vec.len(),
307            cols
308        );
309        if rows == 0 || cols == 0 {
310            Grid {
311                data: vec,
312                rows: 0,
313                cols: 0,
314            }
315        } else {
316            Grid {
317                data: vec,
318                rows,
319                cols,
320            }
321        }
322    }
323
324    /// Returns a reference to an element, without performing bound checks.
325    /// Generally not recommended, use with caution!
326    ///
327    /// # Safety
328    ///
329    /// Calling this method with an out-of-bounds index is undefined behavior even if the resulting reference is not used.
330    #[inline]
331    #[must_use]
332    pub unsafe fn get_unchecked(&self, row: usize, col: usize) -> &T {
333        self.data.get_unchecked(row * self.cols + col)
334    }
335
336    /// Returns a mutable reference to an element, without performing bound checks.
337    /// Generally not recommended, use with caution!
338    ///
339    /// # Safety
340    ///
341    /// Calling this method with an out-of-bounds index is undefined behavior even if the resulting reference is not used.
342    #[inline]
343    #[must_use]
344    pub unsafe fn get_unchecked_mut(&mut self, row: usize, col: usize) -> &mut T {
345        self.data.get_unchecked_mut(row * self.cols + col)
346    }
347
348    /// Access a certain element in the grid.
349    /// Returns None if an element beyond the grid bounds is tried to be accessed.
350    #[must_use]
351    pub fn get(&self, row: usize, col: usize) -> Option<&T> {
352        if row < self.rows && col < self.cols {
353            unsafe { Some(self.get_unchecked(row, col)) }
354        } else {
355            None
356        }
357    }
358
359    /// Mutable access to a certain element in the grid.
360    /// Returns None if an element beyond the grid bounds is tried to be accessed.
361    #[must_use]
362    pub fn get_mut(&mut self, row: usize, col: usize) -> Option<&mut T> {
363        if row < self.rows && col < self.cols {
364            unsafe { Some(self.get_unchecked_mut(row, col)) }
365        } else {
366            None
367        }
368    }
369
370    /// Returns the size of the gird as a two element tuple.
371    /// First element are the number of rows and the second the columns.
372    #[must_use]
373    pub fn size(&self) -> (usize, usize) {
374        (self.rows, self.cols)
375    }
376
377    /// Returns the number of rows of the grid.
378    #[must_use]
379    pub fn rows(&self) -> usize {
380        self.rows
381    }
382
383    /// Returns the number of columns of the grid.
384    #[must_use]
385    pub fn cols(&self) -> usize {
386        self.cols
387    }
388
389    /// Returns true if the grid contains no elements.
390    /// For example:
391    /// ```
392    /// use grid::*;
393    /// let grid : Grid<u8> = grid![];
394    /// assert!(grid.is_empty());
395    /// ```
396    #[must_use]
397    pub fn is_empty(&self) -> bool {
398        self.data.is_empty()
399    }
400
401    /// Clears the grid.
402    pub fn clear(&mut self) {
403        self.rows = 0;
404        self.cols = 0;
405        self.data.clear();
406    }
407
408    /// Returns an iterator over the whole grid, starting from the first row and column.
409    /// ```
410    /// use grid::*;
411    /// let grid: Grid<u8> = grid![[1,2][3,4]];
412    /// let mut iter = grid.iter();
413    /// assert_eq!(iter.next(), Some(&1));
414    /// assert_eq!(iter.next(), Some(&2));
415    /// assert_eq!(iter.next(), Some(&3));
416    /// assert_eq!(iter.next(), Some(&4));
417    /// assert_eq!(iter.next(), None);
418    /// ```
419    pub fn iter(&self) -> Iter<T> {
420        self.data.iter()
421    }
422
423    /// Returns an mutable iterator over the whole grid that allows modifying each value.
424    /// ```
425    /// use grid::*;
426    /// let mut grid: Grid<u8> = grid![[1,2][3,4]];
427    /// let mut iter = grid.iter_mut();
428    /// let next = iter.next();
429    /// assert_eq!(next, Some(&mut 1));
430    /// *next.unwrap() = 10;
431    /// ```
432    pub fn iter_mut(&mut self) -> IterMut<T> {
433        self.data.iter_mut()
434    }
435
436    /// Returns an iterator over a column.
437    ///
438    /// # Examples
439    ///
440    /// ```
441    /// use grid::*;
442    /// let grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
443    /// let mut col_iter = grid.iter_col(1);
444    /// assert_eq!(col_iter.next(), Some(&2));
445    /// assert_eq!(col_iter.next(), Some(&4));
446    /// assert_eq!(col_iter.next(), None);
447    /// ```
448    ///
449    /// # Panics
450    ///
451    /// Panics if the col index is out of bounds.
452    pub fn iter_col(&self, col: usize) -> StepBy<Iter<T>> {
453        if col < self.cols {
454            return self.data[col..].iter().step_by(self.cols);
455        }
456        panic!(
457            "out of bounds. Column must be less than {:?}, but is {:?}.",
458            self.cols, col
459        )
460    }
461
462    /// Returns a mutable iterator over a column.
463    ///
464    /// # Examples
465    ///
466    /// ```
467    /// use grid::*;
468    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
469    /// let mut col_iter = grid.iter_col_mut(1);
470    /// let next = col_iter.next();
471    /// assert_eq!(next, Some(&mut 2));
472    /// *next.unwrap() = 10;
473    /// assert_eq!(grid[0][1], 10);
474    /// ```
475    ///
476    /// # Panics
477    ///
478    /// Panics if the col index is out of bounds.
479    pub fn iter_col_mut(&mut self, col: usize) -> StepBy<IterMut<T>> {
480        let cols = self.cols;
481        if col < cols {
482            return self.data[col..].iter_mut().step_by(cols);
483        }
484        panic!(
485            "out of bounds. Column must be less than {:?}, but is {:?}.",
486            self.cols, col
487        )
488    }
489
490    /// Returns an iterator over a row.
491    ///
492    /// # Examples
493    ///
494    /// ```
495    /// use grid::*;
496    /// let grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
497    /// let mut col_iter = grid.iter_row(1);
498    /// assert_eq!(col_iter.next(), Some(&3));
499    /// assert_eq!(col_iter.next(), Some(&4));
500    /// assert_eq!(col_iter.next(), Some(&5));
501    /// assert_eq!(col_iter.next(), None);
502    /// ```
503    ///
504    /// # Panics
505    ///
506    /// Panics if the row index is out of bounds.
507    pub fn iter_row(&self, row: usize) -> Iter<T> {
508        if row < self.rows {
509            let start = row * self.cols;
510            self.data[start..(start + self.cols)].iter()
511        } else {
512            panic!(
513                "out of bounds. Row must be less than {:?}, but is {:?}.",
514                self.rows, row
515            )
516        }
517    }
518
519    /// Returns a mutable iterator over a row.
520    ///
521    /// # Examples
522    ///
523    /// ```
524    /// use grid::*;
525    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
526    /// let mut col_iter = grid.iter_row_mut(1);
527    /// let next = col_iter.next();
528    /// *next.unwrap() = 10;
529    /// assert_eq!(grid[1][0], 10);
530    /// ```
531    ///
532    /// # Panics
533    ///
534    /// Panics if the row index is out of bounds.
535    pub fn iter_row_mut(&mut self, row: usize) -> IterMut<T> {
536        if row < self.rows {
537            let cols = self.cols;
538            let start = row * cols;
539            self.data[start..(start + cols)].iter_mut()
540        } else {
541            panic!(
542                "out of bounds. Row must be less than {:?}, but is {:?}.",
543                self.rows, row
544            )
545        }
546    }
547
548    /// Traverse the grid with row and column indexes.
549    ///
550    /// # Examples
551    ///
552    /// ```
553    /// use grid::*;
554    /// let grid: Grid<u8> = grid![[1,2][3,4]];
555    /// let mut iter = grid.indexed_iter();
556    /// assert_eq!(iter.next(), Some(((0, 0), &1)));
557    /// ```
558    ///
559    /// Or simply unpack in a `for`  loop:
560    ///
561    /// ```
562    /// use grid::*;
563    /// let grid: Grid<u8> = grid![[1,2][3,4]];
564    /// for ((row, col), i) in grid.indexed_iter() {
565    ///     println!("value at row {row} and column {col} is: {i}");
566    /// }
567    /// ```
568    pub fn indexed_iter(&self) -> impl Iterator<Item = ((usize, usize), &T)> {
569        self.data
570            .iter()
571            .enumerate()
572            .map(move |(idx, i)| ((idx / self.cols, idx % self.cols), i))
573    }
574
575    /// Add a new row to the grid.
576    ///
577    /// # Examples
578    ///
579    /// ```
580    /// use grid::*;
581    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
582    /// let row = vec![6,7,8];
583    /// grid.push_row(row);
584    /// assert_eq!(grid.rows(), 3);
585    /// assert_eq!(grid[2][0], 6);
586    /// assert_eq!(grid[2][1], 7);
587    /// assert_eq!(grid[2][2], 8);
588    /// ```
589    ///
590    /// Can also be used to init an empty grid:
591    ///
592    /// ```
593    /// use grid::*;
594    /// let mut grid: Grid<u8> = grid![];
595    /// let row = vec![1,2,3];
596    /// grid.push_row(row);
597    /// assert_eq!(grid.size(), (1, 3));
598    /// ```
599    ///
600    /// # Panics
601    ///
602    /// Panics if:
603    ///  - the grid is not empty and `row.len() != grid.cols()`
604    ///  - `row.len() == 0`
605    pub fn push_row(&mut self, row: Vec<T>) {
606        assert_ne!(row.len(), 0);
607        assert!(
608            !(self.rows > 0 && row.len() != self.cols),
609            "pushed row does not match. Length must be {:?}, but was {:?}.",
610            self.cols,
611            row.len()
612        );
613        self.data.extend(row);
614        self.rows += 1;
615        if self.cols == 0 {
616            self.cols = self.data.len();
617        }
618    }
619
620    /// Add a new column to the grid.
621    ///
622    /// *Important:*
623    /// Please note that `Grid` uses a Row-Major memory layout. Therefore, the `push_col()`
624    /// operation will be significantly slower compared to a `push_row()` operation.
625    ///
626    /// # Examples
627    ///
628    /// ```
629    /// use grid::*;
630    /// let mut grid: Grid<u8> = grid![[1, 2, 3][3, 4, 5]];
631    /// let col = vec![4,6];
632    /// grid.push_col(col);
633    /// assert_eq!(grid.cols(), 4);
634    /// assert_eq!(grid[0][3], 4);
635    /// assert_eq!(grid[1][3], 6);
636    /// ```
637    ///
638    /// Can also be used to init an empty grid:
639    ///
640    /// ```
641    /// use grid::*;
642    /// let mut grid: Grid<u8> = grid![];
643    /// let col = vec![1,2,3];
644    /// grid.push_col(col);
645    /// assert_eq!(grid.size(), (3, 1));
646    /// ```
647    ///
648    /// # Panics
649    ///
650    /// Panics if:
651    ///  - the grid is not empty and `col.len() != grid.rows()`
652    ///  - `col.len() == 0`
653    pub fn push_col(&mut self, col: Vec<T>) {
654        assert_ne!(col.len(), 0);
655        assert!(
656            !(self.cols > 0 && col.len() != self.rows),
657            "pushed column does not match. Length must be {:?}, but was {:?}.",
658            self.rows,
659            col.len()
660        );
661        self.data.extend(col);
662        for i in (1..self.rows).rev() {
663            let row_idx = i * self.cols;
664            self.data[row_idx..row_idx + self.cols + i].rotate_right(i);
665        }
666        self.cols += 1;
667        if self.rows == 0 {
668            self.rows = self.data.len();
669        }
670    }
671
672    /// Removes the last row from a grid and returns it, or None if it is empty.
673    ///
674    /// # Examples
675    /// ```
676    /// use grid::*;
677    /// let mut grid = grid![[1,2,3][4,5,6]];
678    /// assert_eq![grid.pop_row(), Some(vec![4,5,6])];
679    /// assert_eq![grid.pop_row(), Some(vec![1,2,3])];
680    /// assert_eq![grid.pop_row(), None];
681    /// ```
682    pub fn pop_row(&mut self) -> Option<Vec<T>> {
683        if self.rows == 0 {
684            return None;
685        }
686        let row = self.data.split_off((self.rows - 1) * self.cols);
687        self.rows -= 1;
688        if self.rows == 0 {
689            self.cols = 0;
690        }
691        Some(row)
692    }
693
694    /// Remove a Row at the index and return a vector of it.
695    ///
696    /// # Examples
697    /// ```
698    /// use grid::*;
699    /// let mut grid = grid![[1,2][3,4][5,6]];
700    /// assert_eq![grid.remove_row(1), Some(vec![3,4])];   
701    /// assert_eq![grid.remove_row(0), Some(vec![1,2])];
702    /// assert_eq![grid.remove_row(0), Some(vec![5,6])];
703    /// assert_eq![grid.remove_row(0), None];
704    /// ```
705    pub fn remove_row(&mut self, row_index: usize) -> Option<Vec<T>> {
706        if self.cols == 0 || self.rows == 0 || row_index >= self.rows {
707            return None;
708        }
709        let residue = self
710            .data
711            .drain((row_index * self.cols)..((row_index + 1) * self.cols));
712
713        self.rows -= 1;
714        if self.rows == 0 {
715            self.cols = 0;
716        }
717        Some(residue.collect())
718    }
719
720    /// Removes the last column from a grid and returns it, or None if it is empty.
721    ///
722    /// Note that this operation is much slower than the `pop_row()` because the memory layout
723    /// of `Grid` is row-major and removing a column requires a lot of move operations.
724    ///
725    /// # Examples
726    /// ```
727    /// use grid::*;
728    /// let mut grid = grid![[1,2,3][4,5,6]];
729    /// assert_eq![grid.pop_col(), Some(vec![3,6])];
730    /// assert_eq![grid.pop_col(), Some(vec![2,5])];
731    /// assert_eq![grid.pop_col(), Some(vec![1,4])];
732    /// assert_eq![grid.pop_col(), None];
733    /// ```
734    pub fn pop_col(&mut self) -> Option<Vec<T>> {
735        if self.cols == 0 {
736            return None;
737        }
738        for i in 1..self.rows {
739            let row_idx = i * (self.cols - 1);
740            self.data[row_idx..row_idx + self.cols + i - 1].rotate_left(i);
741        }
742        let col = self.data.split_off(self.data.len() - self.rows);
743        self.cols -= 1;
744        if self.cols == 0 {
745            self.rows = 0;
746        }
747        Some(col)
748    }
749
750    /// Remove a column at the index and return a vector of it.
751    ///
752    /// # Examples
753    /// ```
754    /// use grid::*;
755    /// let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
756    /// assert_eq![grid.remove_col(3), Some(vec![4,8,12,16])];
757    /// assert_eq![grid.remove_col(0), Some(vec![1,5,9,13])];
758    /// assert_eq![grid.remove_col(1), Some(vec![3,7,11,15])];
759    /// assert_eq![grid.remove_col(0), Some(vec![2,6,10,14])];
760    /// assert_eq![grid.remove_col(0), None];
761    /// ```
762    pub fn remove_col(&mut self, col_index: usize) -> Option<Vec<T>> {
763        if self.cols == 0 || self.rows == 0 || col_index >= self.cols {
764            return None;
765        }
766        for i in 0..self.rows {
767            let row_idx = col_index + i * (self.cols - 1);
768            let end = cmp::min(row_idx + self.cols + i, self.data.len());
769            self.data[row_idx..end].rotate_left(i + 1);
770        }
771        let col = self.data.split_off(self.data.len() - self.rows);
772        self.cols -= 1;
773        if self.cols == 0 {
774            self.rows = 0;
775        }
776        Some(col)
777    }
778
779    /// Insert a new row at the index and shifts all rows after down.
780    ///
781    /// # Examples
782    /// ```
783    /// use grid::*;
784    /// let mut grid = grid![[1,2,3][4,5,6]];
785    /// grid.insert_row(1, vec![7,8,9]);
786    /// assert_eq!(grid[0], [1,2,3]);
787    /// assert_eq!(grid[1], [7,8,9]);
788    /// assert_eq!(grid[2], [4,5,6]);
789    /// assert_eq!(grid.size(), (3,3))
790    /// ```
791    ///
792    /// # Panics
793    ///
794    /// Panics if:
795    /// - the grid is not empty and `row.len() != grid.cols()`.
796    /// - the index is greater than the number of rows
797    pub fn insert_row(&mut self, index: usize, row: Vec<T>) {
798        let input_len = row.len();
799        assert!(
800            !(self.cols > 0 && input_len != self.cols),
801            "Inserted row must be of length {}, but was {}.",
802            self.cols,
803            row.len()
804        );
805        assert!(
806            index <= self.rows,
807            "Out of range. Index was {}, but must be less or equal to {}.",
808            index,
809            self.rows
810        );
811        let data_idx = index * input_len;
812        self.data.splice(data_idx..data_idx, row.into_iter());
813        self.cols = input_len;
814        self.rows += 1;
815    }
816
817    /// Insert a new column at the index.
818    ///
819    /// Important! Insertion of columns is a lot slower than the lines insertion.
820    /// This is because of the memory layout of the grid data structure.
821    ///
822    /// # Examples
823    /// ```
824    /// use grid::*;
825    /// let mut grid = grid![[1,2,3][4,5,6]];
826    /// grid.insert_col(1, vec![9,9]);
827    /// assert_eq!(grid[0], [1,9,2,3]);
828    /// assert_eq!(grid[1], [4,9,5,6]);
829    /// assert_eq!(grid.size(), (2,4))
830    /// ```
831    ///
832    /// # Panics
833    ///
834    /// Panics if:
835    /// - the grid is not empty and `col.len() != grid.rows()`.
836    /// - the index is greater than the number of columns
837    pub fn insert_col(&mut self, index: usize, col: Vec<T>) {
838        let input_len = col.len();
839        assert!(
840            !(self.rows > 0 && input_len != self.rows),
841            "Inserted col must be of length {}, but was {}.",
842            self.rows,
843            col.len()
844        );
845        assert!(
846            index <= self.cols,
847            "Out of range. Index was {}, but must be less or equal to {}.",
848            index,
849            self.cols
850        );
851        for (row_iter, col_val) in col.into_iter().enumerate() {
852            let data_idx = row_iter * self.cols + index + row_iter;
853            self.data.insert(data_idx, col_val);
854        }
855        self.rows = input_len;
856        self.cols += 1;
857    }
858
859    /// Returns a reference to the internal data structure of the grid.
860    ///
861    /// Grid uses a row major layout.
862    /// All rows are placed right after each other in the vector data structure.
863    ///
864    /// # Examples
865    /// ```
866    /// use grid::*;
867    /// let grid = grid![[1,2,3][4,5,6]];
868    /// let flat = grid.flatten();
869    /// assert_eq!(flat, &vec![1,2,3,4,5,6]);
870    /// ```
871    #[must_use]
872    pub fn flatten(&self) -> &Vec<T> {
873        &self.data
874    }
875
876    /// Converts self into a vector without clones or allocation.
877    #[must_use]
878    pub fn into_vec(self) -> Vec<T> {
879        self.data
880    }
881
882    /// Transpose the grid so that columns become rows in new grid.
883    #[must_use]
884    pub fn transpose(&self) -> Grid<T>
885    where
886        T: Clone,
887    {
888        let mut data = Vec::with_capacity(self.data.len());
889        for c in 0..self.cols {
890            for r in 0..self.rows {
891                data.push(self[r][c].clone());
892            }
893        }
894        Grid {
895            data,
896            cols: self.rows,
897            rows: self.cols,
898        }
899    }
900
901    /// Rotate the grid 90° counter-clockwise.
902    ///
903    /// # Examples
904    ///
905    /// ```
906    /// use grid::*;
907    /// let grid = grid![[1,2,3][4,5,6]];
908    /// assert_eq!(grid.rotate_left(), grid![[3,6][2,5][1,4]]);
909    /// ```
910    #[must_use]
911    pub fn rotate_left(&self) -> Grid<T>
912    where
913        T: Clone,
914    {
915        let mut data = Vec::with_capacity(self.data.len());
916        for c in (0..self.cols).rev() {
917            for r in 0..self.rows {
918                data.push(self[r][c].clone());
919            }
920        }
921        Grid {
922            data,
923            cols: self.rows,
924            rows: self.cols,
925        }
926    }
927
928    /// Rotate the grid 90° clockwise.
929    ///
930    /// # Examples
931    ///
932    /// ```
933    /// use grid::*;
934    /// let grid = grid![[1,2,3][4,5,6]];
935    /// assert_eq!(grid.rotate_right(), grid![[4,1][5,2][6,3]]);
936    /// ```
937    #[must_use]
938    pub fn rotate_right(&self) -> Grid<T>
939    where
940        T: Clone,
941    {
942        let mut data = Vec::with_capacity(self.data.len());
943        for c in 0..self.cols {
944            for r in (0..self.rows).rev() {
945                data.push(self[r][c].clone());
946            }
947        }
948        Grid {
949            data,
950            cols: self.rows,
951            rows: self.cols,
952        }
953    }
954
955    /// Rotate the grid 180°.
956    ///
957    /// # Examples
958    ///
959    /// ```
960    /// use grid::*;
961    /// let grid = grid![[1,2,3][4,5,6]];
962    /// assert_eq!(grid.rotate_half(), grid![[6,5,4][3,2,1]]);
963    /// ```
964    #[must_use]
965    pub fn rotate_half(&self) -> Grid<T>
966    where
967        T: Clone,
968    {
969        let data: Vec<_> = self.data.iter().rev().cloned().collect();
970        Grid {
971            data,
972            cols: self.cols,
973            rows: self.rows,
974        }
975    }
976
977    /// Fills the grid with elements by cloning `value`.
978    ///
979    /// # Examples
980    ///
981    /// ```
982    /// use grid::*;
983    /// let mut grid = grid![[1,2,3][4,5,6]];
984    /// grid.fill(7);
985    /// assert_eq!(grid[0], [7,7,7]);
986    /// assert_eq!(grid[1], [7,7,7]);
987    /// ```
988    pub fn fill(&mut self, value: T)
989    where
990        T: Clone,
991    {
992        self.data.fill(value);
993    }
994
995    /// Fills the grid with elements returned by calling a closure repeatedly.
996    ///
997    /// This method uses a closure to create new values. If you'd rather
998    /// [`Clone`] a given value, use [`fill`]. If you want to use the [`Default`]
999    /// trait to generate values, you can pass [`Default::default`] as the
1000    /// argument.
1001    ///
1002    /// [`fill`]: Grid::fill
1003    ///
1004    /// # Examples
1005    ///
1006    /// ```
1007    /// use grid::*;
1008    /// let mut grid = grid![[1,2,3][4,5,6]];
1009    /// grid.fill_with(Default::default);
1010    /// assert_eq!(grid[0], [0,0,0]);
1011    /// assert_eq!(grid[1], [0,0,0]);
1012    /// ```
1013    pub fn fill_with<F>(&mut self, f: F)
1014    where
1015        F: FnMut() -> T,
1016    {
1017        self.data.fill_with(f);
1018    }
1019
1020    /// Iterate over the rows of the grid. Each time an iterator over a single
1021    /// row is returned.
1022    ///
1023    /// An item in this iterator is equal to a call to `Grid.iter_row(row_index)`
1024    /// of the corresponding row.
1025    ///
1026    /// # Examples
1027    ///
1028    /// ```
1029    /// use grid::*;
1030    /// let mut grid = grid![[1,2,3][4,5,6]];
1031    /// let sum_by_row: Vec<u8> = grid.iter_rows().map(|row| row.sum()).collect();
1032    /// assert_eq!(sum_by_row, vec![1+2+3, 4+5+6])
1033    /// ```
1034    #[must_use]
1035    pub fn iter_rows(&self) -> GridRowIter<'_, T> {
1036        GridRowIter {
1037            grid: self,
1038            row_index: 0,
1039        }
1040    }
1041
1042    /// Iterate over the columns of the grid. Each time an iterator over a single
1043    /// column is returned.
1044    ///
1045    /// An item in this iterator is equal to a call to `Grid.iter_col(col_index)`
1046    /// of the corresponding column.
1047    ///
1048    /// # Examples
1049    ///
1050    /// ```
1051    /// use grid::*;
1052    /// let mut grid = grid![[1,2,3][4,5,6]];
1053    /// let sum_by_col: Vec<u8> = grid.iter_cols().map(|col| col.sum()).collect();
1054    /// assert_eq!(sum_by_col, vec![1+4, 2+5, 3+6])
1055    /// ```
1056    #[must_use]
1057    pub fn iter_cols(&self) -> GridColIter<'_, T> {
1058        GridColIter {
1059            grid: self,
1060            col_index: 0,
1061        }
1062    }
1063}
1064
1065impl<T: Clone> Clone for Grid<T> {
1066    fn clone(&self) -> Self {
1067        Grid {
1068            rows: self.rows,
1069            cols: self.cols,
1070            data: self.data.clone(),
1071        }
1072    }
1073}
1074
1075impl<T> Index<usize> for Grid<T> {
1076    type Output = [T];
1077
1078    #[inline]
1079    fn index(&self, idx: usize) -> &[T] {
1080        let start_idx = idx * self.cols;
1081        &self.data[start_idx..start_idx + self.cols]
1082    }
1083}
1084
1085impl<T> IndexMut<usize> for Grid<T> {
1086    #[inline]
1087    fn index_mut(&mut self, idx: usize) -> &mut [T] {
1088        let start_idx = idx * self.cols;
1089        &mut self.data[start_idx..start_idx + self.cols]
1090    }
1091}
1092
1093impl<T> Index<(usize, usize)> for Grid<T> {
1094    type Output = T;
1095
1096    #[inline]
1097    fn index(&self, (row, col): (usize, usize)) -> &T {
1098        assert!(
1099            !(row >= self.rows || col >= self.cols),
1100            "grid index out of bounds: ({row},{col}) out of ({},{})",
1101            self.rows,
1102            self.cols
1103        );
1104        &self.data[row * self.cols + col]
1105    }
1106}
1107
1108impl<T> IndexMut<(usize, usize)> for Grid<T> {
1109    #[inline]
1110    fn index_mut(&mut self, (row, col): (usize, usize)) -> &mut T {
1111        assert!(
1112            !(row >= self.rows || col >= self.cols),
1113            "grid index out of bounds: ({row},{col}) out of ({},{})",
1114            self.rows,
1115            self.cols
1116        );
1117        &mut self.data[row * self.cols + col]
1118    }
1119}
1120
1121impl<T: fmt::Debug> fmt::Debug for Grid<T> {
1122    #[allow(unused_must_use)]
1123    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1124        write!(f, "[");
1125        if self.cols > 0 {
1126            if f.alternate() {
1127                writeln!(f);
1128                /*
1129                    WARNING
1130
1131                    Compound types becoming enormous as the entire `fmt::Debug` width is applied to each item individually.
1132                    For tuples and structs define padding and precision arguments manually to improve readability.
1133                */
1134                let width = f.width().unwrap_or(
1135                    /*
1136                        Conditionally calculate the longest item by default.
1137                    */
1138                    self.data
1139                        .iter()
1140                        .map(|i| format!("{i:?}").len())
1141                        .max()
1142                        .unwrap(),
1143                );
1144                let precision = f.precision().unwrap_or(2);
1145                for (i, _) in self.data.iter().enumerate().step_by(self.cols) {
1146                    let mut row = self.data[i..(i + self.cols)].iter().peekable();
1147                    write!(f, "    [");
1148                    while let Some(item) = row.next() {
1149                        write!(
1150                            f,
1151                            " {item:width$.precision$?}",
1152                            // width = width,
1153                            // precision = precision
1154                        );
1155                        if row.peek().is_some() {
1156                            write!(f, ",");
1157                        }
1158                    }
1159                    writeln!(f, "]");
1160                }
1161            } else {
1162                for (i, _) in self.data.iter().enumerate().step_by(self.cols) {
1163                    write!(f, "{:?}", &self.data[i..(i + self.cols)]);
1164                }
1165            }
1166        }
1167        write!(f, "]")
1168    }
1169}
1170
1171impl<T: Eq> PartialEq for Grid<T> {
1172    fn eq(&self, other: &Self) -> bool {
1173        self.rows == other.rows && self.cols == other.cols && self.data == other.data
1174    }
1175}
1176
1177impl<T: Eq> Eq for Grid<T> {}
1178
1179pub struct GridRowIter<'a, T> {
1180    grid: &'a Grid<T>,
1181    row_index: usize,
1182}
1183pub struct GridColIter<'a, T> {
1184    grid: &'a Grid<T>,
1185    col_index: usize,
1186}
1187
1188impl<'a, T> Iterator for GridRowIter<'a, T> {
1189    type Item = Iter<'a, T>;
1190
1191    fn next(&mut self) -> Option<Self::Item> {
1192        let rows = self.grid.rows();
1193        let row_index = self.row_index;
1194
1195        if !(0..rows).contains(&row_index) {
1196            return None;
1197        }
1198
1199        let row_iter = self.grid.iter_row(row_index);
1200        self.row_index += 1;
1201        Some(row_iter)
1202    }
1203}
1204
1205impl<'a, T> Iterator for GridColIter<'a, T> {
1206    type Item = StepBy<Iter<'a, T>>;
1207
1208    fn next(&mut self) -> Option<Self::Item> {
1209        let cols = self.grid.cols();
1210        let col_index = self.col_index;
1211
1212        if !(0..cols).contains(&col_index) {
1213            return None;
1214        }
1215
1216        let row_iter = self.grid.iter_col(col_index);
1217        self.col_index += 1;
1218        Some(row_iter)
1219    }
1220}
1221
1222#[cfg(test)]
1223mod test {
1224    use super::*;
1225    #[cfg(all(not(feature = "std")))]
1226    use alloc::string::String;
1227
1228    #[test]
1229    fn from_vec_zero_with_cols() {
1230        let grid: Grid<u8> = Grid::from_vec(vec![], 1);
1231        assert_eq!(grid.rows(), 0);
1232        assert_eq!(grid.cols(), 0);
1233    }
1234
1235    #[test]
1236    fn from_vec_zero() {
1237        let grid: Grid<u8> = Grid::from_vec(vec![], 0);
1238        let _ = grid.is_empty();
1239        assert_eq!(grid.rows(), 0);
1240        assert_eq!(grid.cols(), 0);
1241    }
1242
1243    #[test]
1244    fn insert_col_at_end() {
1245        let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1246        grid.insert_col(2, vec![5, 6]);
1247        assert_eq!(grid[0], [1, 2, 5]);
1248        assert_eq!(grid[1], [3, 4, 6]);
1249    }
1250
1251    #[test]
1252    #[should_panic]
1253    fn insert_col_out_of_idx() {
1254        let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1255        grid.insert_col(3, vec![4, 5]);
1256    }
1257
1258    #[test]
1259    fn insert_row_at_end() {
1260        let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1261        grid.insert_row(2, vec![5, 6]);
1262        assert_eq!(grid[0], [1, 2]);
1263        assert_eq!(grid[1], [3, 4]);
1264        assert_eq!(grid[2], [5, 6]);
1265    }
1266
1267    #[test]
1268    fn insert_row_empty() {
1269        let mut grid: Grid<u8> = grid![];
1270        grid.insert_row(0, vec![1, 2, 3]);
1271        assert_eq!(grid[0], [1, 2, 3]);
1272        assert_eq!((1, 3), grid.size());
1273    }
1274
1275    #[test]
1276    fn insert_col_empty() {
1277        let mut grid: Grid<u8> = grid![];
1278        grid.insert_col(0, vec![1, 2, 3]);
1279        assert_eq!(grid[0], [1]);
1280        assert_eq!((3, 1), grid.size());
1281    }
1282
1283    #[test]
1284    #[should_panic]
1285    fn insert_row_out_of_idx() {
1286        let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1287        grid.insert_row(3, vec![4, 5]);
1288    }
1289
1290    #[test]
1291    #[should_panic]
1292    fn insert_row_wrong_size_of_idx() {
1293        let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1294        grid.insert_row(1, vec![4, 5, 4]);
1295    }
1296
1297    #[test]
1298    fn insert_row_start() {
1299        let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1300        let new_row = [5, 6];
1301        grid.insert_row(1, new_row.to_vec());
1302        assert_eq!(grid[1], new_row);
1303    }
1304
1305    #[test]
1306    fn pop_col_1x3() {
1307        let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 3);
1308        assert_eq!(grid.pop_col(), Some(vec![3]));
1309        assert_eq!(grid.size(), (1, 2));
1310        assert_eq!(grid.pop_col(), Some(vec![2]));
1311        assert_eq!(grid.size(), (1, 1));
1312        assert_eq!(grid.pop_col(), Some(vec![1]));
1313        assert!(grid.is_empty());
1314        assert_eq!(grid.pop_col(), None);
1315    }
1316
1317    #[test]
1318    fn pop_col_3x1() {
1319        let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 1);
1320        assert_eq!(grid.pop_col(), Some(vec![1, 2, 3]));
1321        assert!(grid.is_empty());
1322        assert_eq!(grid.pop_col(), None);
1323    }
1324
1325    #[test]
1326    fn pop_col_2x2() {
1327        let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1328        assert_eq!(grid.pop_col(), Some(vec![2, 4]));
1329        assert_eq!(grid.size(), (2, 1));
1330        assert_eq!(grid.pop_col(), Some(vec![1, 3]));
1331        assert_eq!(grid.size(), (0, 0));
1332        assert_eq!(grid.pop_col(), None);
1333    }
1334
1335    #[test]
1336    fn pop_col_3x4() {
1337        let mut grid: Grid<u16> =
1338            Grid::from_vec(vec![1, 2, 3, 4, 11, 22, 33, 44, 111, 222, 333, 444], 4);
1339        assert_eq!(grid.pop_col(), Some(vec![4, 44, 444]));
1340        assert_eq!(grid.size(), (3, 3));
1341        assert_eq!(grid.pop_col(), Some(vec![3, 33, 333]));
1342        assert_eq!(grid.size(), (3, 2));
1343        assert_eq!(grid.pop_col(), Some(vec![2, 22, 222]));
1344        assert_eq!(grid.size(), (3, 1));
1345        assert_eq!(grid.pop_col(), Some(vec![1, 11, 111]));
1346        assert_eq!(grid.size(), (0, 0));
1347        assert_eq!(grid.pop_col(), None);
1348    }
1349
1350    #[test]
1351    fn pop_col_empty() {
1352        let mut grid: Grid<u8> = Grid::from_vec(vec![], 0);
1353        assert_eq!(grid.pop_row(), None);
1354    }
1355
1356    #[test]
1357    fn pop_row_2x2() {
1358        let mut grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1359        assert_eq!(grid.pop_row(), Some(vec![3, 4]));
1360        assert_ne!(grid.size(), (1, 4));
1361        assert_eq!(grid.pop_row(), Some(vec![1, 2]));
1362        assert_eq!(grid.size(), (0, 0));
1363        assert_eq!(grid.pop_row(), None);
1364    }
1365
1366    #[test]
1367    fn pop_row_empty() {
1368        let mut grid: Grid<u8> = Grid::from_vec(vec![], 0);
1369        assert_eq!(grid.pop_row(), None);
1370    }
1371
1372    #[test]
1373    fn ne_full_empty() {
1374        let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
1375        let g2: Grid<u8> = grid![];
1376        assert_ne!(g1, g2);
1377    }
1378
1379    #[test]
1380    fn ne() {
1381        let g1 = Grid::from_vec(vec![1, 2, 3, 5], 2);
1382        let g2 = Grid::from_vec(vec![1, 2, 3, 4], 2);
1383        assert_ne!(g1, g2);
1384    }
1385
1386    #[test]
1387    fn ne_dif_rows() {
1388        let g1 = Grid::from_vec(vec![1, 2, 3, 4], 2);
1389        let g2 = Grid::from_vec(vec![1, 2, 3, 4], 1);
1390        assert_ne!(g1, g2);
1391    }
1392
1393    #[test]
1394    fn equal_empty() {
1395        let grid: Grid<char> = grid![];
1396        let grid2: Grid<char> = grid![];
1397        assert_eq!(grid, grid2);
1398    }
1399    #[test]
1400    fn equal() {
1401        let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
1402        let grid2: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
1403        assert_eq!(grid, grid2);
1404    }
1405
1406    #[test]
1407    #[should_panic]
1408    fn idx_out_of_col_bounds() {
1409        let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
1410        let _ = grid[0][5];
1411    }
1412
1413    #[test]
1414    #[should_panic]
1415    fn idx_tup_out_of_col_bounds() {
1416        let grid: Grid<char> = grid![['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']['a', 'b', 'c', 'd']];
1417        let _ = grid[(0, 5)];
1418    }
1419
1420    #[test]
1421    fn push_col_2x3() {
1422        let mut grid: Grid<u8> = grid![  
1423                    [0, 1, 2]
1424                    [10, 11, 12]];
1425        grid.push_col(vec![3, 13]);
1426        assert_eq!(grid.size(), (2, 4));
1427        assert_eq!(
1428            grid.iter_row(0).copied().collect::<Vec<_>>(),
1429            vec![0, 1, 2, 3]
1430        );
1431        assert_eq!(
1432            grid.iter_row(1).copied().collect::<Vec<_>>(),
1433            vec![10, 11, 12, 13]
1434        );
1435    }
1436
1437    #[test]
1438    fn push_col_3x4() {
1439        let mut grid: Grid<char> = grid![  
1440                    ['a', 'b', 'c', 'd']
1441                    ['a', 'b', 'c', 'd']
1442                    ['a', 'b', 'c', 'd']];
1443        grid.push_col(vec!['x', 'y', 'z']);
1444        assert_eq!(grid.size(), (3, 5));
1445        assert_eq!(
1446            grid.iter_row(0).copied().collect::<Vec<_>>(),
1447            vec!['a', 'b', 'c', 'd', 'x']
1448        );
1449        assert_eq!(
1450            grid.iter_row(1).copied().collect::<Vec<_>>(),
1451            vec!['a', 'b', 'c', 'd', 'y']
1452        );
1453        assert_eq!(
1454            grid.iter_row(2).copied().collect::<Vec<_>>(),
1455            vec!['a', 'b', 'c', 'd', 'z']
1456        );
1457    }
1458
1459    #[test]
1460    fn push_col_1x3() {
1461        let mut grid: Grid<char> = grid![['a', 'b', 'c']];
1462        grid.push_col(vec!['d']);
1463        assert_eq!(grid.size(), (1, 4));
1464        assert_eq!(grid[0][3], 'd');
1465    }
1466
1467    #[test]
1468    fn push_col_empty() {
1469        let mut grid: Grid<char> = grid![];
1470        grid.push_col(vec!['b', 'b', 'b', 'b']);
1471        assert_eq!(grid.size(), (4, 1));
1472        assert_eq!(grid[0][0], 'b');
1473    }
1474
1475    #[test]
1476    #[should_panic]
1477    fn push_col_wrong_size() {
1478        let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
1479        grid.push_col(vec!['b']);
1480        grid.push_col(vec!['b', 'b']);
1481    }
1482
1483    #[test]
1484    #[should_panic]
1485    fn push_col_zero_len() {
1486        let mut grid: Grid<char> = grid![];
1487        grid.push_col(vec![]);
1488    }
1489
1490    #[test]
1491    fn push_row_empty() {
1492        let mut grid: Grid<char> = grid![];
1493        grid.push_row(vec!['b', 'b', 'b', 'b']);
1494        assert_eq!(grid.size(), (1, 4));
1495        assert_eq!(grid[0][0], 'b');
1496    }
1497
1498    #[test]
1499    #[should_panic]
1500    fn push_empty_row() {
1501        let mut grid = Grid::init(0, 1, 0);
1502        grid.push_row(vec![]);
1503    }
1504
1505    #[test]
1506    #[should_panic]
1507    fn push_row_wrong_size() {
1508        let mut grid: Grid<char> = grid![['a','a','a']['a','a','a']];
1509        grid.push_row(vec!['b']);
1510        grid.push_row(vec!['b', 'b', 'b', 'b']);
1511    }
1512
1513    #[test]
1514    fn iter_row() {
1515        let grid: Grid<u8> = grid![[1,2,3][1,2,3]];
1516        let mut iter = grid.iter_row(0);
1517        assert_eq!(iter.next(), Some(&1));
1518        assert_eq!(iter.next(), Some(&2));
1519        assert_eq!(iter.next(), Some(&3));
1520        assert_eq!(iter.next(), None);
1521    }
1522
1523    #[test]
1524    #[should_panic]
1525    fn iter_row_empty() {
1526        let grid: Grid<u8> = grid![];
1527        let _ = grid.iter_row(0);
1528    }
1529
1530    #[test]
1531    #[should_panic]
1532    fn iter_row_out_of_bound() {
1533        let grid: Grid<u8> = grid![[1,2,3][1,2,3]];
1534        let _ = grid.iter_row(2);
1535    }
1536
1537    #[test]
1538    #[should_panic]
1539    fn iter_col_out_of_bound() {
1540        let grid: Grid<u8> = grid![[1,2,3][1,2,3]];
1541        let _ = grid.iter_col(3);
1542    }
1543
1544    #[test]
1545    #[should_panic]
1546    fn iter_col_zero() {
1547        let grid: Grid<u8> = grid![];
1548        let _ = grid.iter_col(0);
1549    }
1550
1551    #[test]
1552    fn iter() {
1553        let grid: Grid<u8> = grid![[1,2][3,4]];
1554        let mut iter = grid.iter();
1555        assert_eq!(iter.next(), Some(&1));
1556        assert_eq!(iter.next(), Some(&2));
1557        assert_eq!(iter.next(), Some(&3));
1558        assert_eq!(iter.next(), Some(&4));
1559        assert_eq!(iter.next(), None);
1560    }
1561
1562    #[test]
1563    fn indexed_iter() {
1564        let grid: Grid<u8> = grid![[1,2][3,4]];
1565        let mut iter = grid.indexed_iter();
1566        assert_eq!(iter.next(), Some(((0, 0), &1)));
1567        assert_eq!(iter.next(), Some(((0, 1), &2)));
1568        assert_eq!(iter.next(), Some(((1, 0), &3)));
1569        assert_eq!(iter.next(), Some(((1, 1), &4)));
1570        assert_eq!(iter.next(), None);
1571    }
1572
1573    #[test]
1574    fn indexed_iter_empty() {
1575        let grid: Grid<u8> = Grid::new(0, 0);
1576        let mut iter = grid.indexed_iter();
1577        assert_eq!(iter.next(), None);
1578    }
1579
1580    #[test]
1581    fn clear() {
1582        let mut grid: Grid<u8> = grid![[1, 2, 3]];
1583        assert!(!grid.is_empty());
1584        grid.clear();
1585        assert!(grid.is_empty());
1586    }
1587
1588    #[test]
1589    fn is_empty_false() {
1590        let grid: Grid<u8> = grid![[1, 2, 3]];
1591        assert!(!grid.is_empty());
1592    }
1593
1594    #[test]
1595    fn is_empty() {
1596        let mut g: Grid<u8> = grid![[]];
1597        assert!(g.is_empty());
1598        g = grid![];
1599        assert!(g.is_empty());
1600        g = Grid::from_vec(vec![], 0);
1601        assert!(g.is_empty());
1602        g = Grid::new(0, 0);
1603        assert!(g.is_empty());
1604        g = Grid::new(0, 1);
1605        assert!(g.is_empty());
1606        g = Grid::new(1, 0);
1607        assert!(g.is_empty());
1608        g = Grid::init(0, 0, 10);
1609        assert!(g.is_empty());
1610    }
1611
1612    #[test]
1613    fn fmt_empty() {
1614        let grid: Grid<u8> = grid![];
1615        assert_eq!(format!("{:?}", grid), "[]");
1616    }
1617
1618    #[test]
1619    fn fmt_row() {
1620        let grid: Grid<u8> = grid![[1, 2, 3]];
1621        assert_eq!(format!("{:?}", grid), "[[1, 2, 3]]");
1622    }
1623
1624    #[test]
1625    fn fmt_grid() {
1626        let grid: Grid<u8> = grid![[1,2,3][4,5,6][7,8,9]];
1627        assert_eq!(format!("{:?}", grid), "[[1, 2, 3][4, 5, 6][7, 8, 9]]");
1628    }
1629
1630    #[test]
1631    fn fmt_pretty_empty() {
1632        let grid: Grid<f32> = grid![];
1633        assert_eq!(format!("{:#?}", grid), "[]");
1634    }
1635
1636    #[test]
1637    fn fmt_pretty_int() {
1638        let grid: Grid<u8> = grid![
1639            [1,2,3]
1640            [4,5,6]
1641            [7,8,95]
1642        ];
1643
1644        let expected_output = r#"[
1645    [  1,  2,  3]
1646    [  4,  5,  6]
1647    [  7,  8, 95]
1648]"#;
1649
1650        assert_eq!(format!("{:#?}", grid), expected_output);
1651
1652        let expected_output = r#"[
1653    [   1,   2,   3]
1654    [   4,   5,   6]
1655    [   7,   8,  95]
1656]"#;
1657
1658        assert_eq!(format!("{:#3?}", grid), expected_output);
1659    }
1660
1661    #[test]
1662    fn fmt_pretty_float() {
1663        let grid: Grid<f32> = grid![
1664            [1.5,2.6,3.44]
1665            [4.775,5.,6.]
1666            [7.1,8.23444,95.55]
1667        ];
1668
1669        let expected_output = r#"[
1670    [   1.5,   2.6,   3.4]
1671    [   4.8,   5.0,   6.0]
1672    [   7.1,   8.2,  95.6]
1673]"#;
1674
1675        assert_eq!(format!("{:#5.1?}", grid), expected_output);
1676
1677        let expected_output = r#"[
1678    [  1.50000,  2.60000,  3.44000]
1679    [  4.77500,  5.00000,  6.00000]
1680    [  7.10000,  8.23444, 95.55000]
1681]"#;
1682
1683        assert_eq!(format!("{:#8.5?}", grid), expected_output);
1684    }
1685
1686    #[test]
1687    fn fmt_pretty_tuple() {
1688        let grid: Grid<(i32, i32)> = grid![
1689            [(5,66), (432, 55)]
1690            [(80, 90), (5, 6)]
1691        ];
1692
1693        let expected_output = r#"[
1694    [ (        5,        66), (      432,        55)]
1695    [ (       80,        90), (        5,         6)]
1696]"#;
1697
1698        assert_eq!(format!("{grid:#?}"), expected_output);
1699
1700        let expected_output = r#"[
1701    [ (  5,  66), (432,  55)]
1702    [ ( 80,  90), (  5,   6)]
1703]"#;
1704
1705        assert_eq!(format!("{:#3?}", grid), expected_output);
1706    }
1707
1708    #[test]
1709    fn fmt_pretty_struct_derived() {
1710        #[derive(Debug)]
1711        struct Person {
1712            _name: String,
1713            _precise_age: f32,
1714        }
1715
1716        impl Person {
1717            fn new(name: &str, precise_age: f32) -> Self {
1718                Person {
1719                    _name: name.into(),
1720                    _precise_age: precise_age,
1721                }
1722            }
1723        }
1724
1725        let grid: Grid<Person> = grid![
1726            [Person::new("Vic", 24.5), Person::new("Mr. Very Long Name", 1955.)]
1727            [Person::new("Sam", 8.9995), Person::new("John Doe", 40.14)]
1728        ];
1729
1730        let expected_output = r#"[
1731    [ Person { _name: "Vic", _precise_age: 24.50000 }, Person { _name: "Mr. Very Long Name", _precise_age: 1955.00000 }]
1732    [ Person { _name: "Sam", _precise_age: 8.99950 }, Person { _name: "John Doe", _precise_age: 40.14000 }]
1733]"#;
1734
1735        assert_eq!(format!("{:#5.5?}", grid), expected_output);
1736    }
1737
1738    #[test]
1739    fn clone() {
1740        let grid = grid![[1, 2, 3][4, 5, 6]];
1741        let mut clone = grid.clone();
1742        clone[0][2] = 10;
1743        assert_eq!(grid[0][2], 3);
1744        assert_eq!(clone[0][2], 10);
1745    }
1746
1747    #[test]
1748    fn macro_init() {
1749        let grid = grid![[1, 2, 3][4, 5, 6]];
1750        assert_eq!(grid[0][0], 1);
1751        assert_eq!(grid[0][1], 2);
1752        assert_eq!(grid[0][2], 3);
1753        assert_eq!(grid[1][0], 4);
1754        assert_eq!(grid[1][1], 5);
1755        assert_eq!(grid[1][2], 6);
1756    }
1757
1758    #[test]
1759    fn macro_init_2() {
1760        let grid = grid![[1, 2, 3]
1761                         [4, 5, 6]
1762                         [7, 8, 9]];
1763        assert_eq!(grid.size(), (3, 3))
1764    }
1765
1766    #[test]
1767    fn macro_init_char() {
1768        let grid = grid![['a', 'b', 'c']
1769                         ['a', 'b', 'c']
1770                         ['a', 'b', 'c']];
1771        assert_eq!(grid.size(), (3, 3));
1772        assert_eq!(grid[1][1], 'b');
1773    }
1774
1775    #[test]
1776    fn macro_one_row() {
1777        let grid: Grid<usize> = grid![[1, 2, 3, 4]];
1778        assert_eq!(grid.size(), (1, 4));
1779        assert_eq!(grid[0][0], 1);
1780        assert_eq!(grid[0][1], 2);
1781        assert_eq!(grid[0][2], 3);
1782    }
1783
1784    #[test]
1785    #[should_panic]
1786    fn from_vec_panics_1() {
1787        let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 0);
1788    }
1789
1790    #[test]
1791    #[should_panic]
1792    fn from_vec_panics_2() {
1793        let _: Grid<u8> = Grid::from_vec(vec![1, 2, 3], 2);
1794    }
1795
1796    #[test]
1797    fn from_vec_uses_original_vec() {
1798        let capacity = 10_000_000;
1799        let vec = Vec::with_capacity(capacity);
1800        let grid: Grid<u8> = Grid::from_vec(vec, 0);
1801        assert!(grid.into_vec().capacity() >= capacity);
1802    }
1803
1804    #[test]
1805    fn init() {
1806        Grid::init(1, 2, 3);
1807        Grid::init(1, 2, 1.2);
1808        Grid::init(1, 2, 'a');
1809    }
1810
1811    #[test]
1812    fn init_empty() {
1813        let grid = Grid::init(0, 1, 0);
1814        assert!(grid.is_empty());
1815        assert_eq!(grid.cols(), 0);
1816        assert_eq!(grid.rows(), 0);
1817    }
1818
1819    #[test]
1820    fn new() {
1821        let grid: Grid<u8> = Grid::new(1, 2);
1822        assert_eq!(grid[0][0], 0);
1823    }
1824
1825    #[test]
1826    #[should_panic]
1827    fn new_panics() {
1828        let _: Grid<u8> = Grid::new(usize::MAX, 2);
1829    }
1830
1831    #[test]
1832    fn new_empty() {
1833        let grid: Grid<u8> = Grid::new(0, 1);
1834        assert!(grid.is_empty());
1835        assert_eq!(grid.cols(), 0);
1836        assert_eq!(grid.rows(), 0);
1837    }
1838
1839    #[test]
1840    #[should_panic]
1841    fn init_panics() {
1842        Grid::init(usize::MAX, 2, 3);
1843    }
1844
1845    #[test]
1846    fn get() {
1847        let grid = Grid::init(1, 2, 3);
1848        assert_eq!(grid.get(0, 0), Some(&3));
1849    }
1850    #[test]
1851    fn get_none() {
1852        let grid = Grid::init(1, 2, 3);
1853        assert_eq!(grid.get(1, 0), None);
1854    }
1855
1856    #[test]
1857    fn get_mut() {
1858        let mut grid = Grid::init(1, 2, 3);
1859        let mut_ref = grid.get_mut(0, 0).unwrap();
1860        *mut_ref = 5;
1861        assert_eq!(grid[0][0], 5);
1862    }
1863
1864    #[test]
1865    fn get_mut_none() {
1866        let mut grid = Grid::init(1, 2, 3);
1867        let mut_ref = grid.get_mut(1, 4);
1868        assert_eq!(mut_ref, None);
1869    }
1870
1871    #[test]
1872    fn idx() {
1873        let grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1874        assert_eq!(grid[0][0], 1);
1875        assert_eq!(grid[0][1], 2);
1876        assert_eq!(grid[1][0], 3);
1877        assert_eq!(grid[1][1], 4);
1878    }
1879
1880    #[test]
1881    fn idx_tup() {
1882        let grid: Grid<u8> = Grid::from_vec(vec![1, 2, 3, 4], 2);
1883        assert_eq!(grid[(0, 0)], 1);
1884        assert_eq!(grid[(0, 1)], 2);
1885        assert_eq!(grid[(1, 0)], 3);
1886        assert_eq!(grid[(1, 1)], 4);
1887    }
1888
1889    #[test]
1890    #[should_panic]
1891    fn idx_panic_1() {
1892        let grid = Grid::init(1, 2, 3);
1893        let _ = grid[20][0];
1894    }
1895
1896    #[test]
1897    #[should_panic]
1898    fn idx_tup_panic_1() {
1899        let grid = Grid::init(1, 2, 3);
1900        let _ = grid[(20, 0)];
1901    }
1902
1903    #[test]
1904    #[should_panic]
1905    fn idx_panic_2() {
1906        let grid = Grid::init(1, 2, 3);
1907        let _ = grid[0][20];
1908    }
1909
1910    #[test]
1911    #[should_panic]
1912    fn idx_tup_panic_2() {
1913        let grid = Grid::init(1, 2, 3);
1914        let _ = grid[(0, 20)];
1915    }
1916
1917    #[test]
1918    fn idx_set() {
1919        let mut grid = Grid::init(1, 2, 3);
1920        grid[0][0] = 4;
1921        assert_eq!(grid[0][0], 4);
1922    }
1923
1924    #[test]
1925    fn idx_tup_set() {
1926        let mut grid = Grid::init(1, 2, 3);
1927        grid[(0, 0)] = 4;
1928        assert_eq!(grid[(0, 0)], 4);
1929    }
1930
1931    #[test]
1932    fn size() {
1933        let grid = Grid::init(1, 2, 3);
1934        assert_eq!(grid.size(), (1, 2));
1935    }
1936
1937    #[test]
1938    fn transpose() {
1939        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
1940        assert_eq!(format!("{:?}", grid.transpose()), "[[1, 4][2, 5][3, 6]]");
1941    }
1942
1943    #[test]
1944    fn fill() {
1945        let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
1946        grid.fill(7);
1947        assert_eq!(grid[0], [7, 7, 7]);
1948        assert_eq!(grid[1], [7, 7, 7]);
1949    }
1950
1951    #[test]
1952    fn fill_with() {
1953        let mut grid: Grid<u8> = grid![[1,2,3][4,5,6]];
1954        grid.fill_with(Default::default);
1955        assert_eq!(grid[0], [0, 0, 0]);
1956        assert_eq!(grid[1], [0, 0, 0]);
1957    }
1958
1959    #[test]
1960    fn iter_rows() {
1961        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
1962        let max_by_row: Vec<u8> = grid
1963            .iter_rows()
1964            .map(|row| row.max().unwrap())
1965            .copied()
1966            .collect();
1967        assert_eq!(max_by_row, vec![3, 6]);
1968
1969        let sum_by_row: Vec<u8> = grid.iter_rows().map(|row| row.sum()).collect();
1970        assert_eq!(sum_by_row, vec![1 + 2 + 3, 4 + 5 + 6]);
1971    }
1972
1973    #[test]
1974    fn iter_cols() {
1975        let grid: Grid<u8> = grid![[1,2,3][4,5,6]];
1976        let max_by_col: Vec<u8> = grid
1977            .iter_cols()
1978            .map(|col| col.max().unwrap())
1979            .copied()
1980            .collect();
1981
1982        assert_eq!(max_by_col, vec![4, 5, 6]);
1983
1984        let sum_by_col: Vec<u8> = grid.iter_cols().map(|col| col.sum()).collect();
1985        assert_eq!(sum_by_col, vec![1 + 4, 2 + 5, 3 + 6]);
1986    }
1987    #[test]
1988    fn remove_col() {
1989        let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]];
1990        assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])];
1991        assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])];
1992        assert_eq![grid.remove_col(1), Some(vec![3, 7, 11, 15])];
1993        assert_eq![grid.remove_col(0), Some(vec![2, 6, 10, 14])];
1994        assert_eq![grid.remove_col(0), None];
1995    }
1996    #[test]
1997    fn remove_row() {
1998        let mut grid = grid![[1,2][3,4][5,6]];
1999        assert_eq![grid.remove_row(1), Some(vec![3, 4])];
2000        assert_eq![grid.remove_row(0), Some(vec![1, 2])];
2001        assert_eq![grid.remove_row(0), Some(vec![5, 6])];
2002        assert_eq![grid.remove_row(0), None];
2003    }
2004    #[test]
2005    fn remove_row_out_of_bound() {
2006        let mut grid = grid![[1, 2][3, 4]];
2007        assert_eq![grid.remove_row(5), None];
2008        assert_eq![grid.remove_row(1), Some(vec![3, 4])];
2009    }
2010    #[test]
2011    fn remove_col_out_of_bound() {
2012        let mut grid = grid![[1, 2][3, 4]];
2013        assert_eq!(grid.remove_col(5), None);
2014        assert_eq!(grid.remove_col(1), Some(vec![2, 4]));
2015    }
2016
2017    #[cfg(feature = "serde")]
2018    mod serde_tests {
2019        use super::*;
2020
2021        #[test]
2022        fn serialize() {
2023            let grid: Grid<u8> = grid![[1, 2][3, 4]];
2024            let s = serde_json::to_string(&grid).unwrap();
2025            println!("{s}");
2026        }
2027
2028        #[test]
2029        fn deserialize() {
2030            let s = "{ \"cols\": 2, \"data\": [1, 2, 3, 4] }";
2031            let grid: Grid<u8> = serde_json::from_str(&s).unwrap();
2032            assert_eq!(grid, grid![[1, 2][3, 4]]);
2033        }
2034    }
2035}