diff --git a/src/lib.rs b/src/lib.rs index 81d6d38..f96c58f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -184,7 +184,7 @@ macro_rules! grid_cm { } /// Define the internal memory layout of the grid. -#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] pub enum Order { /// The data is ordered row by row. @@ -1425,6 +1425,16 @@ impl Clone for Grid { } } +impl std::hash::Hash for Grid { + #[inline] + fn hash(&self, state: &mut H) { + self.rows.hash(state); + self.cols.hash(state); + self.order.hash(state); + self.data.hash(state); + } +} + impl Index<(usize, usize)> for Grid { type Output = T; @@ -2511,6 +2521,15 @@ mod test { test_grid(&clone, 2, 3, Order::RowMajor, &[1, 2, 10, 4, 5, 6]); } + #[test] + fn hash() { + let mut set = std::collections::HashSet::new(); + set.insert(grid![[1,2,3][4,5,6]]); + set.insert(grid![[1,3,3][4,5,6]]); + set.insert(grid![[1,2,3][4,5,6]]); + assert_eq!(set.len(), 2); + } + #[test] fn macro_init() { let grid = grid![[1, 2, 3][4, 5, 6]];