range_set_blaze/
ranges_iter.rs1use crate::Integer;
2use alloc::collections::btree_map;
3use core::{iter::FusedIterator, ops::RangeInclusive};
4
5#[derive(Clone, Debug)]
11#[must_use = "iterators are lazy and do nothing unless consumed"]
12pub struct RangesIter<'a, T: Integer> {
13 pub(crate) iter: btree_map::Iter<'a, T, T>,
14}
15
16impl<T: Integer> ExactSizeIterator for RangesIter<'_, T> {
17 fn len(&self) -> usize {
18 self.iter.len()
19 }
20}
21
22impl<T: Integer> FusedIterator for RangesIter<'_, T> {}
23
24impl<T: Integer> Iterator for RangesIter<'_, T> {
26 type Item = RangeInclusive<T>;
27
28 fn next(&mut self) -> Option<Self::Item> {
29 self.iter.next().map(|(start, end)| *start..=*end)
30 }
31
32 fn size_hint(&self) -> (usize, Option<usize>) {
33 self.iter.size_hint()
34 }
35}
36
37impl<T: Integer> DoubleEndedIterator for RangesIter<'_, T> {
38 fn next_back(&mut self) -> Option<Self::Item> {
39 self.iter.next_back().map(|(start, end)| *start..=*end)
40 }
41}
42
43#[must_use = "iterators are lazy and do nothing unless consumed"]
49#[derive(Debug)]
50pub struct IntoRangesIter<T: Integer> {
51 pub(crate) iter: alloc::collections::btree_map::IntoIter<T, T>,
52}
53
54impl<T: Integer> ExactSizeIterator for IntoRangesIter<T> {
55 fn len(&self) -> usize {
56 self.iter.len()
57 }
58}
59
60impl<T: Integer> FusedIterator for IntoRangesIter<T> {}
61
62impl<T: Integer> Iterator for IntoRangesIter<T> {
64 type Item = RangeInclusive<T>;
65
66 fn next(&mut self) -> Option<Self::Item> {
67 self.iter.next().map(|(start, end)| start..=end)
68 }
69
70 fn size_hint(&self) -> (usize, Option<usize>) {
71 self.iter.size_hint()
72 }
73}
74
75impl<T: Integer> DoubleEndedIterator for IntoRangesIter<T> {
76 fn next_back(&mut self) -> Option<Self::Item> {
77 self.iter.next_back().map(|(start, end)| start..=end)
78 }
79}