diff --git a/src/libcollections/trie.rs b/src/libcollections/trie.rs index 21fafdec0198..424cda92c12d 100644 --- a/src/libcollections/trie.rs +++ b/src/libcollections/trie.rs @@ -41,6 +41,15 @@ pub struct TrieMap { length: uint } +impl PartialEq for TrieMap { + fn eq(&self, other: &TrieMap) -> bool { + self.len() == other.len() && + self.iter().zip(other.iter()).all(|(a, b)| a == b) + } +} + +impl Eq for TrieMap {} + impl Collection for TrieMap { /// Return the number of elements in the map #[inline] @@ -302,7 +311,7 @@ impl> Hash for TrieMap { } #[allow(missing_doc)] -#[deriving(Hash)] +#[deriving(Hash, PartialEq, Eq)] pub struct TrieSet { map: TrieMap<()> } @@ -671,6 +680,7 @@ mod test_map { use std::prelude::*; use std::iter::range_step; use std::uint; + use std::hash; use {MutableMap, Map}; use super::{TrieMap, TrieNode, Internal, External, Nothing}; @@ -943,6 +953,41 @@ mod test_map { assert!(m_lower.iter().all(|(_, &x)| x == 0)); assert!(m_upper.iter().all(|(_, &x)| x == 0)); } + + #[test] + fn test_eq() { + let mut a = TrieMap::new(); + let mut b = TrieMap::new(); + + assert!(a == b); + assert!(a.insert(0, 5i)); + assert!(a != b); + assert!(b.insert(0, 4i)); + assert!(a != b); + assert!(a.insert(5, 19)); + assert!(a != b); + assert!(!b.insert(0, 5)); + assert!(a != b); + assert!(b.insert(5, 19)); + assert!(a == b); + } + + #[test] + fn test_hash() { + let mut x = TrieMap::new(); + let mut y = TrieMap::new(); + + assert!(hash::hash(&x) == hash::hash(&y)); + x.insert(1, 'a'); + x.insert(2, 'b'); + x.insert(3, 'c'); + + y.insert(3, 'c'); + y.insert(2, 'b'); + y.insert(1, 'a'); + + assert!(hash::hash(&x) == hash::hash(&y)); + } } #[cfg(test)] @@ -1059,7 +1104,6 @@ mod bench_map { mod test_set { use std::prelude::*; use std::uint; - use std::hash; use {MutableSet, Set}; use super::TrieSet; @@ -1093,20 +1137,4 @@ mod test_set { assert!(set.contains(x)); } } - - #[test] - fn test_hash() { - let mut x = TrieSet::new(); - let mut y = TrieSet::new(); - - x.insert(1); - x.insert(2); - x.insert(3); - - y.insert(3); - y.insert(2); - y.insert(1); - - assert!(hash::hash(&x) == hash::hash(&y)); - } }