diff --git a/src/libcollections/enum_set.rs b/src/libcollections/enum_set.rs index 1acdaef9c91c1..b2b26914b441a 100644 --- a/src/libcollections/enum_set.rs +++ b/src/libcollections/enum_set.rs @@ -16,7 +16,6 @@ use core::prelude::*; use core::fmt; -// FIXME(conventions): implement BitXor // FIXME(contentions): implement union family of methods? (general design may be wrong here) // FIXME(conventions): implement len @@ -196,6 +195,12 @@ impl BitAnd, EnumSet> for EnumSet { } } +impl BitXor, EnumSet> for EnumSet { + fn bitxor(&self, e: &EnumSet) -> EnumSet { + EnumSet {bits: self.bits ^ e.bits} + } +} + /// An iterator over an EnumSet pub struct Items { index: uint, @@ -398,9 +403,29 @@ mod test { let elems = e_intersection.iter().collect(); assert_eq!(vec![C], elems) + // Another way to express intersection + let e_intersection = e1 - (e1 - e2); + let elems = e_intersection.iter().collect(); + assert_eq!(vec![C], elems) + let e_subtract = e1 - e2; let elems = e_subtract.iter().collect(); assert_eq!(vec![A], elems) + + // Bitwise XOR of two sets, aka symmetric difference + let e_symmetric_diff = e1 ^ e2; + let elems = e_symmetric_diff.iter().collect(); + assert_eq!(vec![A,B], elems) + + // Another way to express symmetric difference + let e_symmetric_diff = (e1 - e2) | (e2 - e1); + let elems = e_symmetric_diff.iter().collect(); + assert_eq!(vec![A,B], elems) + + // Yet another way to express symmetric difference + let e_symmetric_diff = (e1 | e2) - (e1 & e2); + let elems = e_symmetric_diff.iter().collect(); + assert_eq!(vec![A,B], elems) } #[test]