summaryrefslogtreecommitdiffstats
path: root/src/grid.rs
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2022-12-17 02:59:05 -0500
committerJesse Luehrs <doy@tozt.net>2022-12-17 02:59:05 -0500
commit87d04eb2c3e09e4f01a12eb08461b22bbbcf28d6 (patch)
tree653ba3f2298676591e8ebb9c696c093ffea92656 /src/grid.rs
parentadd7534a2230149800a836a6a848f2143a5a5e2f (diff)
downloadadvent-of-code-87d04eb2c3e09e4f01a12eb08461b22bbbcf28d6.tar.gz
advent-of-code-87d04eb2c3e09e4f01a12eb08461b22bbbcf28d6.zip
day 17
Diffstat (limited to 'src/grid.rs')
-rw-r--r--src/grid.rs69
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>
{