@@ -21,7 +21,6 @@ use std::hash::{Writer, Hash};
2121use 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+
669752impl < 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> {
695778mod 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