1use std::fmt;
2use std::fmt::Debug;
3use std::fmt::Formatter;
4use std::marker::PhantomData;
5use std::ops::Range;
6
7use crate::Ordinal;
8
9pub struct OrdinalValues<T> {
21 range: Range<usize>,
22 _phantom: PhantomData<T>,
23}
24
25impl<T: Ordinal> OrdinalValues<T> {
26 #[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}