From 28f49820d822f51a3c26c040c57d65353352e479 Mon Sep 17 00:00:00 2001 From: djkato Date: Mon, 17 Apr 2023 21:58:12 +0200 Subject: [PATCH 1/4] Added remove_row() and remove_col() --- src/lib.rs | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 7efc9f2..b572703 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -559,6 +559,33 @@ impl Grid { Some(row) } + /// Remove a Row at the index and return a vector of it. + /// + /// # Examples + /// ``` + /// use grid::*; + /// let mut grid = grid![[1,2][3,4][5,6]]; + /// assert_eq![grid.remove_row(1), Some(vec![3,4])]; + /// println!("grid: {:?}", grid); + /// assert_eq![grid.remove_row(0), Some(vec![1,2])]; + /// println!("grid: {:?}", grid); + /// assert_eq![grid.remove_row(0), Some(vec![5,6])]; + /// println!("grid: {:?}", grid); + /// assert_eq![grid.remove_row(0), None]; + /// println!("grid: {:?}", grid); + /// ``` + pub fn remove_row(&mut self, row_index: usize) -> Option> { + if self.cols == 0 || self.rows == 0 || row_index > self.rows { + return None; + } + let residue = self + .data + .drain((row_index * self.cols)..((row_index + 1) * self.cols)); + + self.rows -= 1; + Some(residue.collect()) + } + /// Removes the last column from a grid and returns it, or None if it is empty. /// /// Note that this operation is much slower than the `pop_row()` because the memory layout @@ -589,6 +616,45 @@ impl Grid { Some(col) } + /// Remove a column at the index and return a vector of it. + /// + /// # Examples + /// ``` + /// use grid::*; + /// let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]]; + /// assert_eq![grid.remove_col(3), Some(vec![4,8,12,16])]; + /// assert_eq![grid.remove_col(0), Some(vec![1,5,9,13])]; + /// assert_eq![grid.remove_col(1), Some(vec![3,7,11,15])]; + /// assert_eq![grid.remove_col(0), Some(vec![2,6,10,14])]; + /// assert_eq![grid.remove_col(0), None]; + /// ``` + pub fn remove_col(&mut self, col_index: usize) -> Option> { + if self.cols == 0 || self.rows == 0 || col_index > self.cols { + return None; + } + println!( + "self.rows: {};row_index: {}, self.cols: {}", + self.rows, col_index, self.cols + ); + let mut residue: Vec = vec![]; + for i in 0..self.rows { + println!( + "{} * {} + {} - {} == {}", + i, + self.cols, + col_index, + i, + i * self.cols + col_index - i + ); + residue.push(self.data.remove(i * self.cols + col_index - i)); + } + /* + 0 * 16 + 0 - 1 - 0 + */ + self.cols -= 1; + Some(residue) + } + /// Insert a new row at the index and shifts all rows after down. /// /// # Examples @@ -1613,4 +1679,21 @@ r#"[ let sum_by_col: Vec = grid.iter_cols().map(|col| col.sum()).collect(); assert_eq!(sum_by_col, vec![1+4, 2+5, 3+6]) } + #[test] + fn remove_col_empty() { + let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]]; + assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])]; + assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])]; + assert_eq![grid.remove_col(1), Some(vec![3, 7, 11, 15])]; + assert_eq![grid.remove_col(0), Some(vec![2, 6, 10, 14])]; + assert_eq![grid.remove_col(0), None]; + } + #[test] + fn remove_row_empty() { + let mut grid = grid![[1,2][3,4][5,6]]; + assert_eq![grid.remove_row(1), Some(vec![3, 4])]; + assert_eq![grid.remove_row(0), Some(vec![1, 2])]; + assert_eq![grid.remove_row(0), Some(vec![5, 6])]; + assert_eq![grid.remove_row(0), None]; + } } From 9e84cb40cc43885bdce6a416c5a076ee1e0953f2 Mon Sep 17 00:00:00 2001 From: djkato Date: Mon, 17 Apr 2023 23:01:50 +0200 Subject: [PATCH 2/4] Added remove_row() and remove_col() --- src/lib.rs | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b572703..85464cc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -565,14 +565,10 @@ impl Grid { /// ``` /// use grid::*; /// let mut grid = grid![[1,2][3,4][5,6]]; - /// assert_eq![grid.remove_row(1), Some(vec![3,4])]; - /// println!("grid: {:?}", grid); + /// assert_eq![grid.remove_row(1), Some(vec![3,4])]; /// assert_eq![grid.remove_row(0), Some(vec![1,2])]; - /// println!("grid: {:?}", grid); /// assert_eq![grid.remove_row(0), Some(vec![5,6])]; - /// println!("grid: {:?}", grid); /// assert_eq![grid.remove_row(0), None]; - /// println!("grid: {:?}", grid); /// ``` pub fn remove_row(&mut self, row_index: usize) -> Option> { if self.cols == 0 || self.rows == 0 || row_index > self.rows { @@ -632,26 +628,10 @@ impl Grid { if self.cols == 0 || self.rows == 0 || col_index > self.cols { return None; } - println!( - "self.rows: {};row_index: {}, self.cols: {}", - self.rows, col_index, self.cols - ); let mut residue: Vec = vec![]; for i in 0..self.rows { - println!( - "{} * {} + {} - {} == {}", - i, - self.cols, - col_index, - i, - i * self.cols + col_index - i - ); - residue.push(self.data.remove(i * self.cols + col_index - i)); + self.cols -= 1; } - /* - 0 * 16 + 0 - 1 - 0 - */ - self.cols -= 1; Some(residue) } From 6d04e3fe3937d8097a2eebaadd2859a52951fc3f Mon Sep 17 00:00:00 2001 From: djkato Date: Mon, 17 Apr 2023 23:03:30 +0200 Subject: [PATCH 3/4] Added remove_row() and remove_col() --- src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 85464cc..5048db0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -630,8 +630,9 @@ impl Grid { } let mut residue: Vec = vec![]; for i in 0..self.rows { - self.cols -= 1; + residue.push(self.data.remove(i * self.cols + col_index - i)); } + self.cols -= 1; Some(residue) } From 06439d80c7d2348b5afb0882a8e1bbd06932b163 Mon Sep 17 00:00:00 2001 From: djkato Date: Tue, 18 Apr 2023 21:32:55 +0200 Subject: [PATCH 4/4] Fixed >=, renamed and added tests --- src/lib.rs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 5048db0..d590c2b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -571,7 +571,7 @@ impl Grid { /// assert_eq![grid.remove_row(0), None]; /// ``` pub fn remove_row(&mut self, row_index: usize) -> Option> { - if self.cols == 0 || self.rows == 0 || row_index > self.rows { + if self.cols == 0 || self.rows == 0 || row_index >= self.rows { return None; } let residue = self @@ -625,7 +625,7 @@ impl Grid { /// assert_eq![grid.remove_col(0), None]; /// ``` pub fn remove_col(&mut self, col_index: usize) -> Option> { - if self.cols == 0 || self.rows == 0 || col_index > self.cols { + if self.cols == 0 || self.rows == 0 || col_index >= self.cols { return None; } let mut residue: Vec = vec![]; @@ -1660,8 +1660,8 @@ r#"[ let sum_by_col: Vec = grid.iter_cols().map(|col| col.sum()).collect(); assert_eq!(sum_by_col, vec![1+4, 2+5, 3+6]) } - #[test] - fn remove_col_empty() { + #[test] + fn remove_col() { let mut grid = grid![[1,2,3,4][5,6,7,8][9,10,11,12][13,14,15,16]]; assert_eq![grid.remove_col(3), Some(vec![4, 8, 12, 16])]; assert_eq![grid.remove_col(0), Some(vec![1, 5, 9, 13])]; @@ -1670,11 +1670,23 @@ r#"[ assert_eq![grid.remove_col(0), None]; } #[test] - fn remove_row_empty() { + fn remove_row() { let mut grid = grid![[1,2][3,4][5,6]]; assert_eq![grid.remove_row(1), Some(vec![3, 4])]; assert_eq![grid.remove_row(0), Some(vec![1, 2])]; assert_eq![grid.remove_row(0), Some(vec![5, 6])]; assert_eq![grid.remove_row(0), None]; } + #[test] + fn remove_row_out_of_bound(){ + let mut grid = grid![[1, 2][3, 4]]; + assert_eq![grid.remove_row(5), None]; + assert_eq![grid.remove_row(1), Some(vec![3, 4])]; + } + #[test] + fn remove_col_out_of_bound(){ + let mut grid = grid![[1, 2][3, 4]]; + assert_eq!(grid.remove_col(5), None); + assert_eq!(grid.remove_col(1), Some(vec![2, 4])); + } }