1use std::fmt::Debug;
2use std::fmt::Formatter;
3use std::marker::PhantomData;
4use std::mem;
5
6use crate::map::total;
7use crate::Ordinal;
8
9pub struct Iter<'a, K, V> {
12 iter: total::Iter<'a, K, Option<V>>,
13}
14
15impl<'a, K, V> Iter<'a, K, V> {
16 #[inline]
17 pub(crate) fn new(iter: total::Iter<'a, K, Option<V>>) -> Self {
18 Iter { iter }
19 }
20}
21
22impl<'a, K: Ordinal, V> Iterator for Iter<'a, K, V> {
23 type Item = (K, &'a V);
24
25 #[inline]
26 fn next(&mut self) -> Option<Self::Item> {
27 loop {
28 let next = self.iter.next()?;
29 if let (k, Some(v)) = next {
30 return Some((k, v));
31 }
32 }
33 }
34
35 #[inline]
36 fn size_hint(&self) -> (usize, Option<usize>) {
37 (0, Some(self.iter.len()))
38 }
39}
40
41impl<'a, K: Ordinal, V> DoubleEndedIterator for Iter<'a, K, V> {
42 #[inline]
43 fn next_back(&mut self) -> Option<Self::Item> {
44 loop {
45 let next = self.iter.next_back()?;
46 if let (k, Some(v)) = next {
47 return Some((k, v));
48 }
49 }
50 }
51}
52
53impl<'a, K, V> Clone for Iter<'a, K, V> {
54 #[inline]
55 fn clone(&self) -> Self {
56 Iter {
57 iter: self.iter.clone(),
58 }
59 }
60}
61
62impl<'a, K: Ordinal + Debug, V: Debug> Debug for Iter<'a, K, V> {
63 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
64 f.debug_list().entries(self.clone()).finish()
65 }
66}
67
68pub struct IterMut<'a, K, V> {
71 iter: total::IterMut<'a, K, Option<V>>,
72}
73
74impl<'a, K: Ordinal, V> IterMut<'a, K, V> {
75 #[inline]
76 pub(crate) fn new(iter: total::IterMut<'a, K, Option<V>>) -> Self {
77 IterMut { iter }
78 }
79
80 fn iter(&self) -> Iter<'_, K, V> {
81 Iter::new(self.iter.iter())
82 }
83}
84
85impl<'a, K: Ordinal, V> Iterator for IterMut<'a, K, V> {
86 type Item = (K, &'a mut V);
87
88 #[inline]
89 fn next(&mut self) -> Option<Self::Item> {
90 loop {
91 let next = self.iter.next()?;
92 if let (k, Some(v)) = next {
93 return Some((k, v));
94 }
95 }
96 }
97
98 #[inline]
99 fn size_hint(&self) -> (usize, Option<usize>) {
100 (0, Some(self.iter.len()))
101 }
102}
103
104impl<'a, K: Ordinal, V> DoubleEndedIterator for IterMut<'a, K, V> {
105 #[inline]
106 fn next_back(&mut self) -> Option<Self::Item> {
107 loop {
108 let next = self.iter.next_back()?;
109 if let (k, Some(v)) = next {
110 return Some((k, v));
111 }
112 }
113 }
114}
115
116impl<'a, K: Ordinal + Debug, V: Debug> Debug for IterMut<'a, K, V> {
117 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
118 f.debug_list().entries(self.iter()).finish()
119 }
120}
121
122pub struct Keys<'a, K, V> {
125 iter: Iter<'a, K, V>,
126}
127
128impl<'a, K: Ordinal, V> Keys<'a, K, V> {
129 #[inline]
130 pub(crate) fn new(iter: Iter<'a, K, V>) -> Self {
131 Keys { iter }
132 }
133}
134
135impl<'a, K: Ordinal, V> Iterator for Keys<'a, K, V> {
136 type Item = K;
137
138 #[inline]
139 fn next(&mut self) -> Option<Self::Item> {
140 self.iter.next().map(|(k, _)| k)
141 }
142
143 #[inline]
144 fn size_hint(&self) -> (usize, Option<usize>) {
145 self.iter.size_hint()
146 }
147}
148
149impl<'a, K: Ordinal, V> DoubleEndedIterator for Keys<'a, K, V> {
150 #[inline]
151 fn next_back(&mut self) -> Option<Self::Item> {
152 self.iter.next_back().map(|(k, _)| k)
153 }
154}
155
156impl<'a, K: Ordinal, V> Clone for Keys<'a, K, V> {
157 #[inline]
158 fn clone(&self) -> Self {
159 Keys {
160 iter: self.iter.clone(),
161 }
162 }
163}
164
165impl<'a, K: Ordinal + Debug> Debug for Keys<'a, K, ()> {
166 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
167 f.debug_list().entries(self.clone()).finish()
168 }
169}
170
171pub struct Values<'a, K, V> {
174 iter: Iter<'a, K, V>,
175}
176
177impl<'a, K: Ordinal, V> Values<'a, K, V> {
178 #[inline]
179 pub(crate) fn new(iter: Iter<'a, K, V>) -> Self {
180 Values { iter }
181 }
182}
183
184impl<'a, K: Ordinal, V> Iterator for Values<'a, K, V> {
185 type Item = &'a V;
186
187 #[inline]
188 fn next(&mut self) -> Option<Self::Item> {
189 self.iter.next().map(|(_, v)| v)
190 }
191
192 #[inline]
193 fn size_hint(&self) -> (usize, Option<usize>) {
194 self.iter.size_hint()
195 }
196}
197
198impl<'a, K: Ordinal, V> DoubleEndedIterator for Values<'a, K, V> {
199 #[inline]
200 fn next_back(&mut self) -> Option<Self::Item> {
201 self.iter.next_back().map(|(_, v)| v)
202 }
203}
204
205impl<'a, K: Ordinal, V> Clone for Values<'a, K, V> {
206 #[inline]
207 fn clone(&self) -> Self {
208 Values {
209 iter: self.iter.clone(),
210 }
211 }
212}
213
214impl<'a, K: Ordinal + Debug, V: Debug> Debug for Values<'a, K, V> {
215 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
216 f.debug_list().entries(self.clone()).finish()
217 }
218}
219
220pub struct ValuesMut<'a, K, V> {
223 iter: IterMut<'a, K, V>,
224}
225
226impl<'a, K: Ordinal, V> ValuesMut<'a, K, V> {
227 #[inline]
228 pub(crate) fn new(iter: IterMut<'a, K, V>) -> Self {
229 ValuesMut { iter }
230 }
231
232 fn iter(&self) -> Values<'_, K, V> {
233 Values {
234 iter: self.iter.iter(),
235 }
236 }
237}
238
239impl<'a, K: Ordinal, V> Iterator for ValuesMut<'a, K, V> {
240 type Item = &'a mut V;
241
242 #[inline]
243 fn next(&mut self) -> Option<Self::Item> {
244 self.iter.next().map(|(_, v)| v)
245 }
246
247 #[inline]
248 fn size_hint(&self) -> (usize, Option<usize>) {
249 self.iter.size_hint()
250 }
251}
252
253impl<'a, K: Ordinal, V> DoubleEndedIterator for ValuesMut<'a, K, V> {
254 #[inline]
255 fn next_back(&mut self) -> Option<Self::Item> {
256 self.iter.next_back().map(|(_, v)| v)
257 }
258}
259
260impl<'a, K: Ordinal + Debug, V: Debug> Debug for ValuesMut<'a, K, V> {
261 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
262 f.debug_list().entries(self.iter()).finish()
263 }
264}
265
266pub struct Drain<'a, K: Ordinal, V> {
269 iter: total::IterMut<'a, K, Option<V>>,
270}
271
272impl<'a, K: Ordinal, V> Drain<'a, K, V> {
273 pub(crate) fn new(iter: total::IterMut<'a, K, Option<V>>) -> Self {
274 Drain { iter }
275 }
276}
277
278impl<'a, K: Ordinal, V> Drop for Drain<'a, K, V> {
279 fn drop(&mut self) {
280 for _ in self {}
281 }
282}
283
284impl<'a, K: Ordinal, V> Iterator for Drain<'a, K, V> {
285 type Item = (K, V);
286
287 fn next(&mut self) -> Option<Self::Item> {
288 loop {
289 let (k, v) = self.iter.next()?;
290 if let Some(v) = mem::take(v) {
291 return Some((k, v));
292 }
293 }
294 }
295
296 fn size_hint(&self) -> (usize, Option<usize>) {
297 (0, Some(self.iter.len()))
298 }
299}
300
301impl<'a, K: Ordinal, V> DoubleEndedIterator for Drain<'a, K, V> {
302 fn next_back(&mut self) -> Option<Self::Item> {
303 loop {
304 let (k, v) = self.iter.next_back()?;
305 if let Some(v) = mem::take(v) {
306 return Some((k, v));
307 }
308 }
309 }
310}
311
312pub struct IntoIterArray<K, V, const S: usize> {
314 iter: total::IntoIterArray<K, Option<V>, S>,
315 _phantom: PhantomData<K>,
316}
317
318impl<K: Ordinal, V, const S: usize> IntoIterArray<K, V, S> {
319 #[inline]
320 pub(crate) fn new(iter: total::IntoIterArray<K, Option<V>, S>) -> Self {
321 IntoIterArray {
322 iter,
323 _phantom: PhantomData,
324 }
325 }
326
327 fn iter(&self) -> Iter<'_, K, V> {
328 Iter::new(self.iter.iter())
329 }
330}
331
332impl<K: Ordinal, V, const S: usize> Iterator for IntoIterArray<K, V, S> {
333 type Item = (K, V);
334
335 #[inline]
336 fn next(&mut self) -> Option<Self::Item> {
337 loop {
338 let (k, v) = self.iter.next()?;
339 if let Some(v) = v {
340 return Some((k, v));
341 }
342 }
343 }
344}
345
346impl<K: Ordinal, V, const S: usize> DoubleEndedIterator for IntoIterArray<K, V, S> {
347 #[inline]
348 fn next_back(&mut self) -> Option<Self::Item> {
349 loop {
350 let (k, v) = self.iter.next_back()?;
351 if let Some(v) = v {
352 return Some((k, v));
353 }
354 }
355 }
356}
357
358impl<K: Ordinal + Debug, V: Debug, const S: usize> Debug for IntoIterArray<K, V, S> {
359 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
360 f.debug_list().entries(self.iter()).finish()
361 }
362}
363
364impl<K, V: Clone, const S: usize> Clone for IntoIterArray<K, V, S> {
365 fn clone(&self) -> Self {
366 IntoIterArray {
367 iter: self.iter.clone(),
368 _phantom: PhantomData,
369 }
370 }
371}
372
373pub struct IntoIter<K, V> {
375 iter: total::IntoIter<K, Option<V>>,
376}
377
378impl<K, V> IntoIter<K, V> {
379 pub(crate) fn new(iter: total::IntoIter<K, Option<V>>) -> Self {
380 IntoIter { iter }
381 }
382
383 fn iter(&self) -> Iter<'_, K, V> {
384 Iter::new(self.iter.iter())
385 }
386}
387
388impl<K: Ordinal, V> Iterator for IntoIter<K, V> {
389 type Item = (K, V);
390
391 #[inline]
392 fn next(&mut self) -> Option<Self::Item> {
393 loop {
394 let (k, v) = self.iter.next()?;
395 if let Some(v) = v {
396 return Some((k, v));
397 }
398 }
399 }
400
401 fn size_hint(&self) -> (usize, Option<usize>) {
402 (0, Some(self.iter.len()))
403 }
404}
405
406impl<K: Ordinal, V> DoubleEndedIterator for IntoIter<K, V> {
407 fn next_back(&mut self) -> Option<Self::Item> {
408 loop {
409 let (k, v) = self.iter.next_back()?;
410 if let Some(v) = v {
411 return Some((k, v));
412 }
413 }
414 }
415}
416
417impl<K: Ordinal + Debug, V: Debug> Debug for IntoIter<K, V> {
418 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
419 f.debug_list().entries(self.iter()).finish()
420 }
421}
422
423impl<K, V: Clone> Clone for IntoIter<K, V> {
424 fn clone(&self) -> Self {
425 IntoIter {
426 iter: self.iter.clone(),
427 }
428 }
429}