diff options
author | Jesse Luehrs <doy@tozt.net> | 2022-12-17 02:59:05 -0500 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2022-12-17 02:59:05 -0500 |
commit | 87d04eb2c3e09e4f01a12eb08461b22bbbcf28d6 (patch) | |
tree | 653ba3f2298676591e8ebb9c696c093ffea92656 /src/grid.rs | |
parent | add7534a2230149800a836a6a848f2143a5a5e2f (diff) | |
download | advent-of-code-87d04eb2c3e09e4f01a12eb08461b22bbbcf28d6.tar.gz advent-of-code-87d04eb2c3e09e4f01a12eb08461b22bbbcf28d6.zip |
day 17
Diffstat (limited to 'src/grid.rs')
-rw-r--r-- | src/grid.rs | 69 |
1 files changed, 48 insertions, 21 deletions
diff --git a/src/grid.rs b/src/grid.rs index 96ac933..347c902 100644 --- a/src/grid.rs +++ b/src/grid.rs @@ -154,12 +154,12 @@ impl std::ops::Sub<ICol> for isize { } } -#[derive(Default, Clone, Debug, Eq, PartialEq)] -pub struct GridRow<T: Default + Clone + Eq + PartialEq> { +#[derive(Default, Clone, Debug, Eq, PartialEq, Hash)] +pub struct GridRow<T: Default + Clone + Eq + PartialEq + std::hash::Hash> { cells: Vec<T>, } -impl<T: Default + Clone + Eq + PartialEq> GridRow<T> { +impl<T: Default + Clone + Eq + PartialEq + std::hash::Hash> GridRow<T> { pub fn iter(&self) -> impl Iterator<Item = &T> + Clone { self.cells.iter() } @@ -169,8 +169,8 @@ impl<T: Default + Clone + Eq + PartialEq> GridRow<T> { } } -impl<T: Default + Clone + Eq + PartialEq> std::ops::Index<Col> - for GridRow<T> +impl<T: Default + Clone + Eq + PartialEq + std::hash::Hash> + std::ops::Index<Col> for GridRow<T> { type Output = T; fn index(&self, col: Col) -> &Self::Output { @@ -178,20 +178,20 @@ impl<T: Default + Clone + Eq + PartialEq> std::ops::Index<Col> } } -impl<T: Default + Clone + Eq + PartialEq> std::ops::IndexMut<Col> - for GridRow<T> +impl<T: Default + Clone + Eq + PartialEq + std::hash::Hash> + std::ops::IndexMut<Col> for GridRow<T> { fn index_mut(&mut self, col: Col) -> &mut Self::Output { &mut self.cells[col.0] } } -#[derive(Default, Clone, Debug, Eq, PartialEq)] -pub struct Grid<T: Default + Clone + Eq + PartialEq> { +#[derive(Default, Clone, Debug, Eq, PartialEq, Hash)] +pub struct Grid<T: Default + Clone + Eq + PartialEq + std::hash::Hash> { rows: Vec<GridRow<T>>, } -impl<T: Default + Clone + Eq + PartialEq> Grid<T> { +impl<T: Default + Clone + Eq + PartialEq + std::hash::Hash> Grid<T> { pub fn grow(&mut self, rows: Row, cols: Col) { self.rows .resize_with(rows.0.max(self.rows.len()), GridRow::default); @@ -201,6 +201,10 @@ impl<T: Default + Clone + Eq + PartialEq> Grid<T> { } } + pub fn unshift_rows(&mut self, count: usize) { + self.rows = self.rows.split_off(count); + } + pub fn rows(&self) -> Row { Row(self.rows.len()) } @@ -267,7 +271,15 @@ impl<T: Default + Clone + Eq + PartialEq> Grid<T> { } } -impl<T: Default + Clone + Eq + PartialEq + std::fmt::Display> Grid<T> { +impl< + T: Default + + Clone + + Eq + + PartialEq + + std::hash::Hash + + std::fmt::Display, + > Grid<T> +{ pub fn display_packed<F: Fn(&T) -> char>( &self, f: F, @@ -276,8 +288,14 @@ impl<T: Default + Clone + Eq + PartialEq + std::fmt::Display> Grid<T> { } } -impl<T: Default + Clone + Eq + PartialEq + std::fmt::Display> - std::fmt::Display for Grid<T> +impl< + T: Default + + Clone + + Eq + + PartialEq + + std::hash::Hash + + std::fmt::Display, + > std::fmt::Display for Grid<T> { fn fmt( &self, @@ -293,22 +311,26 @@ impl<T: Default + Clone + Eq + PartialEq + std::fmt::Display> } } -impl<T: Default + Clone + Eq + PartialEq> std::ops::Index<Row> for Grid<T> { +impl<T: Default + Clone + Eq + PartialEq + std::hash::Hash> + std::ops::Index<Row> for Grid<T> +{ type Output = GridRow<T>; fn index(&self, row: Row) -> &Self::Output { &self.rows[row.0] } } -impl<T: Default + Clone + Eq + PartialEq> std::ops::IndexMut<Row> - for Grid<T> +impl<T: Default + Clone + Eq + PartialEq + std::hash::Hash> + std::ops::IndexMut<Row> for Grid<T> { fn index_mut(&mut self, row: Row) -> &mut Self::Output { &mut self.rows[row.0] } } -impl<T: Default + Clone + Eq + PartialEq> FromIterator<Vec<T>> for Grid<T> { +impl<T: Default + Clone + Eq + PartialEq + std::hash::Hash> + FromIterator<Vec<T>> for Grid<T> +{ fn from_iter<I>(iter: I) -> Self where I: IntoIterator<Item = Vec<T>>, @@ -319,8 +341,8 @@ impl<T: Default + Clone + Eq + PartialEq> FromIterator<Vec<T>> for Grid<T> { } } -impl<T: Default + Clone + Eq + PartialEq> FromIterator<((Row, Col), T)> - for Grid<T> +impl<T: Default + Clone + Eq + PartialEq + std::hash::Hash> + FromIterator<((Row, Col), T)> for Grid<T> { fn from_iter<I>(iter: I) -> Self where @@ -337,13 +359,18 @@ impl<T: Default + Clone + Eq + PartialEq> FromIterator<((Row, Col), T)> pub struct DisplayPacked< 'a, - T: Default + Clone + Eq + PartialEq + std::fmt::Display, + T: Default + Clone + Eq + PartialEq + std::hash::Hash + std::fmt::Display, F: Fn(&'a T) -> char, >(&'a Grid<T>, F); impl< 'a, - T: Default + Clone + Eq + PartialEq + std::fmt::Display, + T: Default + + Clone + + Eq + + PartialEq + + std::hash::Hash + + std::fmt::Display, F: Fn(&'a T) -> char, > std::fmt::Display for DisplayPacked<'a, T, F> { |