diff options
| author | Daniel Micay <danielmicay@gmail.com> | 2013-01-29 21:58:47 -0500 |
|---|---|---|
| committer | Daniel Micay <danielmicay@gmail.com> | 2013-01-29 22:24:00 -0500 |
| commit | 6b08683e15f2765b03e9c7c3b6cff83b0cfd7b24 (patch) | |
| tree | b98bfb9e99621eee2422fb688f44152d8103833b /src/libcore/hashmap.rs | |
| parent | 99eb4ddddd68e9ffa86eb8df264934925e27d737 (diff) | |
| download | rust-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.rs | 84 |
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(); + } } |
