vecgrid/
lib.rs

1//! Vecgrid provides a dynamically sized two-dimensional vec. It is more efficient
2//! and is easier to use than a vector of vectors, i.e. `Vec<Vec<T>>`.
3//!
4//! This is beneficial when using a grid-like structure, which is common in
5//! image processing, game boards, and other situations. Vecgrid cannot be used
6//! when rows or columns might have different lengths⁠—all rows and columns must
7//! be the same length.
8//!
9//! # How to use [`Vecgrid`]
10//!
11//! ## Creating an [`Vecgrid`]
12//!
13//! An [`Vecgrid`] can be created in many different ways. These include:
14//!   - Providing the rows or the columns, which must all be the same size (see
15//!     [`from_rows`] and [`from_columns`]).
16//!   - Providing a "flat" vector of elements in either [row major or column
17//!     major order] along with the dimensions, which must match the number of
18//!     elements in the vector (see [`from_row_major`] and
19//!     [`from_column_major`]).
20//!   - Providing a value to repeatedly put in every location (see
21//!     [`filled_with`]).
22//!   - Providing a generator function that is repeatedly called to produce
23//!     values to fill the vecgrid (see [`filled_by_row_major`] and
24//!     [`filled_by_column_major`]).
25//!   - Providing an iterator that is used to produce values to fill the vecgrid
26//!     (see [`from_iter_row_major`] and [`from_iter_column_major`]).
27//!
28//! ## Extending a [`Vecgrid`]
29//!
30//! Since [`Vecgrid`]s are dynamically sized, it is possible to extend them:
31//!
32//!   - Providing singular rows of matching length alongside row indices to [`insert_row`],
33//!     or providing a mutable slice of rows to [`insert_rows`].
34//!   - Append the grid, either with matching length rows via [`append_rows`]... or future additions!
35//!   - Remove singular or consecutive rows via [`remove_row`] and [`remove_rows`] respectively.
36//!
37//! ## Accessing data from an [`Vecgrid`]
38//!
39//! [`Vecgrid`] supports several forms of indexing:
40//!   - Using the indexing syntax (square brackets) with a tuple of [`(usize,
41//!     usize)`], which panics on out-of-bounds accesses.
42//!   - Using the [`get`], [`get_mut`], and [`set`] methods, which return an
43//!     [`Option`] or a [`Result`] on out-of-bounds accesses.
44//!   - Using the row major or column major version of these methods,
45//!     i.e. [`get_row_major`], [`get_mut_row_major`], [`set_row_major`],
46//!     [`get_column_major`], [`get_mut_column_major`],
47//!     [`set_column_major`]. These perform the same tasks as the non row/column
48//!     major methods, but take one index instead of two.
49//!
50//! [`Vecgrid`] also supports several forms of iteration. You can iterate
51//! through:
52//!   - All of the elements, in either [row major or column major order] (see
53//!     [`elements_row_major_iter`] and [`elements_column_major_iter`]).
54//!   - All of the elements as mutable references, in [row major or column major order] (see
55//!     [`elements_row_major_iter_mut`] and [`elements_column_major_iter_mut`]).
56//!   - Individual rows or columns (see [`row_iter`] and [`column_iter`]).
57//!   - Individual rows and columns of mutable entries (see [`row_iter_mut`] and [`column_iter_mut`]).
58//!   - All rows or all columns (see [`rows_iter`] and [`columns_iter`]).
59//!   - All rows or all columns of mutable entries (see [`rows_iter_mut`] and [`columns_iter_mut`]).
60//!
61//!
62//! ## Extracting all data from an [`Vecgrid`]
63//!
64//! An [`Vecgrid`] can be converted back into a [`Vec`] through several
65//! methods. You can extract the data as:
66//!   - A [`Vec`] of rows or columns (see [`as_rows`] and [`as_columns`]).
67//!   - A "flat" [`Vec`] of elements in either [row major or column major order]
68//!     (see [`as_row_major`] and [`as_column_major`]).
69//!
70//! # Examples
71//!
72//! ```rust
73//! use vecgrid::{Vecgrid, Error};
74//!
75//! pub fn main() -> Result<(), Error> {
76//!     // Create a vecgrid filled with the same element.
77//!     let prefilled = Vecgrid::filled_with(42, 2, 3);
78//!     assert_eq!(prefilled.num_rows(), 2);
79//!     assert_eq!(prefilled.num_columns(), 3);
80//!     assert_eq!(prefilled[(0, 0)], 42);
81//!
82//!     // Create a vecgrid from the given rows. You can also use columns
83//!     // with the `columns` function
84//!     let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
85//!     let from_rows = Vecgrid::from_rows(rows)?;
86//!     assert_eq!(from_rows.num_rows(), 2);
87//!     assert_eq!(from_rows.num_columns(), 3);
88//!     assert_eq!(from_rows[(1, 1)], 5);
89//!
90//!     // Create a vecgrid from a flat Vec of elements in row major or
91//!     // column major order.
92//!     let column_major = vec![1, 4, 2, 5, 3, 6];
93//!     let from_column_major =
94//!         Vecgrid::from_column_major(column_major, 2, 3)?;
95//!     assert_eq!(from_column_major.num_rows(), 2);
96//!     assert_eq!(from_column_major.num_columns(), 3);
97//!     assert_eq!(from_column_major[(1, 1)], 5);
98//!
99//!     // Implements `Eq` if the element type does.
100//!     assert_eq!(from_rows, from_column_major);
101//!
102//!     // Index into a vecgrid using a tuple of usize to access or alter
103//!     // the vecgrid.
104//!     let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
105//!     let mut vecgrid = Vecgrid::from_rows(rows.clone())?;
106//!     vecgrid[(1, 1)] = 100;
107//!
108//!     // Convert the vecgrid back into a nested Vec using `as_rows` or
109//!     // `as_columns`.
110//!     let vecgrid_rows = vecgrid.as_rows();
111//!     assert_eq!(vecgrid_rows, vec![vec![1, 2, 3], vec![4, 100, 6]]);
112//!
113//!     // Convert the vecgrid back into a flat Vec using `as_row_major` or
114//!     // `as_column_major`.
115//!     let vecgrid_column_major = vecgrid.as_column_major();
116//!     assert_eq!(vecgrid_column_major, vec![1, 4, 2, 100, 3, 6]);
117//!
118//!     // Iterate over a single row or column
119//!     println!("First column:");
120//!     for element in vecgrid.column_iter(0)? {
121//!         println!("{}", element);
122//!     }
123//!
124//!     // Iterate over all rows or columns.
125//!     println!("All elements:");
126//!     for row_iter in vecgrid.rows_iter() {
127//!         for element in row_iter {
128//!             print!("{} ", element);
129//!         }
130//!         println!();
131//!     }
132//!     
133//!     Ok(())
134//! }
135//! ```
136//!
137//! [`Vecgrid`]: struct.Vecgrid.html
138//! [`from_rows`]: struct.Vecgrid.html#method.from_rows
139//! [`from_columns`]: struct.Vecgrid.html#method.from_columns
140//! [`from_row_major`]: struct.Vecgrid.html#method.from_row_major
141//! [`from_column_major`]: struct.Vecgrid.html#method.from_column_major
142//! [`filled_with`]: struct.Vecgrid.html#method.filled_with
143//! [`filled_by_row_major`]: struct.Vecgrid.html#method.filled_by_row_major
144//! [`filled_by_column_major`]: struct.Vecgrid.html#method.filled_by_column_major
145//! [`from_iter_row_major`]: struct.Vecgrid.html#method.from_iter_row_major
146//! [`from_iter_column_major`]: struct.Vecgrid.html#method.from_iter_column_major
147//! [`get`]: struct.Vecgrid.html#method.get
148//! [`get_mut`]: struct.Vecgrid.html#method.get_mut
149//! [`set`]: struct.Vecgrid.html#method.set
150//! [`get_row_major`]: struct.Vecgrid.html#method.get_row_major
151//! [`get_mut_row_major`]: struct.Vecgrid.html#method.get_mut_row_major
152//! [`set_row_major`]: struct.Vecgrid.html#method.set_row_major
153//! [`get_column_major`]: struct.Vecgrid.html#method.get_column_major
154//! [`get_mut_column_major`]: struct.Vecgrid.html#method.get_mut_column_major
155//! [`set_column_major`]: struct.Vecgrid.html#method.set_column_major
156//! [`elements_row_major_iter`]: struct.Vecgrid.html#method.elements_row_major_iter
157//! [`elements_column_major_iter`]: struct.Vecgrid.html#method.elements_column_major_iter
158//! [`elements_row_major_iter_mut`]: struct.Vecgrid.html#method.elements_row_major_iter_mut
159//! [`elements_column_major_iter_mut`]: struct.Vecgrid.html#method.elements_column_major_iter_mut
160//! [`row_iter`]: struct.Vecgrid.html#method.row_iter
161//! [`column_iter`]: struct.Vecgrid.html#method.column_iter
162//! [`row_iter_mut`]: struct.Vecgrid.html#method.row_iter_mut
163//! [`column_iter_mut`]: struct.Vecgrid.html#method.column_iter_mut
164//! [`rows_iter`]: struct.Vecgrid.html#method.rows_iter
165//! [`columns_iter`]: struct.Vecgrid.html#method.columns_iter
166//! [`rows_iter_mut`]: struct.Vecgrid.html#method.rows_iter_mut
167//! [`columns_iter_mut`]: struct.Vecgrid.html#method.columns_iter_mut
168//! [`as_rows`]: struct.Vecgrid.html#method.as_rows
169//! [`as_columns`]: struct.Vecgrid.html#method.as_columns
170//! [`as_row_major`]: struct.Vecgrid.html#method.as_row_major
171//! [`as_column_major`]: struct.Vecgrid.html#method.as_column_major
172//! [`insert_row`]: struct.Vecgrid.html#method.insert_row
173//! [`insert_rows`]: struct.Vecgrid.html#method.insert_rows
174//! [`append_rows`]: struct.Vecgrid.html#method.append_rows
175//! [`remove_row`]: struct.Vecgrid.html#method.remove_row
176//! [`remove_rows`]: struct.Vecgrid.html#method.remove_rows
177//! [`Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
178//! [`Option`]: https://doc.rust-lang.org/std/option/
179//! [`Result`]: https://doc.rust-lang.org/std/result/
180//! [`(usize, usize)`]: https://doc.rust-lang.org/std/primitive.usize.html
181//! [row major or column major order]: https://en.wikipedia.org/wiki/Row-_and_column-major_order
182
183#![deny(missing_docs)]
184
185use std::ops::{Index, IndexMut};
186
187#[cfg(feature = "serde")]
188use serde::{Deserialize, Serialize};
189
190/// A dynamically sized two-dimensional vec.
191#[derive(Debug, Clone, Eq, PartialEq, Hash)]
192#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
193pub struct Vecgrid<T> {
194    vecgrid: Vec<T>,
195    num_rows: usize,
196    num_columns: usize,
197}
198
199/// An error that can arise during the use of an [`Vecgrid`].
200///
201/// [`Vecgrid`]: struct.Vecgrid.html
202#[derive(Debug, Eq, PartialEq)]
203pub enum Error {
204    /// The given indices were out of bounds.
205    IndicesOutOfBounds(usize, usize),
206    /// The given index in row or column major order was out of bounds.
207    IndexOutOfBounds(usize),
208    /// The dimensions given did not match the elements provided
209    DimensionMismatch,
210    /// There were not enough elements to fill the vecgrid.
211    NotEnoughElements,
212}
213
214impl<T> Vecgrid<T> {
215    /// Creates a new [`Vecgrid`] from a [`Vec`] of rows, each of which is a
216    /// [`Vec`] of elements.
217    ///
218    /// Returns an error if the rows are not all the same size.
219    ///
220    /// # Examples
221    ///
222    /// ```
223    /// # use vecgrid::{Vecgrid, Error};
224    /// # fn main() -> Result<(), Error> {
225    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
226    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
227    /// assert_eq!(vecgrid[(1, 2)], 6);
228    /// assert_eq!(vecgrid.as_rows(), rows);
229    /// # Ok(())
230    /// # }
231    /// ```
232    ///
233    /// [`Vecgrid`]: struct.Vecgrid.html
234    /// [`Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
235    pub fn from_rows(rows: Vec<Vec<T>>) -> Result<Self, Error> {
236        let row_len = rows.get(0).map(Vec::len).unwrap_or(0);
237        let mut vecgrid = Vecgrid {
238            vecgrid: Vec::new(),
239            num_rows: 0,
240            num_columns: row_len,
241        };
242        vecgrid.append_rows(rows)?;
243        Ok(vecgrid)
244    }
245
246    /// Creates a new [`Vecgrid`] from a [`Vec`] of columns, each of which
247    /// contains a [`Vec`] of elements.
248    ///
249    /// Returns an error if the columns are not all the same size.
250    ///
251    /// # Examples
252    ///
253    /// ```
254    /// # use vecgrid::{Vecgrid, Error};
255    /// # fn main() -> Result<(), Error> {
256    /// let columns = vec![vec![1, 4], vec![2, 5], vec![3, 6]];
257    /// let vecgrid = Vecgrid::from_columns(columns.clone())?;
258    /// assert_eq!(vecgrid[(1, 2)], 6);
259    /// assert_eq!(vecgrid.as_rows(), vec![vec![1, 2, 3], vec![4, 5, 6]]);
260    /// # Ok(())
261    /// # }
262    /// ```
263    ///
264    /// [`Vecgrid`]: struct.Vecgrid.html
265    /// [`Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
266    pub fn from_columns(columns: Vec<Vec<T>>) -> Result<Self, Error>
267    where
268        T: Clone, //TODO: Remove type guard
269    {
270        let column_len = columns.get(0).map(Vec::len).unwrap_or(0);
271        if !columns.iter().all(|column| column.len() == column_len) {
272            return Err(Error::DimensionMismatch);
273        }
274        let num_rows = column_len;
275        let num_columns = columns.len();
276        let vecgrid = indices_row_major(num_rows, num_columns)
277            .map(|(row, column)| columns[column][row].clone())
278            .collect();
279        Ok(Vecgrid {
280            vecgrid,
281            num_rows,
282            num_columns,
283        })
284    }
285
286    /// Creates a new [`Vecgrid`] from the given flat [`Vec`] in [row major
287    /// order].
288    ///
289    /// Returns an error if the number of elements in `elements` is not the
290    /// product of `num_rows` and `num_columns`, i.e. the dimensions do not
291    /// match.
292    ///
293    /// # Examples
294    ///
295    /// ```
296    /// # use vecgrid::{Vecgrid, Error};
297    /// # fn main() -> Result<(), Error> {
298    /// let row_major = vec![1, 2, 3, 4, 5, 6];
299    /// let vecgrid = Vecgrid::from_row_major(row_major, 2, 3)?;
300    /// assert_eq!(vecgrid[(1, 2)], 6);
301    /// assert_eq!(vecgrid.as_rows(), vec![vec![1, 2, 3], vec![4, 5, 6]]);
302    /// # Ok(())
303    /// # }
304    /// ```
305    ///
306    /// [`Vecgrid`]: struct.Vecgrid.html
307    /// [row major order]: https://en.wikipedia.org/wiki/Row-_and_column-major_order
308    pub fn from_row_major(
309        elements: Vec<T>,
310        num_rows: usize,
311        num_columns: usize,
312    ) -> Result<Self, Error> {
313        let total_len = num_rows * num_columns;
314        if total_len != elements.len() {
315            return Err(Error::DimensionMismatch);
316        }
317        Ok(Vecgrid {
318            vecgrid: elements,
319            num_rows,
320            num_columns,
321        })
322    }
323
324    /// Creates a new [`Vecgrid`] from the given flat [`Vec`] in [column major
325    /// order].
326    ///
327    /// Return an error if the number of elements in `elements` is not the
328    /// product of `num_rows` and `num_columns`, i.e. the dimensions do not
329    /// match.
330    ///
331    /// # Examples
332    ///
333    /// ```
334    /// # use vecgrid::{Vecgrid, Error};
335    /// # fn main() -> Result<(), Error> {
336    /// let column_major = vec![1, 4, 2, 5, 3, 6];
337    /// let vecgrid = Vecgrid::from_column_major(column_major, 2, 3)?;
338    /// assert_eq!(vecgrid[(1, 2)], 6);
339    /// assert_eq!(vecgrid.as_rows(), vec![vec![1, 2, 3], vec![4, 5, 6]]);
340    /// # Ok(())
341    /// # }
342    /// ```
343    ///
344    /// [`Vecgrid`]: struct.Vecgrid.html
345    /// [column major order]: https://en.wikipedia.org/wiki/Row-_and_column-major_order
346    pub fn from_column_major(
347        elements: Vec<T>,
348        num_rows: usize,
349        num_columns: usize,
350    ) -> Result<Self, Error>
351    where
352        T: Clone, // TODO: remove type guard
353    {
354        let total_len = num_rows * num_columns;
355        if total_len != elements.len() {
356            return Err(Error::DimensionMismatch);
357        }
358        let indices_row_major =
359            (0..num_rows).flat_map(move |row| (0..num_columns).map(move |column| (row, column)));
360        let vecgrid = indices_row_major
361            .map(|(row, column)| {
362                let index = column * num_rows + row;
363                elements[index].clone()
364            })
365            .collect();
366        Ok(Vecgrid {
367            vecgrid,
368            num_rows,
369            num_columns,
370        })
371    }
372
373    /// Creates a new [`Vecgrid`] with the specified number of rows and columns
374    /// that contains `element` in every location.
375    ///
376    /// # Examples
377    ///
378    /// ```
379    /// # use vecgrid::{Vecgrid, Error};
380    /// let vecgrid = Vecgrid::filled_with(42, 2, 3);
381    /// assert_eq!(vecgrid.as_rows(), vec![vec![42, 42, 42], vec![42, 42, 42]]);
382    /// ```
383    ///
384    /// [`Vecgrid`]: struct.Vecgrid.html
385    pub fn filled_with(element: T, num_rows: usize, num_columns: usize) -> Self
386    where
387        T: Clone,
388    {
389        let total_len = num_rows * num_columns;
390        let vecgrid = vec![element; total_len];
391        Vecgrid {
392            vecgrid,
393            num_rows,
394            num_columns,
395        }
396    }
397
398    /// Creates a new [`Vecgrid`] with the specified number of rows and columns
399    /// and fills each element with the result of calling the given
400    /// function. The function is called once for every location going in
401    /// row major order.
402    ///
403    /// # Examples
404    ///
405    /// ```
406    /// # use vecgrid::{Vecgrid, Error};
407    /// let mut counter = 1;
408    /// let increment = || {
409    ///     let tmp = counter;
410    ///     counter += 1;
411    ///     tmp
412    /// };
413    /// let vecgrid = Vecgrid::filled_by_row_major(increment, 2, 3);
414    /// assert_eq!(vecgrid.as_rows(), vec![vec![1, 2, 3], vec![4, 5, 6]]);
415    /// ```
416    ///
417    /// [`Vecgrid`]: struct.Vecgrid.html
418    pub fn filled_by_row_major<F>(mut generator: F, num_rows: usize, num_columns: usize) -> Self
419    where
420        F: FnMut() -> T,
421    {
422        let total_len = num_rows * num_columns;
423        let vecgrid = (0..total_len).map(|_| generator()).collect();
424        Vecgrid {
425            vecgrid,
426            num_rows,
427            num_columns,
428        }
429    }
430
431    /// Creates a new [`Vecgrid`] with the specified number of rows and columns
432    /// and fills each element with the result of calling the given
433    /// function. The function is called once for every location going in
434    /// column major order.
435    ///
436    /// # Examples
437    ///
438    /// ```
439    /// # use vecgrid::{Vecgrid, Error};
440    /// let mut counter = 1;
441    /// let increment = || {
442    ///     let tmp = counter;
443    ///     counter += 1;
444    ///     tmp
445    /// };
446    /// let vecgrid = Vecgrid::filled_by_column_major(increment, 2, 3);
447    /// assert_eq!(vecgrid.as_columns(), vec![vec![1, 2], vec![3, 4], vec![5, 6]]);
448    /// ```
449    ///
450    /// [`Vecgrid`]: struct.Vecgrid.html
451    pub fn filled_by_column_major<F>(mut generator: F, num_rows: usize, num_columns: usize) -> Self
452    where
453        F: FnMut() -> T,
454        T: Clone,
455    {
456        let total_len = num_rows * num_columns;
457        let vecgrid_column_major = (0..total_len).map(|_| generator()).collect::<Vec<_>>();
458        Vecgrid::from_column_major(vecgrid_column_major, num_rows, num_columns)
459            .expect("Filled by should never fail")
460    }
461
462    /// Creates a new [`Vecgrid`] with the specified number of rows and columns
463    /// and fills each element with the elements produced from the provided
464    /// iterator. If the iterator produces more than enough elements, the
465    /// remaining are unused. Returns an error if the iterator does not produce
466    /// enough elements.
467    ///
468    /// The elements are inserted into the vecgrid in [row major order].
469    ///
470    /// # Examples
471    ///
472    /// ```
473    /// # use vecgrid::{Vecgrid, Error};
474    /// # fn main() -> Result<(), Error> {
475    /// let iterator = (1..);
476    /// let vecgrid = Vecgrid::from_iter_row_major(iterator, 2, 3)?;
477    /// assert_eq!(vecgrid.as_rows(), vec![vec![1, 2, 3], vec![4, 5, 6]]);
478    /// # Ok(())
479    /// # }
480    /// ```
481    ///
482    /// [`Vecgrid`]: struct.Vecgrid.html
483    /// [row major order]: https://en.wikipedia.org/wiki/Row-_and_column-major_order
484    pub fn from_iter_row_major<I>(
485        iterator: I,
486        num_rows: usize,
487        num_columns: usize,
488    ) -> Result<Self, Error>
489    where
490        I: Iterator<Item = T>,
491    {
492        let total_len = num_rows * num_columns;
493        let vecgrid = iterator.take(total_len).collect::<Vec<_>>();
494        if vecgrid.len() != total_len {
495            return Err(Error::NotEnoughElements);
496        }
497        Ok(Vecgrid {
498            vecgrid,
499            num_rows,
500            num_columns,
501        })
502    }
503
504    /// Creates a new [`Vecgrid`] with the specified number of rows and columns
505    /// and fills each element with the elements produced from the provided
506    /// iterator. If the iterator produces more than enough elements, the
507    /// remaining are unused. Returns an error if the iterator does not produce
508    /// enough elements.
509    ///
510    /// The elements are inserted into the vecgrid in [column major order].
511    ///
512    /// # Examples
513    ///
514    /// ```
515    /// # use vecgrid::{Vecgrid, Error};
516    /// # fn main() -> Result<(), Error> {
517    /// let iterator = (1..);
518    /// let vecgrid = Vecgrid::from_iter_column_major(iterator, 2, 3)?;
519    /// assert_eq!(vecgrid.as_rows(), vec![vec![1, 3, 5], vec![2, 4, 6]]);
520    /// # Ok(())
521    /// # }
522    /// ```
523    ///
524    /// [`Vecgrid`]: struct.Vecgrid.html
525    /// [column major order]: https://en.wikipedia.org/wiki/Row-_and_column-major_order
526    pub fn from_iter_column_major<I>(
527        iterator: I,
528        num_rows: usize,
529        num_columns: usize,
530    ) -> Result<Self, Error>
531    where
532        I: Iterator<Item = T>,
533        T: Clone,
534    {
535        let total_len = num_rows * num_columns;
536        let vecgrid_column_major = iterator.take(total_len).collect::<Vec<_>>();
537        Vecgrid::from_column_major(vecgrid_column_major, num_rows, num_columns)
538            .map_err(|_| Error::NotEnoughElements)
539    }
540
541    /// The number of rows.
542    pub fn num_rows(&self) -> usize {
543        self.num_rows
544    }
545
546    /// The number of columns.
547    pub fn num_columns(&self) -> usize {
548        self.num_columns
549    }
550
551    /// The total number of elements, i.e. the product of `num_rows` and
552    /// `num_columns`.
553    pub fn num_elements(&self) -> usize {
554        self.num_rows * self.num_columns
555    }
556
557    /// The number of elements in each row, i.e. the number of columns.
558    pub fn row_len(&self) -> usize {
559        self.num_columns
560    }
561
562    /// The number of elements in each column, i.e. the number of rows.
563    pub fn column_len(&self) -> usize {
564        self.num_rows
565    }
566
567    /// Returns a reference to the element at the given `row` and `column` if the
568    /// index is in bounds (wrapped in [`Some`]). Returns [`None`] if the index
569    /// is out of bounds.
570    ///
571    /// # Examples
572    ///
573    /// ```
574    /// # use vecgrid::{Vecgrid, Error};
575    /// let vecgrid = Vecgrid::filled_with(42, 2, 3);
576    /// assert_eq!(vecgrid.get(0, 0), Some(&42));
577    /// assert_eq!(vecgrid.get(10, 10), None);
578    /// ```
579    ///
580    /// [`Some`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.Some
581    /// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None
582    pub fn get(&self, row: usize, column: usize) -> Option<&T> {
583        self.get_index(row, column)
584            .map(|index| &self.vecgrid[index])
585    }
586
587    /// Returns a reference to the element at the given index in row major
588    /// order. Returns [`None`] if the index is out of bounds.
589    ///
590    /// # Examples
591    ///
592    /// ```
593    /// # use vecgrid::{Vecgrid, Error};
594    /// # fn main() -> Result<(), Error> {
595    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
596    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
597    /// assert_eq!(vecgrid.get_row_major(2), Some(&3));
598    /// assert_eq!(vecgrid.get_row_major(4), Some(&5));
599    /// assert_eq!(vecgrid.get_row_major(10), None);
600    /// # Ok(())
601    /// # }
602    /// ```
603    ///
604    /// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None
605    pub fn get_row_major(&self, index: usize) -> Option<&T> {
606        self.vecgrid.get(index)
607    }
608
609    /// Returns a reference to the element at the given index in column major
610    /// order. Returns [`None`] if the index is out of bounds.
611    ///
612    /// # Examples
613    ///
614    /// ```
615    /// # use vecgrid::{Vecgrid, Error};
616    /// # fn main() -> Result<(), Error> {
617    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
618    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
619    /// assert_eq!(vecgrid.get_column_major(2), Some(&2));
620    /// assert_eq!(vecgrid.get_column_major(4), Some(&3));
621    /// assert_eq!(vecgrid.get_column_major(10), None);
622    /// # Ok(())
623    /// # }
624    /// ```
625    ///
626    /// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None
627    pub fn get_column_major(&self, index: usize) -> Option<&T> {
628        let column = dbg!(dbg!(index) / self.num_rows);
629        let row = dbg!(index % self.num_rows);
630        self.get(row, column)
631    }
632
633    /// Returns a mutable reference to the element at the given `row` and
634    /// `column` if the index is in bounds (wrapped in [`Some`]). Returns
635    /// [`None`] if the index is out of bounds.
636    ///
637    /// # Examples
638    ///
639    /// ```
640    /// # use vecgrid::{Vecgrid, Error};
641    /// let mut vecgrid = Vecgrid::filled_with(42, 2, 3);
642    ///
643    /// assert_eq!(vecgrid.get_mut(0, 0), Some(&mut 42));
644    /// assert_eq!(vecgrid.get_mut(10, 10), None);
645    ///
646    /// vecgrid.get_mut(0, 0).map(|x| *x = 100);
647    /// assert_eq!(vecgrid.get(0, 0), Some(&100));
648    ///
649    /// vecgrid.get_mut(10, 10).map(|x| *x = 200);
650    /// assert_eq!(vecgrid.get(10, 10), None);
651    /// ```
652    ///
653    /// [`Some`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.Some
654    /// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None
655    pub fn get_mut(&mut self, row: usize, column: usize) -> Option<&mut T> {
656        self.get_index(row, column)
657            .map(move |index| &mut self.vecgrid[index])
658    }
659
660    /// Returns a mutable reference to the element at the given index in row
661    /// major order. Returns [`None`] if the index is out of bounds.
662    ///
663    /// # Examples
664    ///
665    /// ```
666    /// # use vecgrid::{Vecgrid, Error};
667    /// # fn main() -> Result<(), Error> {
668    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
669    /// let mut vecgrid = Vecgrid::from_rows(rows.clone())?;
670    ///
671    /// assert_eq!(vecgrid.get_mut_row_major(1), Some(&mut 2));
672    /// assert_eq!(vecgrid.get_mut_row_major(10), None);
673    ///
674    /// vecgrid.get_mut_row_major(3).map(|x| *x = 100);
675    /// assert_eq!(vecgrid.get(1, 0), Some(&100));
676    ///
677    /// vecgrid.get_mut_row_major(10).map(|x| *x = 200);
678    /// assert_eq!(vecgrid.get(10, 10), None);
679    /// # Ok(())
680    /// # }
681    /// ```
682    ///
683    /// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None
684    pub fn get_mut_row_major(&mut self, index: usize) -> Option<&mut T> {
685        self.vecgrid.get_mut(index)
686    }
687
688    /// Returns a mutable reference to the element at the given index in row
689    /// major order. Returns [`None`] if the index is out of bounds.
690    ///
691    /// # Examples
692    ///
693    /// ```
694    /// # use vecgrid::{Vecgrid, Error};
695    /// # fn main() -> Result<(), Error> {
696    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
697    /// let mut vecgrid = Vecgrid::from_rows(rows.clone())?;
698    ///
699    /// assert_eq!(vecgrid.get_mut_column_major(1), Some(&mut 4));
700    /// assert_eq!(vecgrid.get_mut_column_major(10), None);
701    ///
702    /// vecgrid.get_mut_column_major(4).map(|x| *x = 100);
703    /// assert_eq!(vecgrid.get(0, 2), Some(&100));
704    ///
705    /// vecgrid.get_mut_column_major(10).map(|x| *x = 200);
706    /// assert_eq!(vecgrid.get(10, 10), None);
707    /// # Ok(())
708    /// # }
709    /// ```
710    ///
711    /// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None
712    pub fn get_mut_column_major(&mut self, index: usize) -> Option<&mut T> {
713        let column = index / self.num_rows;
714        let row = index % self.num_rows;
715        self.get_mut(row, column)
716    }
717
718    /// Changes the element at given `row` and `column` to `element`. Returns
719    /// [`Ok(())`] if the indices were in bounds and returns an [`Err`]
720    /// otherwise.
721    ///
722    /// # Examples
723    ///
724    /// ```
725    /// # use vecgrid::{Vecgrid, Error};
726    /// let mut vecgrid = Vecgrid::filled_with(42, 2, 3);
727    ///
728    /// let result = vecgrid.set(0, 0, 100);
729    /// assert_eq!(result, Ok(()));
730    /// assert_eq!(vecgrid.get(0, 0), Some(&100));
731    ///
732    /// let result = vecgrid.set(10, 20, 200);
733    /// assert_eq!(result, Err(Error::IndicesOutOfBounds(10, 20)));
734    /// ```
735    ///
736    /// [`Ok(())`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Ok
737    /// [vecgrid::Error]: enum.Error.html
738    /// [`Err`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
739    /// [`vecgrid::Error`]: enum.Error.html
740    pub fn set(&mut self, row: usize, column: usize, element: T) -> Result<(), Error> {
741        self.get_mut(row, column)
742            .map(|location| {
743                *location = element;
744            })
745            .ok_or(Error::IndicesOutOfBounds(row, column))
746    }
747
748    /// Changes the element at the given `index` to `element`, in row major
749    /// order. Returns [`Ok(())`] if the index is in bounds and returns an
750    /// [`Err`] otherwise.
751    ///
752    /// # Examples
753    ///
754    /// ```
755    /// # use vecgrid::{Vecgrid, Error};
756    /// let mut vecgrid = Vecgrid::filled_with(42, 2, 3);
757    ///
758    /// let result = vecgrid.set_row_major(4, 100);
759    /// assert_eq!(result, Ok(()));
760    /// assert_eq!(vecgrid.get(1, 1), Some(&100));
761    ///
762    /// let result = vecgrid.set_row_major(10, 200);
763    /// assert_eq!(result, Err(Error::IndexOutOfBounds(10)));
764    /// ```
765    ///
766    /// [`Ok(())`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Ok
767    /// [vecgrid::Error]: enum.Error.html
768    /// [`Err`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
769    /// [`vecgrid::Error`]: enum.Error.html
770    pub fn set_row_major(&mut self, index: usize, element: T) -> Result<(), Error> {
771        self.get_mut_row_major(index)
772            .map(|location| {
773                *location = element;
774            })
775            .ok_or(Error::IndexOutOfBounds(index))
776    }
777
778    /// Changes the element at the given `index` to `element`, in column major
779    /// order. Returns [`Ok(())`] if the index is in bounds and returns an
780    /// [`Err`] otherwise.
781    ///
782    /// # Examples
783    ///
784    /// ```
785    /// # use vecgrid::{Vecgrid, Error};
786    /// let mut vecgrid = Vecgrid::filled_with(42, 2, 3);
787    ///
788    /// let result = vecgrid.set_column_major(4, 100);
789    /// assert_eq!(result, Ok(()));
790    /// assert_eq!(vecgrid.get(0, 2), Some(&100));
791    ///
792    /// let result = vecgrid.set_column_major(10, 200);
793    /// assert_eq!(result, Err(Error::IndexOutOfBounds(10)));
794    /// ```
795    ///
796    /// [`Ok(())`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Ok
797    /// [vecgrid::Error]: enum.Error.html
798    /// [`Err`]: https://doc.rust-lang.org/std/result/enum.Result.html#variant.Err
799    /// [`vecgrid::Error`]: enum.Error.html
800    pub fn set_column_major(&mut self, index: usize, element: T) -> Result<(), Error> {
801        self.get_mut_column_major(index)
802            .map(|location| {
803                *location = element;
804            })
805            .ok_or(Error::IndexOutOfBounds(index))
806    }
807
808    /// Returns an [`Iterator`] over references to all elements in [row major
809    /// order].
810    ///
811    /// # Examples
812    ///
813    /// ```
814    /// # use vecgrid::{Vecgrid, Error};
815    /// # fn main() -> Result<(), Error> {
816    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
817    /// let elements = vec![1, 2, 3, 4, 5, 6];
818    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
819    /// let row_major = vecgrid.elements_row_major_iter();
820    /// assert_eq!(row_major.cloned().collect::<Vec<_>>(), elements);
821    /// # Ok(())
822    /// # }
823    /// ```
824    ///
825    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
826    /// [row major order]: https://en.wikipedia.org/wiki/Row-_and_column-major_order
827    pub fn elements_row_major_iter(&self) -> impl DoubleEndedIterator<Item = &T> + Clone {
828        self.vecgrid.iter()
829    }
830
831    /// Returns an [`Iterator`] over mutable references to all elements in [row major
832    /// order].
833    ///
834    /// # Examples
835    ///
836    /// ```
837    /// # use vecgrid::{Vecgrid, Error};
838    /// # fn main() -> Result<(), Error> {
839    ///    let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
840    ///    let elements = vec![1, 2, 3, 4, 5, 6];
841    ///    let mut vecgrid = Vecgrid::from_rows(rows.clone())?;
842    ///    let row_major = vecgrid.elements_row_major_iter_mut();
843    ///    for (i, val) in row_major
844    ///        .map(|val| {
845    ///            *val += 1;
846    ///            val
847    ///        })
848    ///        .enumerate()
849    ///    {
850    ///        assert_eq!(*val, elements[i] + 1);
851    ///    }
852    /// # Ok(())
853    /// # }
854    /// ```
855    ///
856    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
857    /// [row major order]: https://en.wikipedia.org/wiki/Row-_and_column-major_order
858    pub fn elements_row_major_iter_mut(&mut self) -> impl DoubleEndedIterator<Item = &mut T> {
859        self.vecgrid.iter_mut()
860    }
861
862    /// Returns an [`Iterator`] over references to all elements in [column major
863    /// order].
864    ///
865    /// # Examples
866    ///
867    /// ```
868    /// # use vecgrid::{Vecgrid, Error};
869    /// # fn main() -> Result<(), Error> {
870    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
871    /// let elements = vec![1, 4, 2, 5, 3, 6];
872    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
873    /// let column_major = vecgrid.elements_column_major_iter();
874    /// assert_eq!(column_major.cloned().collect::<Vec<_>>(), elements);
875    /// # Ok(())
876    /// # }
877    /// ```
878    ///
879    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
880    /// [column major order]: https://en.wikipedia.org/wiki/Row-_and_column-major_order
881    pub fn elements_column_major_iter(&self) -> impl DoubleEndedIterator<Item = &T> + Clone {
882        self.indices_column_major().map(move |i| &self[i])
883    }
884
885    /// Returns an [`Iterator`] over mutable references to all elements in [column major
886    /// order].
887    ///
888    /// # Examples
889    ///
890    /// ```
891    /// # use vecgrid::{Vecgrid, Error};
892    /// # fn main() -> Result<(), Error> {
893    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
894    /// let elements = vec![1, 4, 7, 2, 5, 8, 3, 6, 9];
895    /// let mut vecgrid = Vecgrid::from_rows(rows.clone())?;
896    /// let column_major = vecgrid.elements_column_major_iter_mut();
897    /// for (i, val) in column_major
898    ///     .map(|val| {
899    ///         *val += 1;
900    ///         val
901    ///     })
902    ///     .enumerate()
903    /// {
904    ///     assert_eq!(*val, elements[i] + 1);
905    /// }
906    /// # Ok(())
907    /// # }
908    /// ```
909    ///
910    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
911    /// [column major order]: https://en.wikipedia.org/wiki/Row-_and_column-major_order
912    pub fn elements_column_major_iter_mut(&mut self) -> impl DoubleEndedIterator<Item = &mut T> {
913        self.columns_iter_mut().flatten()
914    }
915
916    /// Returns an [`Iterator`] over references to all elements in the given
917    /// row. Returns an error if the index is out of bounds.
918    ///
919    /// # Examples
920    ///
921    /// ```
922    /// # use vecgrid::{Vecgrid, Error};
923    /// # fn main() -> Result<(), Error> {
924    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
925    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
926    /// let mut row_iter = vecgrid.row_iter(1)?;
927    /// assert_eq!(row_iter.next(), Some(&4));
928    /// assert_eq!(row_iter.next(), Some(&5));
929    /// assert_eq!(row_iter.next(), Some(&6));
930    /// assert_eq!(row_iter.next(), None);
931    /// # Ok(())
932    /// # }
933    /// ```
934    ///
935    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
936    pub fn row_iter(&self, row_index: usize) -> Result<impl DoubleEndedIterator<Item = &T>, Error> {
937        let start = self
938            .get_index(row_index, 0)
939            .ok_or(Error::IndicesOutOfBounds(row_index, 0))?;
940        let end = start + self.row_len();
941        Ok(self.vecgrid[start..end].iter())
942    }
943
944    /// Returns an [`Iterator`] over mutable references to all elements in the given
945    /// row. Returns an error if the index is out of bounds.
946    ///
947    /// # Examples
948    ///
949    /// ```
950    /// # use vecgrid::{Vecgrid, Error};
951    /// # fn main() -> Result<(), Error> {
952    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
953    /// let mut vecgrid = Vecgrid::from_rows(rows.clone())?;
954    /// let mut row_iter = vecgrid.row_iter_mut(1)?;
955    /// assert_eq!(row_iter.next(), Some(&mut 4));
956    /// assert_eq!(row_iter.next(), Some(&mut 5));
957    /// assert_eq!(row_iter.next(), Some(&mut 6));
958    /// assert_eq!(row_iter.next(), None);
959    /// # Ok(())
960    /// # }
961    /// ```
962    ///
963    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
964    pub fn row_iter_mut(
965        &mut self,
966        row_index: usize,
967    ) -> Result<impl DoubleEndedIterator<Item = &mut T>, Error> {
968        let start = self
969            .get_index(row_index, 0)
970            .ok_or(Error::IndicesOutOfBounds(row_index, 0))?;
971        let end = start + self.row_len();
972        Ok(self.vecgrid[start..end].iter_mut())
973    }
974
975    /// Returns an [`Iterator`] over references to all elements in the given
976    /// column. Returns an error if the index is out of bounds.
977    ///
978    /// # Examples
979    ///
980    /// ```
981    /// # use vecgrid::{Vecgrid, Error};
982    /// # fn main() -> Result<(), Error> {
983    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
984    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
985    /// let mut column_iter = vecgrid.column_iter(1)?;
986    /// assert_eq!(column_iter.next(), Some(&2));
987    /// assert_eq!(column_iter.next(), Some(&5));
988    /// assert_eq!(column_iter.next(), None);
989    /// # Ok(())
990    /// # }
991    /// ```
992    ///
993    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
994    pub fn column_iter(
995        &self,
996        column_index: usize,
997    ) -> Result<impl DoubleEndedIterator<Item = &T>, Error> {
998        if column_index >= self.num_columns {
999            return Err(Error::IndicesOutOfBounds(0, column_index));
1000        }
1001        Ok((0..self.column_len()).map(move |row_index| &self[(row_index, column_index)]))
1002    }
1003
1004    /// Returns an [`Iterator`] over mutable references to all elements in the given
1005    /// column. Returns an error if the index is out of bounds.
1006    ///
1007    /// # Examples
1008    ///
1009    /// ```
1010    /// # use vecgrid::{Vecgrid, Error};
1011    /// # fn main() -> Result<(), Error> {
1012    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
1013    /// let mut vecgrid = Vecgrid::from_rows(rows.clone())?;
1014    /// let mut column_iter = vecgrid.column_iter_mut(1)?;
1015    /// assert_eq!(column_iter.next(), Some(&mut 2));
1016    /// assert_eq!(column_iter.next(), Some(&mut 5));
1017    /// assert_eq!(column_iter.next(), None);
1018    /// # Ok(())
1019    /// # }
1020    /// ```
1021    ///
1022    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
1023    pub fn column_iter_mut(
1024        &mut self,
1025        column_index: usize,
1026    ) -> Result<impl DoubleEndedIterator<Item = &mut T>, Error> {
1027        if column_index >= self.num_columns {
1028            return Err(Error::IndicesOutOfBounds(0, column_index));
1029        }
1030        Ok(self
1031            .vecgrid
1032            .iter_mut()
1033            .skip(column_index)
1034            .step_by(self.num_columns))
1035    }
1036
1037    /// Returns an [`Iterator`] over all rows. Each [`Item`] is itself another
1038    /// [`Iterator`] over references to the elements in that row.
1039    ///
1040    /// # Examples
1041    ///
1042    /// ```
1043    /// # use vecgrid::{Vecgrid, Error};
1044    /// # fn main() -> Result<(), Error> {
1045    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
1046    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
1047    /// for row_iter in vecgrid.rows_iter() {
1048    ///     for element in row_iter {
1049    ///         print!("{} ", element);
1050    ///     }
1051    ///     println!();
1052    /// }
1053    ///
1054    /// let mut rows_iter = vecgrid.rows_iter();
1055    ///
1056    /// let mut first_row_iter = rows_iter.next().unwrap();
1057    /// assert_eq!(first_row_iter.next(), Some(&1));
1058    /// assert_eq!(first_row_iter.next(), Some(&2));
1059    /// assert_eq!(first_row_iter.next(), Some(&3));
1060    /// assert_eq!(first_row_iter.next(), None);
1061    ///
1062    /// let mut second_row_iter = rows_iter.next().unwrap();
1063    /// assert_eq!(second_row_iter.next(), Some(&4));
1064    /// assert_eq!(second_row_iter.next(), Some(&5));
1065    /// assert_eq!(second_row_iter.next(), Some(&6));
1066    /// assert_eq!(second_row_iter.next(), None);
1067    ///
1068    /// assert!(rows_iter.next().is_none());
1069    /// # Ok(())
1070    /// # }
1071    /// ```
1072    ///
1073    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
1074    /// [`Item`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#associatedtype.Item
1075    pub fn rows_iter(
1076        &self,
1077    ) -> impl DoubleEndedIterator<Item = impl DoubleEndedIterator<Item = &T>> + Clone {
1078        (0..self.num_rows()).map(move |row_index| {
1079            self.row_iter(row_index)
1080                .expect("rows_iter should never fail")
1081        })
1082    }
1083
1084    /// Returns an [`Iterator`] over all rows. Each [`Item`] is itself another
1085    /// [`Iterator`] over mutable references to the elements in that row.
1086    ///
1087    /// # Examples
1088    ///
1089    /// ```
1090    /// # use vecgrid::{Vecgrid, Error};
1091    /// # fn main() -> Result<(), Error> {
1092    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
1093    /// let mut vecgrid = Vecgrid::from_rows(rows.clone())?;
1094    /// for row_iter in vecgrid.rows_iter() {
1095    ///     for element in row_iter {
1096    ///         print!("{} ", element);
1097    ///     }
1098    ///     println!();
1099    /// }
1100    ///
1101    /// let mut rows_iter = vecgrid.rows_iter_mut();
1102    ///
1103    /// let mut first_row_iter = rows_iter.next().unwrap();
1104    /// assert_eq!(first_row_iter.next(), Some(&mut 1));
1105    /// assert_eq!(first_row_iter.next(), Some(&mut 2));
1106    /// assert_eq!(first_row_iter.next(), Some(&mut 3));
1107    /// assert_eq!(first_row_iter.next(), None);
1108    ///
1109    /// let mut second_row_iter = rows_iter.next().unwrap();
1110    /// assert_eq!(second_row_iter.next(), Some(&mut 4));
1111    /// assert_eq!(second_row_iter.next(), Some(&mut 5));
1112    /// assert_eq!(second_row_iter.next(), Some(&mut 6));
1113    /// assert_eq!(second_row_iter.next(), None);
1114    ///
1115    /// assert!(rows_iter.next().is_none());
1116    /// # Ok(())
1117    /// # }
1118    /// ```
1119    ///
1120    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
1121    /// [`Item`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#associatedtype.Item
1122    pub fn rows_iter_mut(
1123        &mut self,
1124    ) -> impl DoubleEndedIterator<Item = impl DoubleEndedIterator<Item = &mut T>> {
1125        let row_len = self.row_len();
1126        self.vecgrid.chunks_mut(row_len).map(|r| r.iter_mut())
1127    }
1128
1129    /// Returns an [`Iterator`] over all columns. Each [`Item`] is itself
1130    /// another [`Iterator`] over references to the elements in that column.
1131    ///
1132    /// # Examples
1133    ///
1134    /// ```
1135    /// # use vecgrid::{Vecgrid, Error};
1136    /// # fn main() -> Result<(), Error> {
1137    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
1138    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
1139    /// for column_iter in vecgrid.columns_iter() {
1140    ///     for element in column_iter {
1141    ///         print!("{} ", element);
1142    ///     }
1143    ///     println!();
1144    /// }
1145    ///
1146    /// let mut columns_iter = vecgrid.columns_iter();
1147    ///
1148    /// let mut first_column_iter = columns_iter.next().unwrap();
1149    /// assert_eq!(first_column_iter.next(), Some(&1));
1150    /// assert_eq!(first_column_iter.next(), Some(&4));
1151    /// assert_eq!(first_column_iter.next(), None);
1152    ///
1153    /// let mut second_column_iter = columns_iter.next().unwrap();
1154    /// assert_eq!(second_column_iter.next(), Some(&2));
1155    /// assert_eq!(second_column_iter.next(), Some(&5));
1156    /// assert_eq!(second_column_iter.next(), None);
1157    ///
1158    /// let mut third_column_iter = columns_iter.next().unwrap();
1159    /// assert_eq!(third_column_iter.next(), Some(&3));
1160    /// assert_eq!(third_column_iter.next(), Some(&6));
1161    /// assert_eq!(third_column_iter.next(), None);
1162    ///
1163    /// assert!(columns_iter.next().is_none());
1164    /// # Ok(())
1165    /// # }
1166    /// ```
1167    ///
1168    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
1169    /// [`Item`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#associatedtype.Item
1170    pub fn columns_iter(
1171        &self,
1172    ) -> impl DoubleEndedIterator<Item = impl DoubleEndedIterator<Item = &T>> + Clone {
1173        (0..self.num_columns).map(move |column_index| {
1174            self.column_iter(column_index)
1175                .expect("columns_iter should never fail")
1176        })
1177    }
1178
1179    /// Returns an [`Iterator`] over all columns. Each [`Item`] is itself
1180    /// another [`Iterator`] over mutable references to the elements in that column.
1181    ///
1182    /// # Examples
1183    ///
1184    /// ```
1185    /// # use vecgrid::{Vecgrid, Error};
1186    /// # fn main() -> Result<(), Error> {
1187    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
1188    /// let mut vecgrid = Vecgrid::from_rows(rows.clone())?;
1189    /// for column_iter in vecgrid.columns_iter_mut() {
1190    ///     for element in column_iter {
1191    ///         print!("{} ", element);
1192    ///     }
1193    ///     println!();
1194    /// }
1195    ///
1196    /// let mut columns_iter = vecgrid.columns_iter_mut();
1197    ///
1198    /// let mut first_column_iter = columns_iter.next().unwrap();
1199    /// assert_eq!(first_column_iter.next(), Some(&mut 1));
1200    /// assert_eq!(first_column_iter.next(), Some(&mut 4));
1201    /// assert_eq!(first_column_iter.next(), None);
1202    ///
1203    /// let mut second_column_iter = columns_iter.next().unwrap();
1204    /// assert_eq!(second_column_iter.next(), Some(&mut 2));
1205    /// assert_eq!(second_column_iter.next(), Some(&mut 5));
1206    /// assert_eq!(second_column_iter.next(), None);
1207    ///
1208    /// let mut third_column_iter = columns_iter.next().unwrap();
1209    /// assert_eq!(third_column_iter.next(), Some(&mut 3));
1210    /// assert_eq!(third_column_iter.next(), Some(&mut 6));
1211    /// assert_eq!(third_column_iter.next(), None);
1212    ///
1213    /// assert!(columns_iter.next().is_none());
1214    /// # Ok(())
1215    /// # }
1216    /// ```
1217    ///
1218    /// [`Iterator`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html
1219    /// [`Item`]: https://doc.rust-lang.org/std/iter/trait.Iterator.html#associatedtype.Item
1220    pub fn columns_iter_mut(
1221        &mut self,
1222    ) -> impl DoubleEndedIterator<Item = impl DoubleEndedIterator<Item = &mut T>> {
1223        let (num_columns, num_rows) = (self.num_columns(), self.num_rows());
1224        let pointer = self.vecgrid.as_mut_ptr();
1225        (0..num_columns).map(move |ci| {
1226            (0..num_rows).map(move |i| {
1227                let offset = (i * num_columns) + ci;
1228                unsafe { &mut *pointer.add(offset) }
1229            })
1230        })
1231    }
1232
1233    /// Collects the [`Vecgrid`] into a [`Vec`] of rows, each of which contains
1234    /// a [`Vec`] of elements.
1235    ///
1236    /// # Examples
1237    ///
1238    /// ```
1239    /// # use vecgrid::{Vecgrid, Error};
1240    /// # fn main() -> Result<(), Error> {
1241    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
1242    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
1243    /// assert_eq!(vecgrid.as_rows(), rows);
1244    /// # Ok(())
1245    /// # }
1246    /// ```
1247    ///
1248    /// [`Vecgrid`]: struct.Vecgrid.html
1249    /// [`Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
1250    pub fn as_rows(&self) -> Vec<Vec<T>>
1251    where
1252        T: Clone,
1253    {
1254        self.rows_iter()
1255            .map(|row_iter| row_iter.cloned().collect())
1256            .collect()
1257    }
1258
1259    /// Collects the [`Vecgrid`] into a [`Vec`] of columns, each of which
1260    /// contains a [`Vec`] of elements.
1261    ///
1262    /// # Examples
1263    ///
1264    /// ```
1265    /// # use vecgrid::{Vecgrid, Error};
1266    /// # fn main() -> Result<(), Error> {
1267    /// let columns = vec![vec![1, 4], vec![2, 5], vec![3, 6]];
1268    /// let vecgrid = Vecgrid::from_columns(columns.clone())?;
1269    /// assert_eq!(vecgrid.as_columns(), columns);
1270    /// # Ok(())
1271    /// # }
1272    /// ```
1273    ///
1274    /// [`Vecgrid`]: struct.Vecgrid.html
1275    /// [`Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
1276    pub fn as_columns(&self) -> Vec<Vec<T>>
1277    where
1278        T: Clone,
1279    {
1280        self.columns_iter()
1281            .map(|column_iter| column_iter.cloned().collect())
1282            .collect()
1283    }
1284
1285    /// Collects the [`Vecgrid`] into a [`Vec`] of elements in [row major
1286    /// order].
1287    ///
1288    /// # Examples
1289    ///
1290    /// ```
1291    /// # use vecgrid::{Vecgrid, Error};
1292    /// # fn main() -> Result<(), Error> {
1293    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
1294    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
1295    /// assert_eq!(vecgrid.as_row_major(), vec![1, 2, 3, 4, 5, 6]);
1296    /// # Ok(())
1297    /// # }
1298    /// ```
1299    ///
1300    /// [`Vecgrid`]: struct.Vecgrid.html
1301    /// [`Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
1302    /// [row major order]: https://en.wikipedia.org/wiki/Row-_and_column-major_order
1303    pub fn as_row_major(&self) -> Vec<T>
1304    where
1305        T: Clone,
1306    {
1307        self.elements_row_major_iter().cloned().collect()
1308    }
1309
1310    /// Collects the [`Vecgrid`] into a [`Vec`] of elements in [column major
1311    /// order].
1312    ///
1313    /// # Examples
1314    ///
1315    /// ```
1316    /// # use vecgrid::{Vecgrid, Error};
1317    /// # fn main() -> Result<(), Error> {
1318    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
1319    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
1320    /// assert_eq!(vecgrid.as_column_major(), vec![1, 4, 2, 5, 3, 6]);
1321    /// # Ok(())
1322    /// # }
1323    /// ```
1324    ///
1325    /// [`Vecgrid`]: struct.Vecgrid.html
1326    /// [`Vec`]: https://doc.rust-lang.org/std/vec/struct.Vec.html
1327    /// [column major order]: https://en.wikipedia.org/wiki/Row-_and_column-major_order
1328    pub fn as_column_major(&self) -> Vec<T>
1329    where
1330        T: Clone,
1331    {
1332        self.elements_column_major_iter().cloned().collect()
1333    }
1334
1335    /// Returns the indices of the vecgrid in row major order. Each index is a tuple of [`usize`].
1336    ///
1337    /// # Examples
1338    ///
1339    /// ```
1340    /// # use vecgrid::{Vecgrid, Error};
1341    /// # fn main() -> Result<(), Error> {
1342    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
1343    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
1344    /// let indices_row_major = vecgrid.indices_row_major().collect::<Vec<_>>();
1345    /// assert_eq!(
1346    ///     indices_row_major,
1347    ///     vec![(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]
1348    /// );
1349    /// # Ok(())
1350    /// # }
1351    /// ```
1352    ///
1353    /// [`usize`]: https://doc.rust-lang.org/std/primitive.usize.html
1354    pub fn indices_row_major(&self) -> impl DoubleEndedIterator<Item = (usize, usize)> + Clone {
1355        indices_row_major(self.num_rows, self.num_columns)
1356    }
1357
1358    /// Returns the indices of the vecgrid in column major order. Each index is a tuple of [`usize`].
1359    ///
1360    /// # Examples
1361    ///
1362    /// ```
1363    /// # use vecgrid::{Vecgrid, Error};
1364    /// # fn main() -> Result<(), Error> {
1365    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
1366    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
1367    /// let indices_column_major = vecgrid.indices_column_major().collect::<Vec<_>>();
1368    /// assert_eq!(
1369    ///     indices_column_major,
1370    ///     vec![(0, 0), (1, 0), (0, 1), (1, 1), (0, 2), (1, 2)]
1371    /// );
1372    /// # Ok(())
1373    /// # }
1374    /// ```
1375    ///
1376    /// [`usize`]: https://doc.rust-lang.org/std/primitive.usize.html
1377    pub fn indices_column_major(&self) -> impl DoubleEndedIterator<Item = (usize, usize)> + Clone {
1378        indices_column_major(self.num_rows, self.num_columns)
1379    }
1380
1381    /// Iterate through the vecgrid in row major order along with the corresponding indices. Each
1382    /// index is a tuple of [`usize`].
1383    ///
1384    /// # Examples
1385    /// # use vecgrid::{Vecgrid, Error};
1386    /// # fn main() -> Result<(), Error> {
1387    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
1388    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
1389    /// let enumerate_row_major = vecgrid.enumerate_row_major().collect::<Vec<_>>();
1390    /// assert_eq!(
1391    ///     enumerate_row_major,
1392    ///     vec![
1393    ///         ((0, 0), &1),
1394    ///         ((0, 1), &2),
1395    ///         ((0, 2), &3),
1396    ///         ((1, 0), &4),
1397    ///         ((1, 1), &5),
1398    ///         ((1, 2), &6)
1399    ///     ]
1400    /// );
1401    /// # Ok(())
1402    /// # }
1403    ///
1404    /// [`usize`]: https://doc.rust-lang.org/std/primitive.usize.html
1405    pub fn enumerate_row_major(
1406        &self,
1407    ) -> impl DoubleEndedIterator<Item = ((usize, usize), &T)> + Clone {
1408        self.indices_row_major().map(move |i| (i, &self[i]))
1409    }
1410
1411    /// Iterate through the vecgrid in column major order along with the corresponding indices. Each
1412    /// index is a tuple of [`usize`].
1413    ///
1414    /// # Examples
1415    /// # use vecgrid::{Vecgrid, Error};
1416    /// # fn main() -> Result<(), Error> {
1417    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6]];
1418    /// let vecgrid = Vecgrid::from_rows(rows.clone())?;
1419    /// let enumerate_column_major = vecgrid.enumerate_column_major().collect::<Vec<_>>();
1420    /// assert_eq!(
1421    ///     enumerate_column_major,
1422    ///     vec![
1423    ///         ((0, 0), &1),
1424    ///         ((1, 0), &4),
1425    ///         ((0, 1), &2),
1426    ///         ((1, 1), &5),
1427    ///         ((0, 2), &3),
1428    ///         ((1, 2), &6)
1429    ///     ]
1430    /// );
1431    /// # Ok(())
1432    /// # }
1433    ///
1434    /// [`usize`]: https://doc.rust-lang.org/std/primitive.usize.html
1435    pub fn enumerate_column_major(
1436        &self,
1437    ) -> impl DoubleEndedIterator<Item = ((usize, usize), &T)> + Clone {
1438        self.indices_column_major().map(move |i| (i, &self[i]))
1439    }
1440
1441    fn get_index(&self, row: usize, column: usize) -> Option<usize> {
1442        if row < self.num_rows && column < self.num_columns {
1443            Some(row * self.row_len() + column)
1444        } else {
1445            None
1446        }
1447    }
1448
1449    /// Inserts a new row into the vecgrid at the provided index of the row.
1450    /// Guards ensure that the supplied row matches the expected dimensions and that
1451    /// the index is in bound.
1452    ///
1453    /// # Examples
1454    /// # use vecgrid::{Vecgrid, Error};
1455    /// # fn main() -> Result<(), Error> {
1456    /// let rows = vec![vec![1, 2, 3], vec![7, 8, 9]];
1457    /// let new_row = vec![4, 5, 6];
1458    /// let result = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
1459    /// let mut vecgrid = Vecgrid::from_rows(rows.clone())?;
1460    /// vecgrid.insert_row(new_row, 1)?;
1461    /// assert_eq!(vecgrid.as_rows(), result);
1462    /// # Ok(())
1463    /// # }
1464    ///
1465    pub fn insert_row(&mut self, row: Vec<T>, at: usize) -> Result<(), Error> {
1466        match (row.len() == self.num_columns, at < self.num_rows) {
1467            (false, _) => Err(Error::DimensionMismatch),
1468            (_, false) => Err(Error::IndexOutOfBounds(at)),
1469            (true, true) => {
1470                let i = at * self.row_len();
1471                self.vecgrid.splice(i..i, row);
1472                self.num_rows += 1;
1473                Ok(())
1474            }
1475        }
1476    }
1477
1478    /// Inserts a slice of rows into the vecgrid at the provided index.
1479    /// Guards ensure that the supplied rows matches the expected dimensions and that
1480    /// the index is in bound.
1481    ///
1482    /// # Examples
1483    /// # use vecgrid::{Vecgrid, Error};
1484    /// # fn main() -> Result<(), Error> {
1485    /// let rows = vec![vec![1, 2], vec![7, 8]];
1486    /// let new_rows = vec![vec![3, 4], vec![5, 6]];
1487    /// let result = vec![vec![1, 2], vec![3, 4], vec![5, 6], vec![7, 8]];
1488    /// let mut vecgrid = Vecgrid::from_rows(rows.clone())?;
1489    /// vecgrid.insert_rows(new_row, 1)?;
1490    /// assert_eq!(vecgrid.as_rows(), result);
1491    /// # Ok(())
1492    /// # }
1493    ///
1494    pub fn insert_rows(&mut self, mut rows: Vec<Vec<T>>, at: usize) -> Result<(), Error> {
1495        match (
1496            rows.iter_mut().all(|r| r.len() == self.num_columns),
1497            at < self.num_rows + 1,
1498        ) {
1499            (false, _) => Err(Error::DimensionMismatch),
1500            (_, false) => Err(Error::IndexOutOfBounds(at)),
1501            (true, true) => {
1502                let i = at * self.row_len();
1503                let capacity = self.num_columns * rows.len();
1504                let num_new_rows = rows.len();
1505
1506                self.vecgrid
1507                    .splice(i..i, with_size_hint(rows.into_iter().flatten(), capacity));
1508                self.num_rows += num_new_rows;
1509                Ok(())
1510            }
1511        }
1512    }
1513
1514    /// Appends a vec of rows at the end of the vecgrid.
1515    /// Guards ensure that the supplied rows matches the expected dimensions.
1516    ///
1517    /// # Examples
1518    /// # use vecgrid::{Vecgrid, Error};
1519    /// # fn main() -> Result<(), Error> {
1520    /// let rows = vec![vec![1, 2], vec![3, 4]];
1521    /// let new_rows = vec![vec![5, 6], vec![7, 8]];
1522    /// let result = vec![vec![1, 2], vec![3, 4], vec![5, 6], vec![7, 8]];
1523    /// let mut vecgrid = Vecgrid::from_rows(rows.clone())?;
1524    /// vecgrid.append_rows(new_row)?;
1525    /// assert_eq!(vecgrid.as_rows(), result);
1526    /// # Ok(())
1527    /// # }
1528    ///
1529    pub fn append_rows(&mut self, rows: Vec<Vec<T>>) -> Result<(), Error> {
1530        self.insert_rows(rows, self.num_rows)
1531    }
1532
1533    /// Removes a row at the provided row index from the vecgrid.
1534    /// Guards ensure that the index is in bound.
1535    ///
1536    /// # Examples
1537    /// # use vecgrid::{Vecgrid, Error};
1538    /// # fn main() -> Result<(), Error> {
1539    /// let rows = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]];
1540    /// let result = vec![vec![1, 2, 3], vec![7, 8, 9]];
1541    /// let mut vecgrid = Vecgrid::from_rows(rows)?;
1542    /// vecgrid.remove_row(1)?;
1543    /// assert_eq!(vecgrid.as_rows(), result);
1544    /// # Ok(())
1545    /// # }
1546    ///
1547    pub fn remove_row(&mut self, at: usize) -> Result<(), Error> {
1548        self.remove_rows(at, 1)
1549    }
1550
1551    /// Removes `n` consecutive rows at the provided row index from the vecgrid.
1552    /// Guards ensure that the index is in bound.
1553    ///
1554    /// # Examples
1555    /// # use vecgrid::{Vecgrid, Error};
1556    /// # fn main() -> Result<(), Error> {
1557    /// let rows = vec![vec![1, 2], vec![3, 4], vec![5, 6], vec![7, 8]];
1558    /// let result = vec![vec![1, 2], vec![7, 8]];
1559    /// let mut vecgrid = Vecgrid::from_rows(rows)?;
1560    /// vecgrid.remove_rows(1, 2)?;
1561    /// assert_eq!(vecgrid.as_rows(), result);
1562    /// # Ok(())
1563    /// # }
1564    ///
1565    pub fn remove_rows(&mut self, at: usize, n: usize) -> Result<(), Error> {
1566        if at > self.num_rows && at + n > self.num_rows + 1 {
1567            return Err(Error::IndicesOutOfBounds(at, at + n));
1568        }
1569        let start = self.row_len() * at;
1570        let end = start + n * self.row_len();
1571        self.vecgrid.drain(start..end);
1572        self.num_rows -= n;
1573        Ok(())
1574    }
1575}
1576
1577impl<T> Index<(usize, usize)> for Vecgrid<T> {
1578    type Output = T;
1579
1580    /// Returns the element at the given indices, given as `(row, column)`.
1581    ///
1582    /// # Examples
1583    ///
1584    /// ```
1585    /// # use vecgrid::{Vecgrid, Error};
1586    /// let vecgrid = Vecgrid::filled_with(42, 2, 3);
1587    /// assert_eq!(vecgrid[(0, 0)], 42);
1588    /// ```
1589    ///
1590    /// # Panics
1591    ///
1592    /// Panics if the indices are out of bounds.
1593    ///
1594    /// ```rust,should_panic
1595    /// # use vecgrid::Vecgrid;
1596    /// let vecgrid = Vecgrid::filled_with(42, 2, 3);
1597    /// let element = vecgrid[(10, 10)];
1598    /// ```
1599    fn index(&self, (row, column): (usize, usize)) -> &Self::Output {
1600        self.get(row, column)
1601            .unwrap_or_else(|| panic!("Index indices {}, {} out of bounds", row, column))
1602    }
1603}
1604
1605impl<T> IndexMut<(usize, usize)> for Vecgrid<T> {
1606    /// Returns a mutable version of the element at the given indices, given as
1607    /// `(row, column)`.
1608    ///
1609    /// # Examples
1610    ///
1611    /// ```
1612    /// # use vecgrid::{Vecgrid, Error};
1613    /// let mut vecgrid = Vecgrid::filled_with(42, 2, 3);
1614    /// vecgrid[(0, 0)] = 100;
1615    /// assert_eq!(vecgrid[(0, 0)], 100);
1616    /// ```
1617    ///
1618    /// # Panics
1619    ///
1620    /// Panics if the indices are out of bounds.
1621    ///
1622    /// ```rust,should_panic
1623    /// # use vecgrid::Vecgrid;
1624    /// let mut vecgrid = Vecgrid::filled_with(42, 2, 3);
1625    /// vecgrid[(10, 10)] = 7;
1626    /// ```
1627    fn index_mut(&mut self, (row, column): (usize, usize)) -> &mut Self::Output {
1628        self.get_mut(row, column)
1629            .unwrap_or_else(|| panic!("Index mut indices {}, {} out of bounds", row, column))
1630    }
1631}
1632
1633struct SizeHint<I: Iterator> {
1634    inner: I,
1635    size_hint: usize,
1636}
1637impl<I: Iterator> Iterator for SizeHint<I> {
1638    type Item = I::Item;
1639
1640    fn next(&mut self) -> Option<Self::Item> {
1641        self.size_hint = self.size_hint.saturating_sub(1);
1642        self.inner.next()
1643    }
1644
1645    fn size_hint(&self) -> (usize, Option<usize>) {
1646        (self.size_hint, Some(self.size_hint))
1647    }
1648}
1649fn with_size_hint<I: Iterator>(inner: I, size_hint: usize) -> SizeHint<I> {
1650    SizeHint { inner, size_hint }
1651}
1652
1653fn indices_row_major(
1654    num_rows: usize,
1655    num_columns: usize,
1656) -> impl DoubleEndedIterator<Item = (usize, usize)> + Clone {
1657    (0..num_rows).flat_map(move |row| (0..num_columns).map(move |column| (row, column)))
1658}
1659
1660fn indices_column_major(
1661    num_rows: usize,
1662    num_columns: usize,
1663) -> impl DoubleEndedIterator<Item = (usize, usize)> + Clone {
1664    (0..num_columns).flat_map(move |column| (0..num_rows).map(move |row| (row, column)))
1665}