Skip to content

Commit 309ab34

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

File tree

1 file changed

+125
-1
lines changed

1 file changed

+125
-1
lines changed

src/libcollections/trie/set.rs

+125-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,90 @@ impl Extend<uint> for TrieSet {
463462
}
464463
}
465464

465+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
466+
impl BitOr<TrieSet, TrieSet> for TrieSet {
467+
/// Returns the union of `self` and `rhs` as a new `TrieSet`.
468+
///
469+
/// # Example
470+
///
471+
/// ```
472+
/// use std::collections::TrieSet;
473+
///
474+
/// let a: TrieSet = vec![1, 2, 3].into_iter().collect();
475+
/// let b: TrieSet = vec![3, 4, 5].into_iter().collect();
476+
///
477+
/// let set: TrieSet = a | b;
478+
/// let v: Vec<uint> = set.iter().collect();
479+
/// assert_eq!(v, vec![1u, 2, 3, 4, 5]);
480+
/// ```
481+
fn bitor(&self, rhs: &TrieSet) -> TrieSet {
482+
self.union(rhs).collect()
483+
}
484+
}
485+
486+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
487+
impl BitAnd<TrieSet, TrieSet> for TrieSet {
488+
/// Returns the intersection of `self` and `rhs` as a new `TrieSet`.
489+
///
490+
/// # Example
491+
///
492+
/// ```
493+
/// use std::collections::TrieSet;
494+
///
495+
/// let a: TrieSet = vec![1, 2, 3].into_iter().collect();
496+
/// let b: TrieSet = vec![2, 3, 4].into_iter().collect();
497+
///
498+
/// let set: TrieSet = a & b;
499+
/// let v: Vec<uint> = set.iter().collect();
500+
/// assert_eq!(v, vec![2u, 3]);
501+
/// ```
502+
fn bitand(&self, rhs: &TrieSet) -> TrieSet {
503+
self.intersection(rhs).collect()
504+
}
505+
}
506+
507+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
508+
impl BitXor<TrieSet, TrieSet> for TrieSet {
509+
/// Returns the symmetric difference of `self` and `rhs` as a new `TrieSet`.
510+
///
511+
/// # Example
512+
///
513+
/// ```
514+
/// use std::collections::TrieSet;
515+
///
516+
/// let a: TrieSet = vec![1, 2, 3].into_iter().collect();
517+
/// let b: TrieSet = vec![3, 4, 5].into_iter().collect();
518+
///
519+
/// let set: TrieSet = a ^ b;
520+
/// let v: Vec<uint> = set.iter().collect();
521+
/// assert_eq!(v, vec![1u, 2, 4, 5]);
522+
/// ```
523+
fn bitxor(&self, rhs: &TrieSet) -> TrieSet {
524+
self.symmetric_difference(rhs).collect()
525+
}
526+
}
527+
528+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
529+
impl Sub<TrieSet, TrieSet> for TrieSet {
530+
/// Returns the difference of `self` and `rhs` as a new `TrieSet`.
531+
///
532+
/// # Example
533+
///
534+
/// ```
535+
/// use std::collections::TrieSet;
536+
///
537+
/// let a: TrieSet = vec![1, 2, 3].into_iter().collect();
538+
/// let b: TrieSet = vec![3, 4, 5].into_iter().collect();
539+
///
540+
/// let set: TrieSet = a - b;
541+
/// let v: Vec<uint> = set.iter().collect();
542+
/// assert_eq!(v, vec![1u, 2]);
543+
/// ```
544+
fn sub(&self, rhs: &TrieSet) -> TrieSet {
545+
self.difference(rhs).collect()
546+
}
547+
}
548+
466549
/// A forward iterator over a set.
467550
pub struct SetItems<'a> {
468551
iter: Entries<'a, ()>
@@ -569,6 +652,7 @@ impl<'a> Iterator<uint> for UnionItems<'a> {
569652
mod test {
570653
use std::prelude::*;
571654
use std::uint;
655+
use vec::Vec;
572656

573657
use super::TrieSet;
574658

@@ -738,4 +822,44 @@ mod test {
738822
&[1, 5, 9, 13, 19],
739823
&[1, 3, 5, 9, 11, 13, 16, 19, 24]);
740824
}
825+
826+
#[test]
827+
fn test_bit_or() {
828+
let a: TrieSet = vec![1, 2, 3].into_iter().collect();
829+
let b: TrieSet = vec![3, 4, 5].into_iter().collect();
830+
831+
let set: TrieSet = a | b;
832+
let v: Vec<uint> = set.iter().collect();
833+
assert_eq!(v, vec![1u, 2, 3, 4, 5]);
834+
}
835+
836+
#[test]
837+
fn test_bit_and() {
838+
let a: TrieSet = vec![1, 2, 3].into_iter().collect();
839+
let b: TrieSet = vec![2, 3, 4].into_iter().collect();
840+
841+
let set: TrieSet = a & b;
842+
let v: Vec<uint> = set.iter().collect();
843+
assert_eq!(v, vec![2u, 3]);
844+
}
845+
846+
#[test]
847+
fn test_bit_xor() {
848+
let a: TrieSet = vec![1, 2, 3].into_iter().collect();
849+
let b: TrieSet = vec![3, 4, 5].into_iter().collect();
850+
851+
let set: TrieSet = a ^ b;
852+
let v: Vec<uint> = set.iter().collect();
853+
assert_eq!(v, vec![1u, 2, 4, 5]);
854+
}
855+
856+
#[test]
857+
fn test_sub() {
858+
let a: TrieSet = vec![1, 2, 3].into_iter().collect();
859+
let b: TrieSet = vec![3, 4, 5].into_iter().collect();
860+
861+
let set: TrieSet = a - b;
862+
let v: Vec<uint> = set.iter().collect();
863+
assert_eq!(v, vec![1u, 2]);
864+
}
741865
}

0 commit comments

Comments
 (0)