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}