diff options
| author | bors <bors@rust-lang.org> | 2014-11-09 15:11:43 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-11-09 15:11:43 +0000 |
| commit | eeca3c7b4cd99ef38900250be8c19e5572168004 (patch) | |
| tree | f1e12ba2e6b4f699891c01fd5dbfbdfb6c20a6ad /src/libcollections/enum_set.rs | |
| parent | 946225d77f65e307de3c216cbc2c686b880a6791 (diff) | |
| parent | 12db4de554faf8e2f6baca4514b1e5983cb60783 (diff) | |
| download | rust-eeca3c7b4cd99ef38900250be8c19e5572168004.tar.gz rust-eeca3c7b4cd99ef38900250be8c19e5572168004.zip | |
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
Diffstat (limited to 'src/libcollections/enum_set.rs')
| -rw-r--r-- | src/libcollections/enum_set.rs | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/libcollections/enum_set.rs b/src/libcollections/enum_set.rs index b13e45099ee..ee0c4644b36 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) #[deriving(Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] @@ -201,6 +200,12 @@ impl<E:CLike> BitAnd<EnumSet<E>, EnumSet<E>> for EnumSet<E> { } } +impl<E:CLike> BitXor<EnumSet<E>, EnumSet<E>> for EnumSet<E> { + fn bitxor(&self, e: &EnumSet<E>) -> EnumSet<E> { + EnumSet {bits: self.bits ^ e.bits} + } +} + /// An iterator over an EnumSet pub struct Items<E> { index: uint, @@ -433,9 +438,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] |
