about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-11-09 15:11:43 +0000
committerbors <bors@rust-lang.org>2014-11-09 15:11:43 +0000
commiteeca3c7b4cd99ef38900250be8c19e5572168004 (patch)
treef1e12ba2e6b4f699891c01fd5dbfbdfb6c20a6ad /src
parent946225d77f65e307de3c216cbc2c686b880a6791 (diff)
parent12db4de554faf8e2f6baca4514b1e5983cb60783 (diff)
downloadrust-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')
-rw-r--r--src/libcollections/enum_set.rs27
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]