Skip to content

Commit cd008c4

Browse files
committed
Add an implementation of the BitOps for BTreeSets.
Add initial attempt at implementing BitOr for BTreeSet. Update the implementation of the bitor operator for BTreeSets. `make check` ran fine through this. Add implementations for BitAnd, BitXor, and Sub as well. Remove the FIXME comment and add unstable flags. Add doctests for the bitop functions.
1 parent 207a508 commit cd008c4

File tree

1 file changed

+84
-1
lines changed
  • src/libcollections/btree

1 file changed

+84
-1
lines changed

src/libcollections/btree/set.rs

+84-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ use core::iter::Peekable;
2222
use core::fmt::Show;
2323

2424
// FIXME(conventions): implement bounded iterators
25-
// FIXME(conventions): implement BitOr, BitAnd, BitXor, and Sub
2625

2726
/// A set based on a B-Tree.
2827
///
@@ -340,6 +339,90 @@ impl<T: Ord> Default for BTreeSet<T> {
340339
}
341340
}
342341

342+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
343+
impl<T: Ord + Clone> Sub<BTreeSet<T>,BTreeSet<T>> for BTreeSet<T> {
344+
/// Returns the difference of `self` and `rhs` as a new `BTreeSet<T>`.
345+
///
346+
/// # Examples
347+
///
348+
/// ```
349+
/// use std::collections::BTreeSet;
350+
///
351+
/// let a: BTreeSet<int> = vec![1,2,3].into_iter().collect();
352+
/// let b: BTreeSet<int> = vec![3,4,5].into_iter().collect();
353+
///
354+
/// let result: BTreeSet<int> = a - b;
355+
/// let result_vec: Vec<int> = result.into_iter().collect();
356+
/// assert_eq!(result_vec, vec![1,2]);
357+
/// ```
358+
fn sub(&self, rhs: &BTreeSet<T>) -> BTreeSet<T> {
359+
self.difference(rhs).cloned().collect()
360+
}
361+
}
362+
363+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
364+
impl<T: Ord + Clone> BitXor<BTreeSet<T>,BTreeSet<T>> for BTreeSet<T> {
365+
/// Returns the symmetric difference of `self` and `rhs` as a new `BTreeSet<T>`.
366+
///
367+
/// # Examples
368+
///
369+
/// ```
370+
/// use std::collections::BTreeSet;
371+
///
372+
/// let a: BTreeSet<int> = vec![1,2,3].into_iter().collect();
373+
/// let b: BTreeSet<int> = vec![2,3,4].into_iter().collect();
374+
///
375+
/// let result: BTreeSet<int> = a ^ b;
376+
/// let result_vec: Vec<int> = result.into_iter().collect();
377+
/// assert_eq!(result_vec, vec![1,4]);
378+
/// ```
379+
fn bitxor(&self, rhs: &BTreeSet<T>) -> BTreeSet<T> {
380+
self.symmetric_difference(rhs).cloned().collect()
381+
}
382+
}
383+
384+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
385+
impl<T: Ord + Clone> BitAnd<BTreeSet<T>,BTreeSet<T>> for BTreeSet<T> {
386+
/// Returns the intersection of `self` and `rhs` as a new `BTreeSet<T>`.
387+
///
388+
/// # Examples
389+
///
390+
/// ```
391+
/// use std::collections::BTreeSet;
392+
///
393+
/// let a: BTreeSet<int> = vec![1,2,3].into_iter().collect();
394+
/// let b: BTreeSet<int> = vec![2,3,4].into_iter().collect();
395+
///
396+
/// let result: BTreeSet<int> = a & b;
397+
/// let result_vec: Vec<int> = result.into_iter().collect();
398+
/// assert_eq!(result_vec, vec![2,3]);
399+
/// ```
400+
fn bitand(&self, rhs: &BTreeSet<T>) -> BTreeSet<T> {
401+
self.intersection(rhs).cloned().collect()
402+
}
403+
}
404+
405+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
406+
impl<T: Ord + Clone> BitOr<BTreeSet<T>,BTreeSet<T>> for BTreeSet<T> {
407+
/// Returns the union of `self` and `rhs` as a new `BTreeSet<T>`.
408+
///
409+
/// # Examples
410+
///
411+
/// ```
412+
/// use std::collections::BTreeSet;
413+
///
414+
/// let a: BTreeSet<int> = vec![1,2,3].into_iter().collect();
415+
/// let b: BTreeSet<int> = vec![3,4,5].into_iter().collect();
416+
///
417+
/// let result: BTreeSet<int> = a | b;
418+
/// let result_vec: Vec<int> = result.into_iter().collect();
419+
/// assert_eq!(result_vec, vec![1,2,3,4,5]);
420+
/// ```
421+
fn bitor(&self, rhs: &BTreeSet<T>) -> BTreeSet<T> {
422+
self.union(rhs).cloned().collect()
423+
}
424+
}
425+
343426
impl<T: Show> Show for BTreeSet<T> {
344427
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
345428
try!(write!(f, "{{"));

0 commit comments

Comments
 (0)