]> git.lizzy.rs Git - enumset.git/commitdiff
Implemented Extend and FromIterator for EnumSet.
authorManu Thambi <manu@meshcapital.com>
Wed, 2 Oct 2019 22:28:26 +0000 (18:28 -0400)
committerManu Thambi <manu@meshcapital.com>
Wed, 2 Oct 2019 22:28:26 +0000 (18:28 -0400)
enumset/src/lib.rs
enumset/tests/ops.rs

index 5f98ab539da411ed4f8ebf6cc55f41ff8fefa878..3be1cf064e097b471e1d1cdab01b752173c27ae7 100644 (file)
@@ -79,6 +79,7 @@ use core::cmp::Ordering;
 use core::fmt;
 use core::fmt::{Debug, Formatter};
 use core::hash::{Hash, Hasher};
+use core::iter::FromIterator;
 use core::ops::*;
 
 use num_traits::*;
@@ -515,6 +516,20 @@ impl <T : EnumSetType> Iterator for EnumSetIter<T> {
     }
 }
 
+impl<T: EnumSetType> Extend<T> for EnumSet<T> {
+    fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
+        iter.into_iter().for_each(|v| { self.insert(v); });
+    }
+}
+
+impl<T: EnumSetType> FromIterator<T> for EnumSet<T> {
+    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
+        let mut set = EnumSet::default();
+        set.extend(iter);
+        set
+    }
+}
+
 /// Creates a EnumSet literal, which can be used in const contexts.
 ///
 /// The syntax used is `enum_set!(Type::A | Type::B | Type::C)`. Each variant must be of the same
index 7a4e012f9fe75675484ba99d91a62259d2e42579..71ab56d691550c824d2edab2b3ac619c161b4944 100644 (file)
@@ -164,6 +164,13 @@ macro_rules! test_enum {
             check_iter_size_hint(set);
         }
 
+        #[test]
+        fn iter_ops_test() {
+            let set = $e::A | $e::B | $e::C | $e::E;
+            let set2 = set.iter().filter(|&v| v != $e::B).collect::<EnumSet<_>>();
+            assert_eq!(set2, $e::A | $e::C | $e::E);
+        }
+
         #[test]
         fn basic_ops_test() {
             assert_eq!(($e::A | $e::B) | ($e::B | $e::C), $e::A | $e::B | $e::C);
@@ -222,4 +229,4 @@ tests!(small_enum, test_enum!(SmallEnum, 4));
 tests!(large_enum, test_enum!(LargeEnum, 16));
 tests!(enum8, test_enum!(Enum8, 1));
 tests!(enum128, test_enum!(Enum128, 16));
-tests!(sparse_enum, test_enum!(SparseEnum, 16));
\ No newline at end of file
+tests!(sparse_enum, test_enum!(SparseEnum, 16));