@@ -22,7 +22,6 @@ use core::iter::Peekable;
22
22
use core:: fmt:: Show ;
23
23
24
24
// FIXME(conventions): implement bounded iterators
25
- // FIXME(conventions): implement BitOr, BitAnd, BitXor, and Sub
26
25
27
26
/// A set based on a B-Tree.
28
27
///
@@ -340,6 +339,90 @@ impl<T: Ord> Default for BTreeSet<T> {
340
339
}
341
340
}
342
341
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
+
343
426
impl < T : Show > Show for BTreeSet < T > {
344
427
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
345
428
try!( write ! ( f, "{{" ) ) ;
0 commit comments