Skip to content

Commit eeca3c7

Browse files
committed
auto merge of #18756 : jbcrail/rust/add-enum-set-bitxor, r=alexcrichton
I implemented BitXor, and also added tests for BitAnd and BitXor. cc #18424
2 parents 946225d + 12db4de commit eeca3c7

File tree

1 file changed

+26
-1
lines changed

1 file changed

+26
-1
lines changed

src/libcollections/enum_set.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
use core::prelude::*;
1717
use core::fmt;
1818

19-
// FIXME(conventions): implement BitXor
2019
// FIXME(contentions): implement union family of methods? (general design may be wrong here)
2120

2221
#[deriving(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
@@ -201,6 +200,12 @@ impl<E:CLike> BitAnd<EnumSet<E>, EnumSet<E>> for EnumSet<E> {
201200
}
202201
}
203202

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+
204209
/// An iterator over an EnumSet
205210
pub struct Items<E> {
206211
index: uint,
@@ -433,9 +438,29 @@ mod test {
433438
let elems = e_intersection.iter().collect();
434439
assert_eq!(vec![C], elems)
435440

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+
436446
let e_subtract = e1 - e2;
437447
let elems = e_subtract.iter().collect();
438448
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)
439464
}
440465

441466
#[test]

0 commit comments

Comments
 (0)