1use std::fmt::Debug;
2
3use crate::set::set_ref::OrdinalSetRef;
4use crate::Ordinal;
5
6pub 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}