|
16 | 16 | use core::prelude::*;
|
17 | 17 | use core::fmt;
|
18 | 18 |
|
19 |
| -// FIXME(conventions): implement BitXor |
20 | 19 | // FIXME(contentions): implement union family of methods? (general design may be wrong here)
|
21 | 20 |
|
22 | 21 | #[deriving(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
@@ -201,6 +200,12 @@ impl<E:CLike> BitAnd<EnumSet<E>, EnumSet<E>> for EnumSet<E> {
|
201 | 200 | }
|
202 | 201 | }
|
203 | 202 |
|
| 203 | +impl<E:CLike> BitXor<EnumSet<E>, EnumSet<E>> for EnumSet<E> { |
| 204 | + fn bitxor(&self, e: &EnumSet<E>) -> EnumSet<E> { |
| 205 | + EnumSet {bits: self.bits ^ e.bits} |
| 206 | + } |
| 207 | +} |
| 208 | + |
204 | 209 | /// An iterator over an EnumSet
|
205 | 210 | pub struct Items<E> {
|
206 | 211 | index: uint,
|
@@ -433,9 +438,29 @@ mod test {
|
433 | 438 | let elems = e_intersection.iter().collect();
|
434 | 439 | assert_eq!(vec![C], elems)
|
435 | 440 |
|
| 441 | + // Another way to express intersection |
| 442 | + let e_intersection = e1 - (e1 - e2); |
| 443 | + let elems = e_intersection.iter().collect(); |
| 444 | + assert_eq!(vec![C], elems) |
| 445 | + |
436 | 446 | let e_subtract = e1 - e2;
|
437 | 447 | let elems = e_subtract.iter().collect();
|
438 | 448 | assert_eq!(vec![A], elems)
|
| 449 | + |
| 450 | + // Bitwise XOR of two sets, aka symmetric difference |
| 451 | + let e_symmetric_diff = e1 ^ e2; |
| 452 | + let elems = e_symmetric_diff.iter().collect(); |
| 453 | + assert_eq!(vec![A,B], elems) |
| 454 | + |
| 455 | + // Another way to express symmetric difference |
| 456 | + let e_symmetric_diff = (e1 - e2) | (e2 - e1); |
| 457 | + let elems = e_symmetric_diff.iter().collect(); |
| 458 | + assert_eq!(vec![A,B], elems) |
| 459 | + |
| 460 | + // Yet another way to express symmetric difference |
| 461 | + let e_symmetric_diff = (e1 | e2) - (e1 & e2); |
| 462 | + let elems = e_symmetric_diff.iter().collect(); |
| 463 | + assert_eq!(vec![A,B], elems) |
439 | 464 | }
|
440 | 465 |
|
441 | 466 | #[test]
|
|
0 commit comments