diff options
| author | bors <bors@rust-lang.org> | 2014-07-23 18:11:15 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-07-23 18:11:15 +0000 |
| commit | c080d26d328d6e8bbf4b159b5c5f3cd55c86f621 (patch) | |
| tree | a43b7da534c8d34ecea12888e18f8678359794d6 | |
| parent | 826b8358134f909f0b8aeb4c1d67a3fdda50b4b0 (diff) | |
| parent | 366c66e171b94ef78ce7b8daf2530dbdc30eadb9 (diff) | |
| download | rust-c080d26d328d6e8bbf4b159b5c5f3cd55c86f621.tar.gz rust-c080d26d328d6e8bbf4b159b5c5f3cd55c86f621.zip | |
auto merge of #15902 : nham/rust/hash_triemap, r=alexcrichton
cc #15294
| -rw-r--r-- | src/libcollections/trie.rs | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/libcollections/trie.rs b/src/libcollections/trie.rs index 29ec85590b3..424cda92c12 100644 --- a/src/libcollections/trie.rs +++ b/src/libcollections/trie.rs @@ -17,6 +17,7 @@ use core::default::Default; use core::mem::zeroed; use core::mem; use core::uint; +use std::hash::{Writer, Hash}; use {Collection, Mutable, Map, MutableMap, Set, MutableSet}; use slice::{Items, MutItems}; @@ -40,6 +41,15 @@ pub struct TrieMap<T> { length: uint } +impl<T: PartialEq> PartialEq for TrieMap<T> { + fn eq(&self, other: &TrieMap<T>) -> bool { + self.len() == other.len() && + self.iter().zip(other.iter()).all(|(a, b)| a == b) + } +} + +impl<T: Eq> Eq for TrieMap<T> {} + impl<T> Collection for TrieMap<T> { /// Return the number of elements in the map #[inline] @@ -292,7 +302,16 @@ impl<T> Extendable<(uint, T)> for TrieMap<T> { } } +impl<S: Writer, T: Hash<S>> Hash<S> for TrieMap<T> { + fn hash(&self, state: &mut S) { + for elt in self.iter() { + elt.hash(state); + } + } +} + #[allow(missing_doc)] +#[deriving(Hash, PartialEq, Eq)] pub struct TrieSet { map: TrieMap<()> } @@ -661,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}; @@ -933,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)] |
