From 01b599eb34125b7bc4d01fd7cc24876179ad6798 Mon Sep 17 00:00:00 2001 From: Joseph Crail Date: Fri, 7 Nov 2014 17:51:38 -0500 Subject: [PATCH 1/2] Add BitXor to EnumSet. --- src/libcollections/enum_set.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libcollections/enum_set.rs b/src/libcollections/enum_set.rs index 1acdaef9c91c1..0737620690b6f 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, From 12db4de554faf8e2f6baca4514b1e5983cb60783 Mon Sep 17 00:00:00 2001 From: Joseph Crail Date: Fri, 7 Nov 2014 18:46:29 -0500 Subject: [PATCH 2/2] Add tests for BitAnd and BitXor. --- src/libcollections/enum_set.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/libcollections/enum_set.rs b/src/libcollections/enum_set.rs index 0737620690b6f..b2b26914b441a 100644 --- a/src/libcollections/enum_set.rs +++ b/src/libcollections/enum_set.rs @@ -403,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]