]> git.lizzy.rs Git - enumset.git/commitdiff
Implement core::iter::Sum for EnumSet<T>
authorAlissa Rao <lymia@lymiahugs.com>
Wed, 24 Feb 2021 17:24:46 +0000 (09:24 -0800)
committerAlissa Rao <lymia@lymiahugs.com>
Wed, 24 Feb 2021 17:24:46 +0000 (09:24 -0800)
enumset/src/lib.rs
enumset/tests/ops.rs

index 55aab1e98e45463004ca2dc16a0c5c98ef2a6d7a..66af9e316ec26c6aa36eefd3f13ce349f7029fb6 100644 (file)
@@ -81,7 +81,7 @@ use core::cmp::Ordering;
 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)]
@@ -462,6 +462,26 @@ impl <T: EnumSetType> IntoIterator for EnumSet<T> {
         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;
index aa7019b8c3334d8d8c5bf48da393d60fe0a009fa..44694d9a093427b4ace6e773bdb3eaaebb8dd8a5 100644 (file)
@@ -323,6 +323,23 @@ macro_rules! test_enum {
             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);