From e2593f6406284b04048ad39b2e7103722d5ad07a Mon Sep 17 00:00:00 2001 From: Armin Becher Date: Sun, 5 Apr 2020 23:35:05 +0200 Subject: [PATCH] Add push --- src/lib.rs | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 876c3d1..21e78a4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -347,6 +347,90 @@ impl Grid { ) } } + + /// Add a new row to the grid. + /// + /// # Examples + /// + /// ``` + /// use grid::*; + /// let mut grid: Grid = grid![[1, 2, 3][3, 4, 5]]; + /// let row = vec![6,7,8]; + /// grid.push_row(row); + /// assert_eq!(grid.rows(), 3); + /// assert_eq!(grid[2][0], 6); + /// assert_eq!(grid[2][1], 7); + /// assert_eq!(grid[2][2], 8); + /// ``` + /// + /// Can also be used to init an empty grid: + /// + /// ``` + /// use grid::*; + /// let mut grid: Grid = grid![]; + /// let row = vec![1,2,3]; + /// grid.push_row(row); + /// assert_eq!(grid.size(), (1, 3)); + /// ``` + /// + /// # Panics + /// + /// Panics if the grid is not empty and `row.len() != grid.cols()`. + pub fn push_row(&mut self, row: Vec) { + let input_row_len = row.len(); + if self.rows > 0 && input_row_len != self.cols { + panic!( + "pushed row does not match. Length must be {:?}, but was {:?}.", + self.cols, input_row_len + ) + } + self.data.extend(row); + self.rows += 1; + self.cols = input_row_len; + } + + /// Add a new column to the grid. + /// + /// # Examples + /// + /// ``` + /// use grid::*; + /// let mut grid: Grid = grid![[1, 2, 3][3, 4, 5]]; + /// let col = vec![4,6]; + /// grid.push_col(col); + /// assert_eq!(grid.cols(), 4); + /// assert_eq!(grid[0][3], 4); + /// assert_eq!(grid[1][3], 6); + /// ``` + /// + /// Can also be used to init an empty grid: + /// + /// ``` + /// use grid::*; + /// let mut grid: Grid = grid![]; + /// let col = vec![1,2,3]; + /// grid.push_col(col); + /// assert_eq!(grid.size(), (3, 1)); + /// ``` + /// + /// # Panics + /// + /// Panics if the grid is not empty and `col.len() != grid.rows()`. + pub fn push_col(&mut self, col: Vec) { + let input_col_len = col.len(); + if self.cols > 0 && input_col_len != self.rows { + panic!( + "pushed column does not match. Length must be {:?}, but was {:?}.", + self.rows, input_col_len + ) + } + for (idx, d) in col.iter().enumerate() { + self.data + .insert((idx * self.cols) + self.cols + idx, d.to_owned()); + } + self.cols += 1; + self.rows = input_col_len; + } } impl Clone for Grid { @@ -397,6 +481,46 @@ impl fmt::Debug for Grid { mod test { use super::*; + #[test] + fn push_col_single() { + let mut grid: Grid = grid![['a', 'b', 'c']]; + grid.push_col(vec!['d']); + assert_eq!(grid.size(), (1, 4)); + assert_eq!(grid[0][3], 'd'); + } + + #[test] + fn push_col_empty() { + let mut grid: Grid = grid![]; + grid.push_col(vec!['b', 'b', 'b', 'b']); + assert_eq!(grid.size(), (4, 1)); + assert_eq!(grid[0][0], 'b'); + } + + #[test] + #[should_panic] + fn push_col_wrong_size() { + let mut grid: Grid = grid![['a','a','a']['a','a','a']]; + grid.push_col(vec!['b']); + grid.push_col(vec!['b', 'b']); + } + + #[test] + fn push_row_empty() { + let mut grid: Grid = grid![]; + grid.push_row(vec!['b', 'b', 'b', 'b']); + assert_eq!(grid.size(), (1, 4)); + assert_eq!(grid[0][0], 'b'); + } + + #[test] + #[should_panic] + fn push_row_wrong_size() { + let mut grid: Grid = grid![['a','a','a']['a','a','a']]; + grid.push_row(vec!['b']); + grid.push_row(vec!['b', 'b', 'b', 'b']); + } + #[test] fn iter_row() { let grid: Grid = grid![[1,2,3][1,2,3]];