]> git.lizzy.rs Git - enumset.git/commitdiff
Implement DoubleEndedIterator for EnumSet.
authorAlissa Rao <lymia@lymiahugs.com>
Mon, 4 Apr 2022 08:00:13 +0000 (01:00 -0700)
committerAlissa Rao <lymia@lymiahugs.com>
Mon, 4 Apr 2022 08:00:13 +0000 (01:00 -0700)
enumset/src/lib.rs
enumset/tests/ops.rs

index 0ff95fb4583f744e9d8bf7a957e3ab62d2e5c9a8..5a137c3dee2d3d13930f6c0d6f7b2b0d3515b529 100644 (file)
@@ -693,6 +693,7 @@ impl <T: EnumSetType> EnumSetIter<T> {
         EnumSetIter { set }
     }
 }
+
 impl <T: EnumSetType> Iterator for EnumSetIter<T> {
     type Item = T;
 
@@ -711,6 +712,18 @@ impl <T: EnumSetType> Iterator for EnumSetIter<T> {
     }
 }
 
+impl <T: EnumSetType> DoubleEndedIterator for EnumSetIter<T> {
+    fn next_back(&mut self) -> Option<Self::Item> {
+        if self.set.is_empty() {
+            None
+        } else {
+            let bit = T::Repr::WIDTH - 1 - self.set.__priv_repr.leading_zeros();
+            self.set.__priv_repr.remove_bit(bit);
+            unsafe { Some(T::enum_from_u32(bit)) }
+        }
+    }
+}
+
 impl<T: EnumSetType> ExactSizeIterator for EnumSetIter<T> {}
 
 impl<T: EnumSetType> Extend<T> for EnumSet<T> {
index 2dbf6e8cc97d82e5b7fbddd526fbd56b9f5b5478..0e713784313ecbd5b3e8399d78994504d180eadd 100644 (file)
@@ -206,10 +206,14 @@ macro_rules! test_enum {
             let set_a = $e::A | $e::B | $e::E;
             let vec_a: Vec<_> = set_a.iter().collect();
             assert_eq!(vec_a, &[$e::A, $e::B, $e::E]);
-
-            let set_a = $e::B | $e::D | $e::G;
-            let vec_a: Vec<_> = set_a.iter().collect();
-            assert_eq!(vec_a, &[$e::B, $e::D, $e::G]);
+            let vec_a_rev: Vec<_> = set_a.iter().rev().collect();
+            assert_eq!(vec_a_rev, &[$e::E, $e::B, $e::A]);
+
+            let set_b = $e::B | $e::C | $e::D | $e::G;
+            let vec_b: Vec<_> = set_b.iter().collect();
+            assert_eq!(vec_b, &[$e::B, $e::C, $e::D, $e::G]);
+            let vec_b_rev: Vec<_> = set_b.iter().rev().collect();
+            assert_eq!(vec_b_rev, &[$e::G, $e::D, $e::C, $e::B]);
         }
 
         fn check_iter_size_hint(set: EnumSet<$e>) {