summary refs log tree commit diff
path: root/src/libcore/hashmap.rs
diff options
context:
space:
mode:
authorDaniel Micay <danielmicay@gmail.com>2013-01-29 21:58:47 -0500
committerDaniel Micay <danielmicay@gmail.com>2013-01-29 22:24:00 -0500
commit6b08683e15f2765b03e9c7c3b6cff83b0cfd7b24 (patch)
treeb98bfb9e99621eee2422fb688f44152d8103833b /src/libcore/hashmap.rs
parent99eb4ddddd68e9ffa86eb8df264934925e27d737 (diff)
downloadrust-6b08683e15f2765b03e9c7c3b6cff83b0cfd7b24.tar.gz
rust-6b08683e15f2765b03e9c7c3b6cff83b0cfd7b24.zip
add intersection and union to the Set trait
Diffstat (limited to 'src/libcore/hashmap.rs')
-rw-r--r--src/libcore/hashmap.rs84
1 files changed, 83 insertions, 1 deletions
diff --git a/src/libcore/hashmap.rs b/src/libcore/hashmap.rs
index 5711c88e890..bef1069eef1 100644
--- a/src/libcore/hashmap.rs
+++ b/src/libcore/hashmap.rs
@@ -474,7 +474,7 @@ pub mod linear {
         pure fn difference(&self, other: &LinearSet<T>, f: fn(&T) -> bool) {
             for self.each |v| {
                 if !other.contains(v) {
-                    if !f(v) { return; }
+                    if !f(v) { return }
                 }
             }
         }
@@ -485,6 +485,28 @@ pub mod linear {
             self.difference(other, f);
             other.difference(self, f);
         }
+
+        /// Visit the values representing the intersection
+        pure fn intersection(&self, other: &LinearSet<T>, f: fn(&T) -> bool) {
+            for self.each |v| {
+                if other.contains(v) {
+                    if !f(v) { return }
+                }
+            }
+        }
+
+        /// Visit the values representing the union
+        pure fn union(&self, other: &LinearSet<T>, f: fn(&T) -> bool) {
+            for self.each |v| {
+                if !f(v) { return }
+            }
+
+            for other.each |v| {
+                if !self.contains(v) {
+                    if !f(v) { return }
+                }
+            }
+        }
     }
 
     pub impl <T: Hash IterBytes Eq> LinearSet<T> {
@@ -699,6 +721,36 @@ mod test_set {
     }
 
     #[test]
+    fn test_intersection() {
+        let mut a = linear::LinearSet::new();
+        let mut b = linear::LinearSet::new();
+
+        assert a.insert(11);
+        assert a.insert(1);
+        assert a.insert(3);
+        assert a.insert(77);
+        assert a.insert(103);
+        assert a.insert(5);
+        assert a.insert(-5);
+
+        assert b.insert(2);
+        assert b.insert(11);
+        assert b.insert(77);
+        assert b.insert(-9);
+        assert b.insert(-42);
+        assert b.insert(5);
+        assert b.insert(3);
+
+        let mut i = 0;
+        let expected = [3, 5, 11, 77];
+        for a.intersection(&b) |x| {
+            assert vec::contains(expected, x);
+            i += 1
+        }
+        assert i == expected.len();
+    }
+
+    #[test]
     fn test_difference() {
         let mut a = linear::LinearSet::new();
         let mut b = linear::LinearSet::new();
@@ -746,4 +798,34 @@ mod test_set {
         }
         assert i == expected.len();
     }
+
+    #[test]
+    fn test_union() {
+        let mut a = linear::LinearSet::new();
+        let mut b = linear::LinearSet::new();
+
+        assert a.insert(1);
+        assert a.insert(3);
+        assert a.insert(5);
+        assert a.insert(9);
+        assert a.insert(11);
+        assert a.insert(16);
+        assert a.insert(19);
+        assert a.insert(24);
+
+        assert b.insert(-2);
+        assert b.insert(1);
+        assert b.insert(5);
+        assert b.insert(9);
+        assert b.insert(13);
+        assert b.insert(19);
+
+        let mut i = 0;
+        let expected = [-2, 1, 3, 5, 9, 11, 13, 16, 19, 24];
+        for a.union(&b) |x| {
+            assert vec::contains(expected, x);
+            i += 1
+        }
+        assert i == expected.len();
+    }
 }