@@ -21,7 +21,6 @@ use std::hash::{Writer, Hash};
21
21
use tree_map:: { TreeMap , Entries , RevEntries , MoveEntries } ;
22
22
23
23
// FIXME(conventions): implement bounded iterators
24
- // FIXME(conventions): implement BitOr, BitAnd, BitXor, and Sub
25
24
// FIXME(conventions): replace rev_iter(_mut) by making iter(_mut) DoubleEnded
26
25
27
26
/// 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> {
666
665
}
667
666
}
668
667
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
+
669
752
impl < T : Ord > FromIterator < T > for TreeSet < T > {
670
753
fn from_iter < Iter : Iterator < T > > ( iter : Iter ) -> TreeSet < T > {
671
754
let mut set = TreeSet :: new ( ) ;
@@ -695,6 +778,7 @@ impl<S: Writer, T: Ord + Hash<S>> Hash<S> for TreeSet<T> {
695
778
mod test {
696
779
use std:: prelude:: * ;
697
780
use std:: hash;
781
+ use vec:: Vec ;
698
782
699
783
use super :: TreeSet ;
700
784
@@ -932,6 +1016,46 @@ mod test {
932
1016
& [ -2 , 1 , 3 , 5 , 9 , 11 , 13 , 16 , 19 , 24 ] ) ;
933
1017
}
934
1018
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
+
935
1059
#[ test]
936
1060
fn test_zip ( ) {
937
1061
let mut x = TreeSet :: new ( ) ;
0 commit comments