1use crate::EntityRef;
4use alloc::vec;
5use core::iter::Enumerate;
6use core::marker::PhantomData;
7use core::slice;
8
9pub struct Iter<'a, K: EntityRef, V>
11where
12 V: 'a,
13{
14 enumerate: Enumerate<slice::Iter<'a, V>>,
15 unused: PhantomData<K>,
16}
17
18impl<'a, K: EntityRef, V> Iter<'a, K, V> {
19 pub fn new(iter: slice::Iter<'a, V>) -> Self {
22 Self {
23 enumerate: iter.enumerate(),
24 unused: PhantomData,
25 }
26 }
27}
28
29impl<'a, K: EntityRef, V> Iterator for Iter<'a, K, V> {
30 type Item = (K, &'a V);
31
32 fn next(&mut self) -> Option<Self::Item> {
33 self.enumerate.next().map(|(i, v)| (K::new(i), v))
34 }
35
36 fn size_hint(&self) -> (usize, Option<usize>) {
37 self.enumerate.size_hint()
38 }
39}
40
41impl<'a, K: EntityRef, V> DoubleEndedIterator for Iter<'a, K, V> {
42 fn next_back(&mut self) -> Option<Self::Item> {
43 self.enumerate.next_back().map(|(i, v)| (K::new(i), v))
44 }
45}
46
47impl<'a, K: EntityRef, V> ExactSizeIterator for Iter<'a, K, V> {}
48
49pub struct IterMut<'a, K: EntityRef, V>
51where
52 V: 'a,
53{
54 enumerate: Enumerate<slice::IterMut<'a, V>>,
55 unused: PhantomData<K>,
56}
57
58impl<'a, K: EntityRef, V> IterMut<'a, K, V> {
59 pub fn new(iter: slice::IterMut<'a, V>) -> Self {
62 Self {
63 enumerate: iter.enumerate(),
64 unused: PhantomData,
65 }
66 }
67}
68
69impl<'a, K: EntityRef, V> Iterator for IterMut<'a, K, V> {
70 type Item = (K, &'a mut V);
71
72 fn next(&mut self) -> Option<Self::Item> {
73 self.enumerate.next().map(|(i, v)| (K::new(i), v))
74 }
75
76 fn size_hint(&self) -> (usize, Option<usize>) {
77 self.enumerate.size_hint()
78 }
79}
80
81impl<'a, K: EntityRef, V> DoubleEndedIterator for IterMut<'a, K, V> {
82 fn next_back(&mut self) -> Option<Self::Item> {
83 self.enumerate.next_back().map(|(i, v)| (K::new(i), v))
84 }
85}
86
87impl<'a, K: EntityRef, V> ExactSizeIterator for IterMut<'a, K, V> {}
88
89pub struct IntoIter<K: EntityRef, V> {
91 enumerate: Enumerate<vec::IntoIter<V>>,
92 unused: PhantomData<K>,
93}
94
95impl<K: EntityRef, V> IntoIter<K, V> {
96 pub fn new(iter: vec::IntoIter<V>) -> Self {
99 Self {
100 enumerate: iter.enumerate(),
101 unused: PhantomData,
102 }
103 }
104}
105
106impl<K: EntityRef, V> Iterator for IntoIter<K, V> {
107 type Item = (K, V);
108
109 fn next(&mut self) -> Option<Self::Item> {
110 self.enumerate.next().map(|(i, v)| (K::new(i), v))
111 }
112
113 fn size_hint(&self) -> (usize, Option<usize>) {
114 self.enumerate.size_hint()
115 }
116}
117
118impl<K: EntityRef, V> DoubleEndedIterator for IntoIter<K, V> {
119 fn next_back(&mut self) -> Option<Self::Item> {
120 self.enumerate.next_back().map(|(i, v)| (K::new(i), v))
121 }
122}
123
124impl<K: EntityRef, V> ExactSizeIterator for IntoIter<K, V> {}