use core::fmt;
use core::fmt::{Debug, Formatter};
use core::hash::{Hash, Hasher};
+use core::iter::FromIterator;
use core::ops::*;
use num_traits::*;
}
}
+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
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);
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));