@@ -22,7 +22,6 @@ use core::iter::Peekable;
2222use 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///
@@ -340,6 +339,90 @@ impl<T: Ord> Default for BTreeSet<T> {
340339 }
341340}
342341
342+ #[ unstable = "matches collection reform specification, waiting for dust to settle" ]
343+ impl < T : Ord + Clone > Sub < BTreeSet < T > , BTreeSet < T > > for BTreeSet < T > {
344+ /// Returns the difference of `self` and `rhs` as a new `BTreeSet<T>`.
345+ ///
346+ /// # Examples
347+ ///
348+ /// ```
349+ /// use std::collections::BTreeSet;
350+ ///
351+ /// let a: BTreeSet<int> = vec![1,2,3].into_iter().collect();
352+ /// let b: BTreeSet<int> = vec![3,4,5].into_iter().collect();
353+ ///
354+ /// let result: BTreeSet<int> = a - b;
355+ /// let result_vec: Vec<int> = result.into_iter().collect();
356+ /// assert_eq!(result_vec, vec![1,2]);
357+ /// ```
358+ fn sub ( & self , rhs : & BTreeSet < T > ) -> BTreeSet < T > {
359+ self . difference ( rhs) . cloned ( ) . collect ( )
360+ }
361+ }
362+
363+ #[ unstable = "matches collection reform specification, waiting for dust to settle" ]
364+ impl < T : Ord + Clone > BitXor < BTreeSet < T > , BTreeSet < T > > for BTreeSet < T > {
365+ /// Returns the symmetric difference of `self` and `rhs` as a new `BTreeSet<T>`.
366+ ///
367+ /// # Examples
368+ ///
369+ /// ```
370+ /// use std::collections::BTreeSet;
371+ ///
372+ /// let a: BTreeSet<int> = vec![1,2,3].into_iter().collect();
373+ /// let b: BTreeSet<int> = vec![2,3,4].into_iter().collect();
374+ ///
375+ /// let result: BTreeSet<int> = a ^ b;
376+ /// let result_vec: Vec<int> = result.into_iter().collect();
377+ /// assert_eq!(result_vec, vec![1,4]);
378+ /// ```
379+ fn bitxor ( & self , rhs : & BTreeSet < T > ) -> BTreeSet < T > {
380+ self . symmetric_difference ( rhs) . cloned ( ) . collect ( )
381+ }
382+ }
383+
384+ #[ unstable = "matches collection reform specification, waiting for dust to settle" ]
385+ impl < T : Ord + Clone > BitAnd < BTreeSet < T > , BTreeSet < T > > for BTreeSet < T > {
386+ /// Returns the intersection of `self` and `rhs` as a new `BTreeSet<T>`.
387+ ///
388+ /// # Examples
389+ ///
390+ /// ```
391+ /// use std::collections::BTreeSet;
392+ ///
393+ /// let a: BTreeSet<int> = vec![1,2,3].into_iter().collect();
394+ /// let b: BTreeSet<int> = vec![2,3,4].into_iter().collect();
395+ ///
396+ /// let result: BTreeSet<int> = a & b;
397+ /// let result_vec: Vec<int> = result.into_iter().collect();
398+ /// assert_eq!(result_vec, vec![2,3]);
399+ /// ```
400+ fn bitand ( & self , rhs : & BTreeSet < T > ) -> BTreeSet < T > {
401+ self . intersection ( rhs) . cloned ( ) . collect ( )
402+ }
403+ }
404+
405+ #[ unstable = "matches collection reform specification, waiting for dust to settle" ]
406+ impl < T : Ord + Clone > BitOr < BTreeSet < T > , BTreeSet < T > > for BTreeSet < T > {
407+ /// Returns the union of `self` and `rhs` as a new `BTreeSet<T>`.
408+ ///
409+ /// # Examples
410+ ///
411+ /// ```
412+ /// use std::collections::BTreeSet;
413+ ///
414+ /// let a: BTreeSet<int> = vec![1,2,3].into_iter().collect();
415+ /// let b: BTreeSet<int> = vec![3,4,5].into_iter().collect();
416+ ///
417+ /// let result: BTreeSet<int> = a | b;
418+ /// let result_vec: Vec<int> = result.into_iter().collect();
419+ /// assert_eq!(result_vec, vec![1,2,3,4,5]);
420+ /// ```
421+ fn bitor ( & self , rhs : & BTreeSet < T > ) -> BTreeSet < T > {
422+ self . union ( rhs) . cloned ( ) . collect ( )
423+ }
424+ }
425+
343426impl < T : Show > Show for BTreeSet < T > {
344427 fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
345428 try!( write ! ( f, "{{" ) ) ;
0 commit comments