From 38d11ae9cefd6f118d90fadf3ed3b95e3e3f222a Mon Sep 17 00:00:00 2001 From: konstin Date: Fri, 8 Nov 2024 10:23:33 +0100 Subject: [PATCH 1/2] Add `IntoIter` on `Ranges` --- version-ranges/src/lib.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/version-ranges/src/lib.rs b/version-ranges/src/lib.rs index 9d3b9959..c9465b60 100644 --- a/version-ranges/src/lib.rs +++ b/version-ranges/src/lib.rs @@ -846,6 +846,27 @@ impl Ranges { } } +// Newtype to avoid leaking our internal representation. +pub struct RangesIter(smallvec::IntoIter<[Interval; 1]>); + +impl Iterator for RangesIter { + type Item = Interval; + + fn next(&mut self) -> Option { + self.0.next() + } +} + +impl IntoIterator for Ranges { + type Item = (Bound, Bound); + // Newtype to avoid leaking our internal representation. + type IntoIter = RangesIter; + + fn into_iter(self) -> Self::IntoIter { + RangesIter(self.segments.into_iter()) + } +} + // REPORT ###################################################################### impl Display for Ranges { From d70a7d8586dd71bee1f3689b66d0ed5c00ac3758 Mon Sep 17 00:00:00 2001 From: konstin Date: Sun, 10 Nov 2024 11:00:49 +0100 Subject: [PATCH 2/2] impl ExactSizeIterator and DoubleEndedIterator on ranges --- version-ranges/src/lib.rs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/version-ranges/src/lib.rs b/version-ranges/src/lib.rs index c9465b60..4fe8f134 100644 --- a/version-ranges/src/lib.rs +++ b/version-ranges/src/lib.rs @@ -855,6 +855,18 @@ impl Iterator for RangesIter { fn next(&mut self) -> Option { self.0.next() } + + fn size_hint(&self) -> (usize, Option) { + (self.0.len(), Some(self.0.len())) + } +} + +impl ExactSizeIterator for RangesIter {} + +impl DoubleEndedIterator for RangesIter { + fn next_back(&mut self) -> Option { + self.0.next_back() + } } impl IntoIterator for Ranges {