Skip to content

Commit da83ad8

Browse files
committed
auto merge of #19514 : jbranchaud/rust/add-btree-set-bitor, r=Gankro
I am trying to add an implementation of `bitor` for `BTreeSet`. I think I am most of the way there, but I am going to need some guidance to take it all the way. When I run `make check`, I get: ``` error: cannot move out of dereference of `&`-pointer self.union(_rhs).map(|&i| i).collect::<BTreeSet<T>>() ^~ ``` I'd appreciate any nudges in the right direction. If I can figure this one out, I am sure I will be able to implement `bitand`, `bitxor`, and `sub` as well. /cc @gankro --- **Update** I have added implementations for `BitOr`, `BitAnd`, `BitXor`, and `Sub` for `BTreeSet`.
2 parents 193390d + cd008c4 commit da83ad8

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
///
@@ -406,6 +405,90 @@ impl<T: Ord> Default for BTreeSet<T> {
406405
}
407406
}
408407

408+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
409+
impl<T: Ord + Clone> Sub<BTreeSet<T>,BTreeSet<T>> for BTreeSet<T> {
410+
/// Returns the difference of `self` and `rhs` as a new `BTreeSet<T>`.
411+
///
412+
/// # Examples
413+
///
414+
/// ```
415+
/// use std::collections::BTreeSet;
416+
///
417+
/// let a: BTreeSet<int> = vec![1,2,3].into_iter().collect();
418+
/// let b: BTreeSet<int> = vec![3,4,5].into_iter().collect();
419+
///
420+
/// let result: BTreeSet<int> = a - b;
421+
/// let result_vec: Vec<int> = result.into_iter().collect();
422+
/// assert_eq!(result_vec, vec![1,2]);
423+
/// ```
424+
fn sub(&self, rhs: &BTreeSet<T>) -> BTreeSet<T> {
425+
self.difference(rhs).cloned().collect()
426+
}
427+
}
428+
429+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
430+
impl<T: Ord + Clone> BitXor<BTreeSet<T>,BTreeSet<T>> for BTreeSet<T> {
431+
/// Returns the symmetric difference of `self` and `rhs` as a new `BTreeSet<T>`.
432+
///
433+
/// # Examples
434+
///
435+
/// ```
436+
/// use std::collections::BTreeSet;
437+
///
438+
/// let a: BTreeSet<int> = vec![1,2,3].into_iter().collect();
439+
/// let b: BTreeSet<int> = vec![2,3,4].into_iter().collect();
440+
///
441+
/// let result: BTreeSet<int> = a ^ b;
442+
/// let result_vec: Vec<int> = result.into_iter().collect();
443+
/// assert_eq!(result_vec, vec![1,4]);
444+
/// ```
445+
fn bitxor(&self, rhs: &BTreeSet<T>) -> BTreeSet<T> {
446+
self.symmetric_difference(rhs).cloned().collect()
447+
}
448+
}
449+
450+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
451+
impl<T: Ord + Clone> BitAnd<BTreeSet<T>,BTreeSet<T>> for BTreeSet<T> {
452+
/// Returns the intersection of `self` and `rhs` as a new `BTreeSet<T>`.
453+
///
454+
/// # Examples
455+
///
456+
/// ```
457+
/// use std::collections::BTreeSet;
458+
///
459+
/// let a: BTreeSet<int> = vec![1,2,3].into_iter().collect();
460+
/// let b: BTreeSet<int> = vec![2,3,4].into_iter().collect();
461+
///
462+
/// let result: BTreeSet<int> = a & b;
463+
/// let result_vec: Vec<int> = result.into_iter().collect();
464+
/// assert_eq!(result_vec, vec![2,3]);
465+
/// ```
466+
fn bitand(&self, rhs: &BTreeSet<T>) -> BTreeSet<T> {
467+
self.intersection(rhs).cloned().collect()
468+
}
469+
}
470+
471+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
472+
impl<T: Ord + Clone> BitOr<BTreeSet<T>,BTreeSet<T>> for BTreeSet<T> {
473+
/// Returns the union of `self` and `rhs` as a new `BTreeSet<T>`.
474+
///
475+
/// # Examples
476+
///
477+
/// ```
478+
/// use std::collections::BTreeSet;
479+
///
480+
/// let a: BTreeSet<int> = vec![1,2,3].into_iter().collect();
481+
/// let b: BTreeSet<int> = vec![3,4,5].into_iter().collect();
482+
///
483+
/// let result: BTreeSet<int> = a | b;
484+
/// let result_vec: Vec<int> = result.into_iter().collect();
485+
/// assert_eq!(result_vec, vec![1,2,3,4,5]);
486+
/// ```
487+
fn bitor(&self, rhs: &BTreeSet<T>) -> BTreeSet<T> {
488+
self.union(rhs).cloned().collect()
489+
}
490+
}
491+
409492
impl<T: Show> Show for BTreeSet<T> {
410493
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
411494
try!(write!(f, "{{"));

0 commit comments

Comments
 (0)