Skip to content

Commit d424af4

Browse files
committed
Implement BitOps for TrieSet
1 parent 207a508 commit d424af4

File tree

1 file changed

+65
-1
lines changed

1 file changed

+65
-1
lines changed

src/libcollections/trie/set.rs

+65-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
// except according to those terms.
1010

1111
// FIXME(conventions): implement bounded iterators
12-
// FIXME(conventions): implement BitOr, BitAnd, BitXor, and Sub
1312
// FIXME(conventions): replace each_reverse by making iter DoubleEnded
1413
// FIXME(conventions): implement iter_mut and into_iter
1514

@@ -463,6 +462,30 @@ impl Extend<uint> for TrieSet {
463462
}
464463
}
465464

465+
impl BitOr<TrieSet, TrieSet> for TrieSet {
466+
fn bitor(&self, rhs: &TrieSet) -> TrieSet {
467+
self.union(rhs).collect()
468+
}
469+
}
470+
471+
impl BitAnd<TrieSet, TrieSet> for TrieSet {
472+
fn bitand(&self, rhs: &TrieSet) -> TrieSet {
473+
self.intersection(rhs).collect()
474+
}
475+
}
476+
477+
impl BitXor<TrieSet, TrieSet> for TrieSet {
478+
fn bitxor(&self, rhs: &TrieSet) -> TrieSet {
479+
self.symmetric_difference(rhs).collect()
480+
}
481+
}
482+
483+
impl Sub<TrieSet, TrieSet> for TrieSet {
484+
fn sub(&self, rhs: &TrieSet) -> TrieSet {
485+
self.difference(rhs).collect()
486+
}
487+
}
488+
466489
/// A forward iterator over a set.
467490
pub struct SetItems<'a> {
468491
iter: Entries<'a, ()>
@@ -569,6 +592,7 @@ impl<'a> Iterator<uint> for UnionItems<'a> {
569592
mod test {
570593
use std::prelude::*;
571594
use std::uint;
595+
use vec::Vec;
572596

573597
use super::TrieSet;
574598

@@ -738,4 +762,44 @@ mod test {
738762
&[1, 5, 9, 13, 19],
739763
&[1, 3, 5, 9, 11, 13, 16, 19, 24]);
740764
}
765+
766+
#[test]
767+
fn test_bit_or() {
768+
let a: TrieSet = vec![1, 2, 3].into_iter().collect();
769+
let b: TrieSet = vec![3, 4, 5].into_iter().collect();
770+
771+
let set: TrieSet = a | b;
772+
let v: Vec<uint> = set.iter().collect();
773+
assert_eq!(v, vec![1u, 2, 3, 4, 5]);
774+
}
775+
776+
#[test]
777+
fn test_bit_and() {
778+
let a: TrieSet = vec![1, 2, 3].into_iter().collect();
779+
let b: TrieSet = vec![2, 3, 4].into_iter().collect();
780+
781+
let set: TrieSet = a & b;
782+
let v: Vec<uint> = set.iter().collect();
783+
assert_eq!(v, vec![2u, 3]);
784+
}
785+
786+
#[test]
787+
fn test_bit_xor() {
788+
let a: TrieSet = vec![1, 2, 3].into_iter().collect();
789+
let b: TrieSet = vec![3, 4, 5].into_iter().collect();
790+
791+
let set: TrieSet = a ^ b;
792+
let v: Vec<uint> = set.iter().collect();
793+
assert_eq!(v, vec![1u, 2, 4, 5]);
794+
}
795+
796+
#[test]
797+
fn test_sub() {
798+
let a: TrieSet = vec![1, 2, 3].into_iter().collect();
799+
let b: TrieSet = vec![3, 4, 5].into_iter().collect();
800+
801+
let set: TrieSet = a - b;
802+
let v: Vec<uint> = set.iter().collect();
803+
assert_eq!(v, vec![1u, 2]);
804+
}
741805
}

0 commit comments

Comments
 (0)