From e6b4fc105a1496bdd2619c0a4e742a341748742d Mon Sep 17 00:00:00 2001 From: Armin Becher Date: Sun, 5 Apr 2020 15:30:09 +0200 Subject: [PATCH] Add iter --- src/lib.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index e0215fa..5567bdd 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,8 @@ use std::fmt; use std::ops::Index; use std::ops::IndexMut; +use std::slice::Iter; +use std::slice::IterMut; /// Stores elements of a certain type in a 2D grid structure. pub struct Grid { @@ -202,6 +204,34 @@ impl Grid { self.cols = 0; self.data.clear(); } + + /// Returns an iterator over the whole grid,starting from the first row and column. + /// ``` + /// use grid::*; + /// let grid: Grid = grid![[1,2][3,4]]; + /// let mut iter = grid.iter(); + /// assert_eq!(iter.next(), Some(&1)); + /// assert_eq!(iter.next(), Some(&2)); + /// assert_eq!(iter.next(), Some(&3)); + /// assert_eq!(iter.next(), Some(&4)); + /// assert_eq!(iter.next(), None); + /// ``` + pub fn iter(&self) -> Iter { + self.data.iter() + } + + /// Returns an mutable iterator over the whole grid that allows modifying each value. + /// ``` + /// use grid::*; + /// let mut grid: Grid = grid![[1,2][3,4]]; + /// let mut iter = grid.iter_mut(); + /// let next = iter.next(); + /// assert_eq!(next, Some(&mut 1)); + /// *next.unwrap() = 10; + /// ``` + pub fn iter_mut(&mut self) -> IterMut { + self.data.iter_mut() + } } impl Clone for Grid { @@ -252,6 +282,17 @@ impl fmt::Debug for Grid { mod test { use super::*; + #[test] + fn iter() { + let grid: Grid = grid![[1,2][3,4]]; + let mut iter = grid.iter(); + assert_eq!(iter.next(), Some(&1)); + assert_eq!(iter.next(), Some(&2)); + assert_eq!(iter.next(), Some(&3)); + assert_eq!(iter.next(), Some(&4)); + assert_eq!(iter.next(), None); + } + #[test] fn clear() { let mut grid: Grid = grid![[1, 2, 3]];