about summary refs log tree commit diff
diff options
context:
space:
mode:
authornham <hamann.nick@gmail.com>2014-07-22 17:04:16 -0400
committernham <hamann.nick@gmail.com>2014-07-22 17:04:16 -0400
commit366c66e171b94ef78ce7b8daf2530dbdc30eadb9 (patch)
tree904105d996aa3344ee8e81fb237d7dc79873957f
parent9e83d29f30046292f43e982893517f9aee47fa48 (diff)
downloadrust-366c66e171b94ef78ce7b8daf2530dbdc30eadb9.tar.gz
rust-366c66e171b94ef78ce7b8daf2530dbdc30eadb9.zip
Implement PartialEq, Eq for TrieMap, TrieSet
-rw-r--r--src/libcollections/trie.rs64
1 files changed, 46 insertions, 18 deletions
diff --git a/src/libcollections/trie.rs b/src/libcollections/trie.rs
index 21fafdec019..424cda92c12 100644
--- a/src/libcollections/trie.rs
+++ b/src/libcollections/trie.rs
@@ -41,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]
@@ -302,7 +311,7 @@ impl<S: Writer, T: Hash<S>> Hash<S> for TrieMap<T> {
 }
 
 #[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));
-    }
 }