range_set_blaze/
values.rs

1use alloc::collections::btree_map;
2use core::iter::FusedIterator;
3
4use crate::{
5    Integer, SortedDisjointMap,
6    iter_map::{IntoIterMap, IterMap},
7    map::{EndValue, ValueRef},
8};
9
10/// An iterator over the values of a [`RangeMapBlaze`]. Double-ended.
11///
12/// This `struct` is created by the [`values`] method on [`RangeMapBlaze`]. See its
13/// documentation for more.
14///
15/// [`values`]: crate::RangeMapBlaze::values
16/// [`RangeMapBlaze`]: crate::RangeMapBlaze
17#[must_use = "iterators are lazy and do nothing unless consumed"]
18#[derive(Clone, Debug)]
19pub struct Values<T, VR, I>
20where
21    T: Integer,
22    VR: ValueRef,
23    I: SortedDisjointMap<T, VR>,
24{
25    iter: IterMap<T, VR, I>,
26}
27
28impl<T, VR, I> Values<T, VR, I>
29where
30    T: Integer,
31    VR: ValueRef,
32    I: SortedDisjointMap<T, VR>,
33{
34    pub(crate) const fn new(iter: I) -> Self {
35        Self {
36            iter: IterMap::new(iter),
37        }
38    }
39}
40
41impl<T, VR, I> FusedIterator for Values<T, VR, I>
42where
43    T: Integer,
44    VR: ValueRef,
45    I: SortedDisjointMap<T, VR> + FusedIterator,
46{
47}
48
49impl<T, VR, I> Iterator for Values<T, VR, I>
50where
51    T: Integer,
52    VR: ValueRef,
53    I: SortedDisjointMap<T, VR>,
54{
55    type Item = VR;
56
57    fn next(&mut self) -> Option<Self::Item> {
58        self.iter.next().map(|(_key, value)| value)
59    }
60
61    fn size_hint(&self) -> (usize, Option<usize>) {
62        self.iter.size_hint()
63    }
64}
65
66impl<T, VR, I> DoubleEndedIterator for Values<T, VR, I>
67where
68    T: Integer,
69    VR: ValueRef,
70    I: SortedDisjointMap<T, VR> + DoubleEndedIterator,
71{
72    fn next_back(&mut self) -> Option<Self::Item> {
73        self.iter.next_back().map(|(_key, value)| value)
74    }
75}
76
77/// An iterator over the values of a [`RangeMapBlaze`]. Double-ended.
78///
79/// This `struct` is created by the [`into_values`] method on [`RangeMapBlaze`]. See its
80/// documentation for more.
81///
82/// [`into_values`]: crate::RangeMapBlaze::into_values
83/// [`RangeMapBlaze`]: crate::RangeMapBlaze
84#[must_use = "iterators are lazy and do nothing unless consumed"]
85#[derive(Debug)]
86pub struct IntoValues<T, V>
87where
88    T: Integer,
89    V: Eq + Clone,
90{
91    into_iter: IntoIterMap<T, V>,
92}
93
94impl<T, V> IntoValues<T, V>
95where
96    T: Integer,
97    V: Eq + Clone,
98{
99    pub(crate) const fn new(btree_map_into_iter: btree_map::IntoIter<T, EndValue<T, V>>) -> Self {
100        let into_iter = IntoIterMap::new(btree_map_into_iter);
101        Self { into_iter }
102    }
103}
104
105impl<T, V> Iterator for IntoValues<T, V>
106where
107    T: Integer,
108    V: Eq + Clone,
109{
110    type Item = V;
111
112    fn next(&mut self) -> Option<Self::Item> {
113        self.into_iter.next().map(|(_key, value)| value)
114    }
115
116    fn size_hint(&self) -> (usize, Option<usize>) {
117        self.into_iter.size_hint()
118    }
119}
120
121impl<T, V> FusedIterator for IntoValues<T, V>
122where
123    T: Integer,
124    V: Eq + Clone,
125{
126}
127
128impl<T, V> DoubleEndedIterator for IntoValues<T, V>
129where
130    T: Integer,
131    V: Eq + Clone,
132{
133    fn next_back(&mut self) -> Option<Self::Item> {
134        self.into_iter.next_back().map(|(_key, value)| value)
135    }
136}