diff --git a/src/libcollections/btree/set.rs b/src/libcollections/btree/set.rs index 64ae4f6a50867..27c3fd1af3ecf 100644 --- a/src/libcollections/btree/set.rs +++ b/src/libcollections/btree/set.rs @@ -22,7 +22,6 @@ use core::iter::Peekable; use core::fmt::Show; // FIXME(conventions): implement bounded iterators -// FIXME(conventions): implement BitOr, BitAnd, BitXor, and Sub /// A set based on a B-Tree. /// @@ -340,6 +339,90 @@ impl Default for BTreeSet { } } +#[unstable = "matches collection reform specification, waiting for dust to settle"] +impl Sub,BTreeSet> for BTreeSet { + /// Returns the difference of `self` and `rhs` as a new `BTreeSet`. + /// + /// # Examples + /// + /// ``` + /// use std::collections::BTreeSet; + /// + /// let a: BTreeSet = vec![1,2,3].into_iter().collect(); + /// let b: BTreeSet = vec![3,4,5].into_iter().collect(); + /// + /// let result: BTreeSet = a - b; + /// let result_vec: Vec = result.into_iter().collect(); + /// assert_eq!(result_vec, vec![1,2]); + /// ``` + fn sub(&self, rhs: &BTreeSet) -> BTreeSet { + self.difference(rhs).cloned().collect() + } +} + +#[unstable = "matches collection reform specification, waiting for dust to settle"] +impl BitXor,BTreeSet> for BTreeSet { + /// Returns the symmetric difference of `self` and `rhs` as a new `BTreeSet`. + /// + /// # Examples + /// + /// ``` + /// use std::collections::BTreeSet; + /// + /// let a: BTreeSet = vec![1,2,3].into_iter().collect(); + /// let b: BTreeSet = vec![2,3,4].into_iter().collect(); + /// + /// let result: BTreeSet = a ^ b; + /// let result_vec: Vec = result.into_iter().collect(); + /// assert_eq!(result_vec, vec![1,4]); + /// ``` + fn bitxor(&self, rhs: &BTreeSet) -> BTreeSet { + self.symmetric_difference(rhs).cloned().collect() + } +} + +#[unstable = "matches collection reform specification, waiting for dust to settle"] +impl BitAnd,BTreeSet> for BTreeSet { + /// Returns the intersection of `self` and `rhs` as a new `BTreeSet`. + /// + /// # Examples + /// + /// ``` + /// use std::collections::BTreeSet; + /// + /// let a: BTreeSet = vec![1,2,3].into_iter().collect(); + /// let b: BTreeSet = vec![2,3,4].into_iter().collect(); + /// + /// let result: BTreeSet = a & b; + /// let result_vec: Vec = result.into_iter().collect(); + /// assert_eq!(result_vec, vec![2,3]); + /// ``` + fn bitand(&self, rhs: &BTreeSet) -> BTreeSet { + self.intersection(rhs).cloned().collect() + } +} + +#[unstable = "matches collection reform specification, waiting for dust to settle"] +impl BitOr,BTreeSet> for BTreeSet { + /// Returns the union of `self` and `rhs` as a new `BTreeSet`. + /// + /// # Examples + /// + /// ``` + /// use std::collections::BTreeSet; + /// + /// let a: BTreeSet = vec![1,2,3].into_iter().collect(); + /// let b: BTreeSet = vec![3,4,5].into_iter().collect(); + /// + /// let result: BTreeSet = a | b; + /// let result_vec: Vec = result.into_iter().collect(); + /// assert_eq!(result_vec, vec![1,2,3,4,5]); + /// ``` + fn bitor(&self, rhs: &BTreeSet) -> BTreeSet { + self.union(rhs).cloned().collect() + } +} + impl Show for BTreeSet { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { try!(write!(f, "{{"));