1use super::{Slot, VecMap};
2use alloc::vec::{self, Vec};
3use core::fmt;
4use core::iter::FusedIterator;
5use core::slice;
6
7macro_rules! impl_iterator {
8 ($ty:ident<$($lt:lifetime,)*$($gen:ident),+>, $item:ty, $map:expr) => {
9 impl<$($lt,)*$($gen),+> Iterator for $ty<$($lt,)*$($gen),+> {
10 type Item = $item;
11
12 fn next(&mut self) -> Option<Self::Item> {
13 self.iter.next().map($map)
14 }
15
16 fn size_hint(&self) -> (usize, Option<usize>) {
17 self.iter.size_hint()
18 }
19 }
20
21 impl<$($lt,)*$($gen),+> DoubleEndedIterator for $ty<$($lt,)*$($gen),+> {
22 fn next_back(&mut self) -> Option<Self::Item> {
23 self.iter.next_back().map($map)
24 }
25 }
26
27 impl<$($lt,)*$($gen),+> ExactSizeIterator for $ty<$($lt,)*$($gen),+> {
28 fn len(&self) -> usize {
29 self.iter.len()
30 }
31 }
32
33 impl<$($lt,)*$($gen),+> FusedIterator for $ty<$($lt,)*$($gen),+> {}
34
35 impl<$($lt,)*$($gen),+> fmt::Debug for $ty<$($lt,)*$($gen),+>
36 where
37 K: fmt::Debug,
38 V: fmt::Debug,
39 {
40 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41 let iter = self.iter.as_slice().iter().map(VecMap::refs);
42 f.debug_list().entries(iter).finish()
43 }
44 }
45 };
46}
47
48impl<K, V> IntoIterator for VecMap<K, V> {
49 type Item = (K, V);
50
51 type IntoIter = IntoIter<K, V>;
52
53 fn into_iter(self) -> Self::IntoIter {
54 IntoIter::new(self.base.into_vec())
55 }
56}
57
58impl<'a, K, V> IntoIterator for &'a VecMap<K, V> {
59 type Item = (&'a K, &'a V);
60
61 type IntoIter = Iter<'a, K, V>;
62
63 fn into_iter(self) -> Self::IntoIter {
64 self.iter()
65 }
66}
67
68impl<'a, K, V> IntoIterator for &'a mut VecMap<K, V> {
69 type Item = (&'a K, &'a mut V);
70
71 type IntoIter = IterMut<'a, K, V>;
72
73 fn into_iter(self) -> Self::IntoIter {
74 self.iter_mut()
75 }
76}
77
78pub struct Iter<'a, K, V> {
84 iter: slice::Iter<'a, Slot<K, V>>,
85}
86
87impl<'a, K, V> Iter<'a, K, V> {
88 pub(super) fn new(entries: &'a [Slot<K, V>]) -> Iter<'a, K, V> {
89 Iter {
90 iter: entries.iter(),
91 }
92 }
93}
94
95impl<K, V> Clone for Iter<'_, K, V> {
96 fn clone(&self) -> Self {
97 Iter {
98 iter: self.iter.clone(),
99 }
100 }
101}
102
103impl_iterator!(Iter<'a, K, V>, (&'a K, &'a V), VecMap::refs);
104
105pub struct IterMut<'a, K, V> {
112 iter: slice::IterMut<'a, Slot<K, V>>,
113}
114
115impl<'a, K, V> IterMut<'a, K, V> {
116 pub(super) fn new(entries: &'a mut [Slot<K, V>]) -> IterMut<'a, K, V> {
117 IterMut {
118 iter: entries.iter_mut(),
119 }
120 }
121}
122
123impl_iterator!(IterMut<'a, K, V>, (&'a K, &'a mut V), VecMap::ref_mut);
124
125pub struct IntoIter<K, V> {
133 iter: vec::IntoIter<Slot<K, V>>,
134}
135
136impl<K, V> IntoIter<K, V> {
137 pub(super) fn new(entries: Vec<Slot<K, V>>) -> IntoIter<K, V> {
138 IntoIter {
139 iter: entries.into_iter(),
140 }
141 }
142}
143
144impl<K, V> Clone for IntoIter<K, V>
145where
146 K: Clone,
147 V: Clone,
148{
149 fn clone(&self) -> Self {
150 IntoIter {
151 iter: self.iter.clone(),
152 }
153 }
154}
155
156impl_iterator!(IntoIter<K, V>, (K, V), |slot| (slot.0, slot.1));
157
158pub struct Keys<'a, K, V> {
164 iter: slice::Iter<'a, Slot<K, V>>,
165}
166
167impl<'a, K, V> Keys<'a, K, V> {
168 pub(super) fn new(entries: &'a [Slot<K, V>]) -> Keys<'a, K, V> {
169 Keys {
170 iter: entries.iter(),
171 }
172 }
173}
174
175impl<K, V> Clone for Keys<'_, K, V> {
176 fn clone(&self) -> Self {
177 Keys {
178 iter: self.iter.clone(),
179 }
180 }
181}
182
183impl_iterator!(Keys<'a, K, V>, &'a K, |slot| &slot.0);
184
185pub struct IntoKeys<K, V> {
192 iter: vec::IntoIter<Slot<K, V>>,
193}
194
195impl<K, V> IntoKeys<K, V> {
196 pub(super) fn new(entries: Vec<Slot<K, V>>) -> IntoKeys<K, V> {
197 IntoKeys {
198 iter: entries.into_iter(),
199 }
200 }
201}
202
203impl<K, V> Clone for IntoKeys<K, V>
204where
205 K: Clone,
206 V: Clone,
207{
208 fn clone(&self) -> Self {
209 IntoKeys {
210 iter: self.iter.clone(),
211 }
212 }
213}
214
215impl_iterator!(IntoKeys<K, V>, K, |slot| slot.0);
216
217pub struct Values<'a, K, V> {
224 iter: slice::Iter<'a, Slot<K, V>>,
225}
226
227impl<'a, K, V> Values<'a, K, V> {
228 pub(super) fn new(entries: &'a [Slot<K, V>]) -> Values<'a, K, V> {
229 Values {
230 iter: entries.iter(),
231 }
232 }
233}
234
235impl<K, V> Clone for Values<'_, K, V> {
236 fn clone(&self) -> Self {
237 Values {
238 iter: self.iter.clone(),
239 }
240 }
241}
242
243impl_iterator!(Values<'a, K, V>, &'a V, |slot| &slot.1);
244
245pub struct ValuesMut<'a, K, V> {
252 iter: slice::IterMut<'a, Slot<K, V>>,
253}
254
255impl<'a, K, V> ValuesMut<'a, K, V> {
256 pub(super) fn new(entries: &'a mut [Slot<K, V>]) -> ValuesMut<'a, K, V> {
257 ValuesMut {
258 iter: entries.iter_mut(),
259 }
260 }
261}
262
263impl_iterator!(ValuesMut<'a, K, V>, &'a mut V, |slot| &mut slot.1);
264
265pub struct IntoValues<K, V> {
272 iter: vec::IntoIter<Slot<K, V>>,
273}
274
275impl<K, V> IntoValues<K, V> {
276 pub(super) fn new(entries: Vec<Slot<K, V>>) -> IntoValues<K, V> {
277 IntoValues {
278 iter: entries.into_iter(),
279 }
280 }
281}
282
283impl<K, V> Clone for IntoValues<K, V>
284where
285 K: Clone,
286 V: Clone,
287{
288 fn clone(&self) -> Self {
289 IntoValues {
290 iter: self.iter.clone(),
291 }
292 }
293}
294
295impl_iterator!(IntoValues<K, V>, V, |slot| slot.1);