use core::fmt;
use core::fmt::{Debug, Formatter};
use core::hash::{Hash, Hasher};
-use core::iter::FromIterator;
+use core::iter::{FromIterator, Sum};
use core::ops::*;
#[doc(hidden)]
self.iter()
}
}
+impl <T: EnumSetType> Sum for EnumSet<T> {
+ fn sum<I: Iterator<Item=Self>>(iter: I) -> Self {
+ iter.fold(EnumSet::empty(), |a, v| a | v)
+ }
+}
+impl <'a, T: EnumSetType> Sum<&'a EnumSet<T>> for EnumSet<T> {
+ fn sum<I: Iterator<Item=&'a Self>>(iter: I) -> Self {
+ iter.fold(EnumSet::empty(), |a, v| a | *v)
+ }
+}
+impl <T: EnumSetType> Sum<T> for EnumSet<T> {
+ fn sum<I: Iterator<Item=T>>(iter: I) -> Self {
+ iter.fold(EnumSet::empty(), |a, v| a | v)
+ }
+}
+impl <'a, T: EnumSetType> Sum<&'a T> for EnumSet<T> {
+ fn sum<I: Iterator<Item=&'a T>>(iter: I) -> Self {
+ iter.fold(EnumSet::empty(), |a, v| a | *v)
+ }
+}
impl <T: EnumSetType, O: Into<EnumSet<T>>> Sub<O> for EnumSet<T> {
type Output = Self;
test_set!(tree_set);
}
+ #[test]
+ fn sum_test() {
+ let target = $e::A | $e::B | $e::D | $e::E | $e::G | $e::H;
+
+ let list_a = [$e::A | $e::B, $e::D | $e::E, $e::G | $e::H];
+ let sum_a: EnumSet<$e> = list_a.iter().map(|x| *x).sum();
+ assert_eq!(target, sum_a);
+ let sum_b: EnumSet<$e> = list_a.iter().sum();
+ assert_eq!(target, sum_b);
+
+ let list_b = [$e::A, $e::B, $e::D, $e::E, $e::G, $e::H];
+ let sum_c: EnumSet<$e> = list_b.iter().map(|x| *x).sum();
+ assert_eq!(target, sum_c);
+ let sum_d: EnumSet<$e> = list_b.iter().sum();
+ assert_eq!(target, sum_d);
+ }
+
#[test]
fn check_size() {
assert_eq!(::std::mem::size_of::<EnumSet<$e>>(), $mem_size);