ordinal_map/set/
iter.rs

1use std::fmt::Debug;
2
3use crate::set::set_ref::OrdinalSetRef;
4use crate::Ordinal;
5
6/// Iterator over elements of [`OrdinalSet`](crate::set::OrdinalSet)
7/// or [`OrdinalArraySet`](crate::set::OrdinalArraySet).
8pub struct Iter<'a, T> {
9    iter: crate::OrdinalValues<T>,
10    set: OrdinalSetRef<'a, T>,
11}
12
13impl<'a, T: Ordinal> Iter<'a, T> {
14    #[inline]
15    pub(crate) fn new(set: OrdinalSetRef<'a, T>) -> Self {
16        Iter {
17            iter: T::all_values(),
18            set,
19        }
20    }
21}
22
23impl<'a, T: Ordinal> Iterator for Iter<'a, T> {
24    type Item = T;
25
26    #[inline]
27    fn next(&mut self) -> Option<Self::Item> {
28        loop {
29            let next = self.iter.next()?;
30            if self.set.contains(&next) {
31                return Some(next);
32            }
33        }
34    }
35
36    #[inline]
37    fn size_hint(&self) -> (usize, Option<usize>) {
38        (0, Some(self.iter.len()))
39    }
40}
41
42impl<'a, T: Ordinal> DoubleEndedIterator for Iter<'a, T> {
43    #[inline]
44    fn next_back(&mut self) -> Option<Self::Item> {
45        loop {
46            let next = self.iter.next_back()?;
47            if self.set.contains(&next) {
48                return Some(next);
49            }
50        }
51    }
52}
53
54impl<'a, T> Clone for Iter<'a, T> {
55    #[inline]
56    fn clone(&self) -> Self {
57        Iter {
58            iter: self.iter.clone(),
59            set: self.set.clone(),
60        }
61    }
62}
63
64impl<'a, T: Ordinal + Debug> Debug for Iter<'a, T> {
65    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
66        f.debug_list().entries(self.clone()).finish()
67    }
68}