1use crate::Idx;
2
3pub struct IterIndexed<'a, T> {
7 inner: std::iter::Enumerate<std::slice::Iter<'a, T>>,
8}
9
10impl<'a, T> IterIndexed<'a, T> {
11 #[must_use]
13 pub const fn new(inner: std::iter::Enumerate<std::slice::Iter<'a, T>>) -> Self {
14 Self { inner }
15 }
16}
17
18impl<'a, T> Iterator for IterIndexed<'a, T> {
19 type Item = (Idx<T>, &'a T);
20
21 fn next(&mut self) -> Option<Self::Item> {
22 self.inner.next().map(|(i, v)| (Idx::from_raw(i), v))
23 }
24
25 fn size_hint(&self) -> (usize, Option<usize>) {
26 self.inner.size_hint()
27 }
28}
29
30impl<T> ExactSizeIterator for IterIndexed<'_, T> {}
31
32pub struct IterIndexedMut<'a, T> {
36 inner: std::iter::Enumerate<std::slice::IterMut<'a, T>>,
37}
38
39impl<'a, T> IterIndexedMut<'a, T> {
40 #[must_use]
43 pub const fn new(inner: std::iter::Enumerate<std::slice::IterMut<'a, T>>) -> Self {
44 Self { inner }
45 }
46}
47
48impl<'a, T> Iterator for IterIndexedMut<'a, T> {
49 type Item = (Idx<T>, &'a mut T);
50
51 fn next(&mut self) -> Option<Self::Item> {
52 self.inner.next().map(|(i, v)| (Idx::from_raw(i), v))
53 }
54
55 fn size_hint(&self) -> (usize, Option<usize>) {
56 self.inner.size_hint()
57 }
58}
59
60impl<T> ExactSizeIterator for IterIndexedMut<'_, T> {}