ordinal_map/
values.rs

1use std::fmt;
2use std::fmt::Debug;
3use std::fmt::Formatter;
4use std::marker::PhantomData;
5use std::ops::Range;
6
7use crate::Ordinal;
8
9/// Iterator over [`Ordinal`] values.
10///
11/// This iterator is created by [`Ordinal::all_values`](Ordinal::all_values).
12///
13/// # Example
14///
15/// ```
16/// use ordinal_map::Ordinal;
17///
18/// assert_eq!(vec![false, true], bool::all_values().collect::<Vec<_>>());
19/// ```
20pub struct OrdinalValues<T> {
21    range: Range<usize>,
22    _phantom: PhantomData<T>,
23}
24
25impl<T: Ordinal> OrdinalValues<T> {
26    /// Create a new iterator.
27    #[inline]
28    pub(crate) fn new() -> Self {
29        OrdinalValues {
30            range: 0..T::ORDINAL_SIZE,
31            _phantom: PhantomData,
32        }
33    }
34}
35
36impl<T: Ordinal> Iterator for OrdinalValues<T> {
37    type Item = T;
38
39    #[inline]
40    fn next(&mut self) -> Option<Self::Item> {
41        let next = self.range.next()?;
42        Some(T::from_ordinal(next).unwrap())
43    }
44
45    #[inline]
46    fn size_hint(&self) -> (usize, Option<usize>) {
47        self.range.size_hint()
48    }
49
50    #[inline]
51    fn count(self) -> usize
52    where
53        Self: Sized,
54    {
55        self.range.count()
56    }
57
58    #[inline]
59    fn last(mut self) -> Option<Self::Item>
60    where
61        Self: Sized,
62    {
63        self.next_back()
64    }
65}
66
67impl<T: Ordinal> ExactSizeIterator for OrdinalValues<T> {
68    #[inline]
69    fn len(&self) -> usize {
70        self.range.len()
71    }
72}
73
74impl<T: Ordinal> DoubleEndedIterator for OrdinalValues<T> {
75    #[inline]
76    fn next_back(&mut self) -> Option<Self::Item> {
77        let next = self.range.next_back()?;
78        Some(T::from_ordinal(next).unwrap())
79    }
80}
81
82impl<T> Clone for OrdinalValues<T> {
83    #[inline]
84    fn clone(&self) -> Self {
85        OrdinalValues {
86            range: self.range.clone(),
87            _phantom: PhantomData,
88        }
89    }
90}
91
92impl<T: Ordinal + Debug> Debug for OrdinalValues<T> {
93    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
94        let mut iter = self.clone();
95        let Some(first) = iter.next() else {
96            return write!(f, "[]");
97        };
98        if self.range.end == T::ORDINAL_SIZE {
99            write!(f, "[{:?}..]", first)
100        } else {
101            let Some(last) = iter.next_back() else {
102                return write!(f, "[{:?}]", first);
103            };
104            write!(f, "[{:?}..={:?}]", first, last)
105        }
106    }
107}
108
109#[cfg(test)]
110mod tests {
111    use crate::Ordinal;
112
113    #[test]
114    fn test_iter_debug() {
115        let mut iter = u8::all_values();
116        assert_eq!("[0..]", format!("{:?}", iter));
117        iter.next().unwrap();
118        assert_eq!("[1..]", format!("{:?}", iter));
119        iter.next_back().unwrap();
120        assert_eq!("[1..=254]", format!("{:?}", iter));
121        assert_eq!(254, iter.len());
122        iter.nth(252).unwrap();
123        assert_eq!("[254]", format!("{:?}", iter));
124    }
125
126    #[test]
127    fn test_last() {
128        let iter = u8::all_values();
129        assert_eq!(Some(255), iter.last());
130    }
131}