panicking when the conversion cannot be done.
* Added variants of `as_u128`/`from_u128` that truncate unknown bits instead
of panicking.
+* Implemented `Extend<EnumSet<T>>` and `FromIterator<EnumSet<T>>` for
+ `EnumSet<T>`.
## Bugfixes
* Fixed a bug where the procedural macro would fail on enums with a repr
}
}
+impl<T: EnumSetType> Extend<EnumSet<T>> for EnumSet<T> {
+ fn extend<I: IntoIterator<Item = EnumSet<T>>>(&mut self, iter: I) {
+ iter.into_iter().for_each(|v| { self.insert_all(v); });
+ }
+}
+
+impl<T: EnumSetType> FromIterator<EnumSet<T>> for EnumSet<T> {
+ fn from_iter<I: IntoIterator<Item = EnumSet<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
}
#[test]
- fn basic_iter_test() {
+ fn iter_test() {
let mut set = EnumSet::new();
set.insert($e::A);
set.insert($e::B);
- set.insert($e::C);
- set.insert($e::E);
+ set.extend($e::C | $e::E);
let mut set_2 = EnumSet::new();
- let vec: Vec<$e> = set.iter().collect();
+ let vec: Vec<_> = set.iter().collect();
for val in vec {
assert!(!set_2.contains(val));
set_2.insert(val);
set_3.insert(val);
}
assert_eq!(set, set_3);
+
+ let mut set_4 = EnumSet::new();
+ let vec: EnumSet<_> = set.into_iter().map(EnumSet::only).collect();
+ for val in vec {
+ assert!(!set_4.contains(val));
+ set_4.insert(val);
+ }
+ assert_eq!(set, set_4);
+
+ let mut set_5 = EnumSet::new();
+ let vec: EnumSet<_> = set.iter().collect();
+ for val in vec {
+ assert!(!set_5.contains(val));
+ set_5.insert(val);
+ }
+ assert_eq!(set, set_5);
}
fn check_iter_size_hint(set: EnumSet<$e>) {