From: Alissa Rao Date: Mon, 4 Apr 2022 08:00:13 +0000 (-0700) Subject: Implement DoubleEndedIterator for EnumSet. X-Git-Url: https://git.lizzy.rs/?a=commitdiff_plain;h=a288b5a09b49e49b332d0bf9962ac668e2a4b61d;p=enumset.git Implement DoubleEndedIterator for EnumSet. --- diff --git a/enumset/src/lib.rs b/enumset/src/lib.rs index 0ff95fb..5a137c3 100644 --- a/enumset/src/lib.rs +++ b/enumset/src/lib.rs @@ -693,6 +693,7 @@ impl EnumSetIter { EnumSetIter { set } } } + impl Iterator for EnumSetIter { type Item = T; @@ -711,6 +712,18 @@ impl Iterator for EnumSetIter { } } +impl DoubleEndedIterator for EnumSetIter { + fn next_back(&mut self) -> Option { + 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 ExactSizeIterator for EnumSetIter {} impl Extend for EnumSet { diff --git a/enumset/tests/ops.rs b/enumset/tests/ops.rs index 2dbf6e8..0e71378 100644 --- a/enumset/tests/ops.rs +++ b/enumset/tests/ops.rs @@ -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>) {