Skip to content

Commit 8bca470

Browse files
committed
auto merge of #19561 : csouth3/rust/treeset-bitops, r=Gankro
Implement the `BitOr`, `BitAnd`, `BitXor`, and `Sub` traits from `std::ops` for TreeSet. The behavior of these operator overloads is consistent with [RFC 235](https://github.com/rust-lang/rfcs/blob/master/text/0235-collections-conventions.md#combinations). r? @gankro
2 parents 77cd5cc + da50db0 commit 8bca470

File tree

1 file changed

+125
-1
lines changed

1 file changed

+125
-1
lines changed

src/libcollections/tree/set.rs

+125-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ use std::hash::{Writer, Hash};
2121
use tree_map::{TreeMap, Entries, RevEntries, MoveEntries};
2222

2323
// FIXME(conventions): implement bounded iterators
24-
// FIXME(conventions): implement BitOr, BitAnd, BitXor, and Sub
2524
// FIXME(conventions): replace rev_iter(_mut) by making iter(_mut) DoubleEnded
2625

2726
/// An implementation of the `Set` trait on top of the `TreeMap` container. The
@@ -666,6 +665,90 @@ impl<'a, T: Ord> Iterator<&'a T> for UnionItems<'a, T> {
666665
}
667666
}
668667

668+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
669+
impl<T: Ord + Clone> BitOr<TreeSet<T>, TreeSet<T>> for TreeSet<T> {
670+
/// Returns the union of `self` and `rhs` as a new `TreeSet<T>`.
671+
///
672+
/// # Example
673+
///
674+
/// ```
675+
/// use std::collections::TreeSet;
676+
///
677+
/// let a: TreeSet<int> = vec![1, 2, 3].into_iter().collect();
678+
/// let b: TreeSet<int> = vec![3, 4, 5].into_iter().collect();
679+
///
680+
/// let set: TreeSet<int> = a | b;
681+
/// let v: Vec<int> = set.into_iter().collect();
682+
/// assert_eq!(v, vec![1, 2, 3, 4, 5]);
683+
/// ```
684+
fn bitor(&self, rhs: &TreeSet<T>) -> TreeSet<T> {
685+
self.union(rhs).cloned().collect()
686+
}
687+
}
688+
689+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
690+
impl<T: Ord + Clone> BitAnd<TreeSet<T>, TreeSet<T>> for TreeSet<T> {
691+
/// Returns the intersection of `self` and `rhs` as a new `TreeSet<T>`.
692+
///
693+
/// # Example
694+
///
695+
/// ```
696+
/// use std::collections::TreeSet;
697+
///
698+
/// let a: TreeSet<int> = vec![1, 2, 3].into_iter().collect();
699+
/// let b: TreeSet<int> = vec![2, 3, 4].into_iter().collect();
700+
///
701+
/// let set: TreeSet<int> = a & b;
702+
/// let v: Vec<int> = set.into_iter().collect();
703+
/// assert_eq!(v, vec![2, 3]);
704+
/// ```
705+
fn bitand(&self, rhs: &TreeSet<T>) -> TreeSet<T> {
706+
self.intersection(rhs).cloned().collect()
707+
}
708+
}
709+
710+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
711+
impl<T: Ord + Clone> BitXor<TreeSet<T>, TreeSet<T>> for TreeSet<T> {
712+
/// Returns the symmetric difference of `self` and `rhs` as a new `TreeSet<T>`.
713+
///
714+
/// # Example
715+
///
716+
/// ```
717+
/// use std::collections::TreeSet;
718+
///
719+
/// let a: TreeSet<int> = vec![1, 2, 3].into_iter().collect();
720+
/// let b: TreeSet<int> = vec![3, 4, 5].into_iter().collect();
721+
///
722+
/// let set: TreeSet<int> = a ^ b;
723+
/// let v: Vec<int> = set.into_iter().collect();
724+
/// assert_eq!(v, vec![1, 2, 4, 5]);
725+
/// ```
726+
fn bitxor(&self, rhs: &TreeSet<T>) -> TreeSet<T> {
727+
self.symmetric_difference(rhs).cloned().collect()
728+
}
729+
}
730+
731+
#[unstable = "matches collection reform specification, waiting for dust to settle"]
732+
impl<T: Ord + Clone> Sub<TreeSet<T>, TreeSet<T>> for TreeSet<T> {
733+
/// Returns the difference of `self` and `rhs` as a new `TreeSet<T>`.
734+
///
735+
/// # Example
736+
///
737+
/// ```
738+
/// use std::collections::TreeSet;
739+
///
740+
/// let a: TreeSet<int> = vec![1, 2, 3].into_iter().collect();
741+
/// let b: TreeSet<int> = vec![3, 4, 5].into_iter().collect();
742+
///
743+
/// let set: TreeSet<int> = a - b;
744+
/// let v: Vec<int> = set.into_iter().collect();
745+
/// assert_eq!(v, vec![1, 2]);
746+
/// ```
747+
fn sub(&self, rhs: &TreeSet<T>) -> TreeSet<T> {
748+
self.difference(rhs).cloned().collect()
749+
}
750+
}
751+
669752
impl<T: Ord> FromIterator<T> for TreeSet<T> {
670753
fn from_iter<Iter: Iterator<T>>(iter: Iter) -> TreeSet<T> {
671754
let mut set = TreeSet::new();
@@ -695,6 +778,7 @@ impl<S: Writer, T: Ord + Hash<S>> Hash<S> for TreeSet<T> {
695778
mod test {
696779
use std::prelude::*;
697780
use std::hash;
781+
use vec::Vec;
698782

699783
use super::TreeSet;
700784

@@ -932,6 +1016,46 @@ mod test {
9321016
&[-2, 1, 3, 5, 9, 11, 13, 16, 19, 24]);
9331017
}
9341018

1019+
#[test]
1020+
fn test_bit_or() {
1021+
let a: TreeSet<int> = vec![1, 3, 5, 9, 11, 16, 19, 24].into_iter().collect();
1022+
let b: TreeSet<int> = vec![-2, 1, 5, 9, 13, 19].into_iter().collect();
1023+
1024+
let set: TreeSet<int> = a | b;
1025+
let v: Vec<int> = set.into_iter().collect();
1026+
assert_eq!(v, vec![-2, 1, 3, 5, 9, 11, 13, 16, 19, 24]);
1027+
}
1028+
1029+
#[test]
1030+
fn test_bit_and() {
1031+
let a: TreeSet<int> = vec![11, 1, 3, 77, 103, 5, -5].into_iter().collect();
1032+
let b: TreeSet<int> = vec![2, 11, 77, -9, -42, 5, 3].into_iter().collect();
1033+
1034+
let set: TreeSet<int> = a & b;
1035+
let v: Vec<int> = set.into_iter().collect();
1036+
assert_eq!(v, vec![3, 5, 11, 77]);
1037+
}
1038+
1039+
#[test]
1040+
fn test_bit_xor() {
1041+
let a: TreeSet<int> = vec![1, 3, 5, 9, 11].into_iter().collect();
1042+
let b: TreeSet<int> = vec![-2, 3, 9, 14, 22].into_iter().collect();
1043+
1044+
let set: TreeSet<int> = a ^ b;
1045+
let v: Vec<int> = set.into_iter().collect();
1046+
assert_eq!(v, vec![-2, 1, 5, 11, 14, 22]);
1047+
}
1048+
1049+
#[test]
1050+
fn test_sub() {
1051+
let a: TreeSet<int> = vec![-5, 11, 22, 33, 40, 42].into_iter().collect();
1052+
let b: TreeSet<int> = vec![-12, -5, 14, 23, 34, 38, 39, 50].into_iter().collect();
1053+
1054+
let set: TreeSet<int> = a - b;
1055+
let v: Vec<int> = set.into_iter().collect();
1056+
assert_eq!(v, vec![11, 22, 33, 40, 42]);
1057+
}
1058+
9351059
#[test]
9361060
fn test_zip() {
9371061
let mut x = TreeSet::new();

0 commit comments

Comments
 (0)