Coverage Report

Created: 2026-01-10 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/indexmap-2.13.0/src/map/iter.rs
Line
Count
Source
1
use super::{Bucket, HashValue, IndexMap, Slice};
2
use crate::inner::{Core, ExtractCore};
3
4
use alloc::vec::{self, Vec};
5
use core::fmt;
6
use core::hash::{BuildHasher, Hash};
7
use core::iter::FusedIterator;
8
use core::mem::MaybeUninit;
9
use core::ops::{Index, RangeBounds};
10
use core::slice;
11
12
impl<'a, K, V, S> IntoIterator for &'a IndexMap<K, V, S> {
13
    type Item = (&'a K, &'a V);
14
    type IntoIter = Iter<'a, K, V>;
15
16
    fn into_iter(self) -> Self::IntoIter {
17
        self.iter()
18
    }
19
}
20
21
impl<'a, K, V, S> IntoIterator for &'a mut IndexMap<K, V, S> {
22
    type Item = (&'a K, &'a mut V);
23
    type IntoIter = IterMut<'a, K, V>;
24
25
    fn into_iter(self) -> Self::IntoIter {
26
        self.iter_mut()
27
    }
28
}
29
30
impl<K, V, S> IntoIterator for IndexMap<K, V, S> {
31
    type Item = (K, V);
32
    type IntoIter = IntoIter<K, V>;
33
34
    fn into_iter(self) -> Self::IntoIter {
35
        IntoIter::new(self.into_entries())
36
    }
37
}
38
39
/// An iterator over the entries of an [`IndexMap`].
40
///
41
/// This `struct` is created by the [`IndexMap::iter`] method.
42
/// See its documentation for more.
43
pub struct Iter<'a, K, V> {
44
    iter: slice::Iter<'a, Bucket<K, V>>,
45
}
46
47
impl<'a, K, V> Iter<'a, K, V> {
48
0
    pub(super) fn new(entries: &'a [Bucket<K, V>]) -> Self {
49
0
        Self {
50
0
            iter: entries.iter(),
51
0
        }
52
0
    }
53
54
    /// Returns a slice of the remaining entries in the iterator.
55
    pub fn as_slice(&self) -> &'a Slice<K, V> {
56
        Slice::from_slice(self.iter.as_slice())
57
    }
58
}
59
60
impl<'a, K, V> Iterator for Iter<'a, K, V> {
61
    type Item = (&'a K, &'a V);
62
63
    iterator_methods!(Bucket::refs);
64
}
65
66
impl<K, V> DoubleEndedIterator for Iter<'_, K, V> {
67
    double_ended_iterator_methods!(Bucket::refs);
68
}
69
70
impl<K, V> ExactSizeIterator for Iter<'_, K, V> {
71
    fn len(&self) -> usize {
72
        self.iter.len()
73
    }
74
}
75
76
impl<K, V> FusedIterator for Iter<'_, K, V> {}
77
78
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
79
impl<K, V> Clone for Iter<'_, K, V> {
80
    fn clone(&self) -> Self {
81
        Iter {
82
            iter: self.iter.clone(),
83
        }
84
    }
85
}
86
87
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Iter<'_, K, V> {
88
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
89
        f.debug_list().entries(self.clone()).finish()
90
    }
91
}
92
93
impl<K, V> Default for Iter<'_, K, V> {
94
    fn default() -> Self {
95
        Self { iter: [].iter() }
96
    }
97
}
98
99
/// A mutable iterator over the entries of an [`IndexMap`].
100
///
101
/// This `struct` is created by the [`IndexMap::iter_mut`] method.
102
/// See its documentation for more.
103
pub struct IterMut<'a, K, V> {
104
    iter: slice::IterMut<'a, Bucket<K, V>>,
105
}
106
107
impl<'a, K, V> IterMut<'a, K, V> {
108
    pub(super) fn new(entries: &'a mut [Bucket<K, V>]) -> Self {
109
        Self {
110
            iter: entries.iter_mut(),
111
        }
112
    }
113
114
    /// Returns a slice of the remaining entries in the iterator.
115
    pub fn as_slice(&self) -> &Slice<K, V> {
116
        Slice::from_slice(self.iter.as_slice())
117
    }
118
119
    /// Returns a mutable slice of the remaining entries in the iterator.
120
    ///
121
    /// To avoid creating `&mut` references that alias, this is forced to consume the iterator.
122
    pub fn into_slice(self) -> &'a mut Slice<K, V> {
123
        Slice::from_mut_slice(self.iter.into_slice())
124
    }
125
}
126
127
impl<'a, K, V> Iterator for IterMut<'a, K, V> {
128
    type Item = (&'a K, &'a mut V);
129
130
    iterator_methods!(Bucket::ref_mut);
131
}
132
133
impl<K, V> DoubleEndedIterator for IterMut<'_, K, V> {
134
    double_ended_iterator_methods!(Bucket::ref_mut);
135
}
136
137
impl<K, V> ExactSizeIterator for IterMut<'_, K, V> {
138
    fn len(&self) -> usize {
139
        self.iter.len()
140
    }
141
}
142
143
impl<K, V> FusedIterator for IterMut<'_, K, V> {}
144
145
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IterMut<'_, K, V> {
146
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
147
        let iter = self.iter.as_slice().iter().map(Bucket::refs);
148
        f.debug_list().entries(iter).finish()
149
    }
150
}
151
152
impl<K, V> Default for IterMut<'_, K, V> {
153
    fn default() -> Self {
154
        Self {
155
            iter: [].iter_mut(),
156
        }
157
    }
158
}
159
160
/// A mutable iterator over the entries of an [`IndexMap`].
161
///
162
/// This `struct` is created by the [`MutableKeys::iter_mut2`][super::MutableKeys::iter_mut2] method.
163
/// See its documentation for more.
164
pub struct IterMut2<'a, K, V> {
165
    iter: slice::IterMut<'a, Bucket<K, V>>,
166
}
167
168
impl<'a, K, V> IterMut2<'a, K, V> {
169
    pub(super) fn new(entries: &'a mut [Bucket<K, V>]) -> Self {
170
        Self {
171
            iter: entries.iter_mut(),
172
        }
173
    }
174
175
    /// Returns a slice of the remaining entries in the iterator.
176
    pub fn as_slice(&self) -> &Slice<K, V> {
177
        Slice::from_slice(self.iter.as_slice())
178
    }
179
180
    /// Returns a mutable slice of the remaining entries in the iterator.
181
    ///
182
    /// To avoid creating `&mut` references that alias, this is forced to consume the iterator.
183
    pub fn into_slice(self) -> &'a mut Slice<K, V> {
184
        Slice::from_mut_slice(self.iter.into_slice())
185
    }
186
}
187
188
impl<'a, K, V> Iterator for IterMut2<'a, K, V> {
189
    type Item = (&'a mut K, &'a mut V);
190
191
    iterator_methods!(Bucket::muts);
192
}
193
194
impl<K, V> DoubleEndedIterator for IterMut2<'_, K, V> {
195
    double_ended_iterator_methods!(Bucket::muts);
196
}
197
198
impl<K, V> ExactSizeIterator for IterMut2<'_, K, V> {
199
    fn len(&self) -> usize {
200
        self.iter.len()
201
    }
202
}
203
204
impl<K, V> FusedIterator for IterMut2<'_, K, V> {}
205
206
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IterMut2<'_, K, V> {
207
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
208
        let iter = self.iter.as_slice().iter().map(Bucket::refs);
209
        f.debug_list().entries(iter).finish()
210
    }
211
}
212
213
impl<K, V> Default for IterMut2<'_, K, V> {
214
    fn default() -> Self {
215
        Self {
216
            iter: [].iter_mut(),
217
        }
218
    }
219
}
220
221
/// An owning iterator over the entries of an [`IndexMap`].
222
///
223
/// This `struct` is created by the [`IndexMap::into_iter`] method
224
/// (provided by the [`IntoIterator`] trait). See its documentation for more.
225
#[derive(Clone)]
226
pub struct IntoIter<K, V> {
227
    iter: vec::IntoIter<Bucket<K, V>>,
228
}
229
230
impl<K, V> IntoIter<K, V> {
231
    pub(super) fn new(entries: Vec<Bucket<K, V>>) -> Self {
232
        Self {
233
            iter: entries.into_iter(),
234
        }
235
    }
236
237
    /// Returns a slice of the remaining entries in the iterator.
238
    pub fn as_slice(&self) -> &Slice<K, V> {
239
        Slice::from_slice(self.iter.as_slice())
240
    }
241
242
    /// Returns a mutable slice of the remaining entries in the iterator.
243
    pub fn as_mut_slice(&mut self) -> &mut Slice<K, V> {
244
        Slice::from_mut_slice(self.iter.as_mut_slice())
245
    }
246
}
247
248
impl<K, V> Iterator for IntoIter<K, V> {
249
    type Item = (K, V);
250
251
    iterator_methods!(Bucket::key_value);
252
}
253
254
impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
255
    double_ended_iterator_methods!(Bucket::key_value);
256
}
257
258
impl<K, V> ExactSizeIterator for IntoIter<K, V> {
259
    fn len(&self) -> usize {
260
        self.iter.len()
261
    }
262
}
263
264
impl<K, V> FusedIterator for IntoIter<K, V> {}
265
266
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IntoIter<K, V> {
267
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
268
        let iter = self.iter.as_slice().iter().map(Bucket::refs);
269
        f.debug_list().entries(iter).finish()
270
    }
271
}
272
273
impl<K, V> Default for IntoIter<K, V> {
274
    fn default() -> Self {
275
        Self {
276
            iter: Vec::new().into_iter(),
277
        }
278
    }
279
}
280
281
/// A draining iterator over the entries of an [`IndexMap`].
282
///
283
/// This `struct` is created by the [`IndexMap::drain`] method.
284
/// See its documentation for more.
285
pub struct Drain<'a, K, V> {
286
    iter: vec::Drain<'a, Bucket<K, V>>,
287
}
288
289
impl<'a, K, V> Drain<'a, K, V> {
290
    pub(super) fn new(iter: vec::Drain<'a, Bucket<K, V>>) -> Self {
291
        Self { iter }
292
    }
293
294
    /// Returns a slice of the remaining entries in the iterator.
295
    pub fn as_slice(&self) -> &Slice<K, V> {
296
        Slice::from_slice(self.iter.as_slice())
297
    }
298
}
299
300
impl<K, V> Iterator for Drain<'_, K, V> {
301
    type Item = (K, V);
302
303
    iterator_methods!(Bucket::key_value);
304
}
305
306
impl<K, V> DoubleEndedIterator for Drain<'_, K, V> {
307
    double_ended_iterator_methods!(Bucket::key_value);
308
}
309
310
impl<K, V> ExactSizeIterator for Drain<'_, K, V> {
311
    fn len(&self) -> usize {
312
        self.iter.len()
313
    }
314
}
315
316
impl<K, V> FusedIterator for Drain<'_, K, V> {}
317
318
impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Drain<'_, K, V> {
319
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
320
        let iter = self.iter.as_slice().iter().map(Bucket::refs);
321
        f.debug_list().entries(iter).finish()
322
    }
323
}
324
325
/// An iterator over the keys of an [`IndexMap`].
326
///
327
/// This `struct` is created by the [`IndexMap::keys`] method.
328
/// See its documentation for more.
329
pub struct Keys<'a, K, V> {
330
    iter: slice::Iter<'a, Bucket<K, V>>,
331
}
332
333
impl<'a, K, V> Keys<'a, K, V> {
334
    pub(super) fn new(entries: &'a [Bucket<K, V>]) -> Self {
335
        Self {
336
            iter: entries.iter(),
337
        }
338
    }
339
}
340
341
impl<'a, K, V> Iterator for Keys<'a, K, V> {
342
    type Item = &'a K;
343
344
    iterator_methods!(Bucket::key_ref);
345
}
346
347
impl<K, V> DoubleEndedIterator for Keys<'_, K, V> {
348
    double_ended_iterator_methods!(Bucket::key_ref);
349
}
350
351
impl<K, V> ExactSizeIterator for Keys<'_, K, V> {
352
    fn len(&self) -> usize {
353
        self.iter.len()
354
    }
355
}
356
357
impl<K, V> FusedIterator for Keys<'_, K, V> {}
358
359
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
360
impl<K, V> Clone for Keys<'_, K, V> {
361
    fn clone(&self) -> Self {
362
        Keys {
363
            iter: self.iter.clone(),
364
        }
365
    }
366
}
367
368
impl<K: fmt::Debug, V> fmt::Debug for Keys<'_, K, V> {
369
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
370
        f.debug_list().entries(self.clone()).finish()
371
    }
372
}
373
374
impl<K, V> Default for Keys<'_, K, V> {
375
    fn default() -> Self {
376
        Self { iter: [].iter() }
377
    }
378
}
379
380
/// Access [`IndexMap`] keys at indexed positions.
381
///
382
/// While [`Index<usize> for IndexMap`][values] accesses a map's values,
383
/// indexing through [`IndexMap::keys`] offers an alternative to access a map's
384
/// keys instead.
385
///
386
/// [values]: IndexMap#impl-Index<usize>-for-IndexMap<K,+V,+S>
387
///
388
/// Since `Keys` is also an iterator, consuming items from the iterator will
389
/// offset the effective indices. Similarly, if `Keys` is obtained from
390
/// [`Slice::keys`], indices will be interpreted relative to the position of
391
/// that slice.
392
///
393
/// # Examples
394
///
395
/// ```
396
/// use indexmap::IndexMap;
397
///
398
/// let mut map = IndexMap::new();
399
/// for word in "Lorem ipsum dolor sit amet".split_whitespace() {
400
///     map.insert(word.to_lowercase(), word.to_uppercase());
401
/// }
402
///
403
/// assert_eq!(map[0], "LOREM");
404
/// assert_eq!(map.keys()[0], "lorem");
405
/// assert_eq!(map[1], "IPSUM");
406
/// assert_eq!(map.keys()[1], "ipsum");
407
///
408
/// map.reverse();
409
/// assert_eq!(map.keys()[0], "amet");
410
/// assert_eq!(map.keys()[1], "sit");
411
///
412
/// map.sort_keys();
413
/// assert_eq!(map.keys()[0], "amet");
414
/// assert_eq!(map.keys()[1], "dolor");
415
///
416
/// // Advancing the iterator will offset the indexing
417
/// let mut keys = map.keys();
418
/// assert_eq!(keys[0], "amet");
419
/// assert_eq!(keys.next().map(|s| &**s), Some("amet"));
420
/// assert_eq!(keys[0], "dolor");
421
/// assert_eq!(keys[1], "ipsum");
422
///
423
/// // Slices may have an offset as well
424
/// let slice = &map[2..];
425
/// assert_eq!(slice[0], "IPSUM");
426
/// assert_eq!(slice.keys()[0], "ipsum");
427
/// ```
428
///
429
/// ```should_panic
430
/// use indexmap::IndexMap;
431
///
432
/// let mut map = IndexMap::new();
433
/// map.insert("foo", 1);
434
/// println!("{:?}", map.keys()[10]); // panics!
435
/// ```
436
impl<K, V> Index<usize> for Keys<'_, K, V> {
437
    type Output = K;
438
439
    /// Returns a reference to the key at the supplied `index`.
440
    ///
441
    /// ***Panics*** if `index` is out of bounds.
442
    fn index(&self, index: usize) -> &K {
443
        &self.iter.as_slice()[index].key
444
    }
445
}
446
447
/// An owning iterator over the keys of an [`IndexMap`].
448
///
449
/// This `struct` is created by the [`IndexMap::into_keys`] method.
450
/// See its documentation for more.
451
pub struct IntoKeys<K, V> {
452
    // We eagerly drop the values during construction so we can ignore them in
453
    // `Clone`, but we keep uninit values so the bucket's size and alignment
454
    // remain the same, and therefore the `Vec` conversion should be in-place.
455
    iter: vec::IntoIter<Bucket<K, MaybeUninit<V>>>,
456
}
457
458
impl<K, V> IntoKeys<K, V> {
459
    pub(super) fn new(entries: Vec<Bucket<K, V>>) -> Self {
460
        // The original values will be dropped here.
461
        // The hash doesn't matter, but "copying" it in-place is free.
462
        let entries = entries
463
            .into_iter()
464
            .map(|Bucket { hash, key, .. }| Bucket {
465
                hash,
466
                key,
467
                value: MaybeUninit::uninit(),
468
            })
469
            .collect::<Vec<_>>();
470
        Self {
471
            iter: entries.into_iter(),
472
        }
473
    }
474
}
475
476
impl<K: Clone, V> Clone for IntoKeys<K, V> {
477
    fn clone(&self) -> Self {
478
        let entries = self
479
            .iter
480
            .as_slice()
481
            .iter()
482
            .map(|Bucket { key, .. }| Bucket {
483
                hash: HashValue(0),
484
                key: key.clone(),
485
                value: MaybeUninit::uninit(),
486
            })
487
            .collect::<Vec<_>>();
488
        Self {
489
            iter: entries.into_iter(),
490
        }
491
    }
492
}
493
494
impl<K, V> Iterator for IntoKeys<K, V> {
495
    type Item = K;
496
497
    iterator_methods!(Bucket::key);
498
}
499
500
impl<K, V> DoubleEndedIterator for IntoKeys<K, V> {
501
    double_ended_iterator_methods!(Bucket::key);
502
}
503
504
impl<K, V> ExactSizeIterator for IntoKeys<K, V> {
505
    fn len(&self) -> usize {
506
        self.iter.len()
507
    }
508
}
509
510
impl<K, V> FusedIterator for IntoKeys<K, V> {}
511
512
impl<K: fmt::Debug, V> fmt::Debug for IntoKeys<K, V> {
513
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
514
        let iter = self.iter.as_slice().iter().map(Bucket::key_ref);
515
        f.debug_list().entries(iter).finish()
516
    }
517
}
518
519
impl<K, V> Default for IntoKeys<K, V> {
520
    fn default() -> Self {
521
        Self {
522
            iter: Vec::new().into_iter(),
523
        }
524
    }
525
}
526
527
/// An iterator over the values of an [`IndexMap`].
528
///
529
/// This `struct` is created by the [`IndexMap::values`] method.
530
/// See its documentation for more.
531
pub struct Values<'a, K, V> {
532
    iter: slice::Iter<'a, Bucket<K, V>>,
533
}
534
535
impl<'a, K, V> Values<'a, K, V> {
536
    pub(super) fn new(entries: &'a [Bucket<K, V>]) -> Self {
537
        Self {
538
            iter: entries.iter(),
539
        }
540
    }
541
}
542
543
impl<'a, K, V> Iterator for Values<'a, K, V> {
544
    type Item = &'a V;
545
546
    iterator_methods!(Bucket::value_ref);
547
}
548
549
impl<K, V> DoubleEndedIterator for Values<'_, K, V> {
550
    double_ended_iterator_methods!(Bucket::value_ref);
551
}
552
553
impl<K, V> ExactSizeIterator for Values<'_, K, V> {
554
    fn len(&self) -> usize {
555
        self.iter.len()
556
    }
557
}
558
559
impl<K, V> FusedIterator for Values<'_, K, V> {}
560
561
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
562
impl<K, V> Clone for Values<'_, K, V> {
563
    fn clone(&self) -> Self {
564
        Values {
565
            iter: self.iter.clone(),
566
        }
567
    }
568
}
569
570
impl<K, V: fmt::Debug> fmt::Debug for Values<'_, K, V> {
571
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
572
        f.debug_list().entries(self.clone()).finish()
573
    }
574
}
575
576
impl<K, V> Default for Values<'_, K, V> {
577
    fn default() -> Self {
578
        Self { iter: [].iter() }
579
    }
580
}
581
582
/// A mutable iterator over the values of an [`IndexMap`].
583
///
584
/// This `struct` is created by the [`IndexMap::values_mut`] method.
585
/// See its documentation for more.
586
pub struct ValuesMut<'a, K, V> {
587
    iter: slice::IterMut<'a, Bucket<K, V>>,
588
}
589
590
impl<'a, K, V> ValuesMut<'a, K, V> {
591
    pub(super) fn new(entries: &'a mut [Bucket<K, V>]) -> Self {
592
        Self {
593
            iter: entries.iter_mut(),
594
        }
595
    }
596
}
597
598
impl<'a, K, V> Iterator for ValuesMut<'a, K, V> {
599
    type Item = &'a mut V;
600
601
    iterator_methods!(Bucket::value_mut);
602
}
603
604
impl<K, V> DoubleEndedIterator for ValuesMut<'_, K, V> {
605
    double_ended_iterator_methods!(Bucket::value_mut);
606
}
607
608
impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> {
609
    fn len(&self) -> usize {
610
        self.iter.len()
611
    }
612
}
613
614
impl<K, V> FusedIterator for ValuesMut<'_, K, V> {}
615
616
impl<K, V: fmt::Debug> fmt::Debug for ValuesMut<'_, K, V> {
617
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
618
        let iter = self.iter.as_slice().iter().map(Bucket::value_ref);
619
        f.debug_list().entries(iter).finish()
620
    }
621
}
622
623
impl<K, V> Default for ValuesMut<'_, K, V> {
624
    fn default() -> Self {
625
        Self {
626
            iter: [].iter_mut(),
627
        }
628
    }
629
}
630
631
/// An owning iterator over the values of an [`IndexMap`].
632
///
633
/// This `struct` is created by the [`IndexMap::into_values`] method.
634
/// See its documentation for more.
635
pub struct IntoValues<K, V> {
636
    // We eagerly drop the keys during construction so we can ignore them in
637
    // `Clone`, but we keep uninit keys so the bucket's size and alignment
638
    // remain the same, and therefore the `Vec` conversion should be in-place.
639
    iter: vec::IntoIter<Bucket<MaybeUninit<K>, V>>,
640
}
641
642
impl<K, V> IntoValues<K, V> {
643
    pub(super) fn new(entries: Vec<Bucket<K, V>>) -> Self {
644
        // The original keys will be dropped here.
645
        // The hash doesn't matter, but "copying" it in-place is free.
646
        let entries = entries
647
            .into_iter()
648
            .map(|Bucket { hash, value, .. }| Bucket {
649
                hash,
650
                key: MaybeUninit::uninit(),
651
                value,
652
            })
653
            .collect::<Vec<_>>();
654
        Self {
655
            iter: entries.into_iter(),
656
        }
657
    }
658
}
659
660
impl<K, V: Clone> Clone for IntoValues<K, V> {
661
    fn clone(&self) -> Self {
662
        let entries = self
663
            .iter
664
            .as_slice()
665
            .iter()
666
            .map(|Bucket { value, .. }| Bucket {
667
                hash: HashValue(0),
668
                key: MaybeUninit::uninit(),
669
                value: value.clone(),
670
            })
671
            .collect::<Vec<_>>();
672
        Self {
673
            iter: entries.into_iter(),
674
        }
675
    }
676
}
677
678
impl<K, V> Iterator for IntoValues<K, V> {
679
    type Item = V;
680
681
    iterator_methods!(Bucket::value);
682
}
683
684
impl<K, V> DoubleEndedIterator for IntoValues<K, V> {
685
    double_ended_iterator_methods!(Bucket::value);
686
}
687
688
impl<K, V> ExactSizeIterator for IntoValues<K, V> {
689
    fn len(&self) -> usize {
690
        self.iter.len()
691
    }
692
}
693
694
impl<K, V> FusedIterator for IntoValues<K, V> {}
695
696
impl<K, V: fmt::Debug> fmt::Debug for IntoValues<K, V> {
697
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
698
        let iter = self.iter.as_slice().iter().map(Bucket::value_ref);
699
        f.debug_list().entries(iter).finish()
700
    }
701
}
702
703
impl<K, V> Default for IntoValues<K, V> {
704
    fn default() -> Self {
705
        Self {
706
            iter: Vec::new().into_iter(),
707
        }
708
    }
709
}
710
711
/// A splicing iterator for `IndexMap`.
712
///
713
/// This `struct` is created by [`IndexMap::splice()`].
714
/// See its documentation for more.
715
pub struct Splice<'a, I, K, V, S>
716
where
717
    I: Iterator<Item = (K, V)>,
718
    K: Hash + Eq,
719
    S: BuildHasher,
720
{
721
    map: &'a mut IndexMap<K, V, S>,
722
    tail: Core<K, V>,
723
    drain: vec::IntoIter<Bucket<K, V>>,
724
    replace_with: I,
725
}
726
727
impl<'a, I, K, V, S> Splice<'a, I, K, V, S>
728
where
729
    I: Iterator<Item = (K, V)>,
730
    K: Hash + Eq,
731
    S: BuildHasher,
732
{
733
    #[track_caller]
734
    pub(super) fn new<R>(map: &'a mut IndexMap<K, V, S>, range: R, replace_with: I) -> Self
735
    where
736
        R: RangeBounds<usize>,
737
    {
738
        let (tail, drain) = map.core.split_splice(range);
739
        Self {
740
            map,
741
            tail,
742
            drain,
743
            replace_with,
744
        }
745
    }
746
}
747
748
impl<I, K, V, S> Drop for Splice<'_, I, K, V, S>
749
where
750
    I: Iterator<Item = (K, V)>,
751
    K: Hash + Eq,
752
    S: BuildHasher,
753
{
754
    fn drop(&mut self) {
755
        // Finish draining unconsumed items. We don't strictly *have* to do this
756
        // manually, since we already split it into separate memory, but it will
757
        // match the drop order of `vec::Splice` items this way.
758
        let _ = self.drain.nth(usize::MAX);
759
760
        // Now insert all the new items. If a key matches an existing entry, it
761
        // keeps the original position and only replaces the value, like `insert`.
762
        while let Some((key, value)) = self.replace_with.next() {
763
            // Since the tail is disjoint, we can try to update it first,
764
            // or else insert (update or append) the primary map.
765
            let hash = self.map.hash(&key);
766
            if let Some(i) = self.tail.get_index_of(hash, &key) {
767
                self.tail.as_entries_mut()[i].value = value;
768
            } else {
769
                self.map.core.insert_full(hash, key, value);
770
            }
771
        }
772
773
        // Finally, re-append the tail
774
        self.map.core.append_unchecked(&mut self.tail);
775
    }
776
}
777
778
impl<I, K, V, S> Iterator for Splice<'_, I, K, V, S>
779
where
780
    I: Iterator<Item = (K, V)>,
781
    K: Hash + Eq,
782
    S: BuildHasher,
783
{
784
    type Item = (K, V);
785
786
    fn next(&mut self) -> Option<Self::Item> {
787
        self.drain.next().map(Bucket::key_value)
788
    }
789
790
    fn size_hint(&self) -> (usize, Option<usize>) {
791
        self.drain.size_hint()
792
    }
793
}
794
795
impl<I, K, V, S> DoubleEndedIterator for Splice<'_, I, K, V, S>
796
where
797
    I: Iterator<Item = (K, V)>,
798
    K: Hash + Eq,
799
    S: BuildHasher,
800
{
801
    fn next_back(&mut self) -> Option<Self::Item> {
802
        self.drain.next_back().map(Bucket::key_value)
803
    }
804
}
805
806
impl<I, K, V, S> ExactSizeIterator for Splice<'_, I, K, V, S>
807
where
808
    I: Iterator<Item = (K, V)>,
809
    K: Hash + Eq,
810
    S: BuildHasher,
811
{
812
    fn len(&self) -> usize {
813
        self.drain.len()
814
    }
815
}
816
817
impl<I, K, V, S> FusedIterator for Splice<'_, I, K, V, S>
818
where
819
    I: Iterator<Item = (K, V)>,
820
    K: Hash + Eq,
821
    S: BuildHasher,
822
{
823
}
824
825
impl<I, K, V, S> fmt::Debug for Splice<'_, I, K, V, S>
826
where
827
    I: fmt::Debug + Iterator<Item = (K, V)>,
828
    K: fmt::Debug + Hash + Eq,
829
    V: fmt::Debug,
830
    S: BuildHasher,
831
{
832
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
833
        // Follow `vec::Splice` in only printing the drain and replacement
834
        f.debug_struct("Splice")
835
            .field("drain", &self.drain)
836
            .field("replace_with", &self.replace_with)
837
            .finish()
838
    }
839
}
840
841
/// An extracting iterator for `IndexMap`.
842
///
843
/// This `struct` is created by [`IndexMap::extract_if()`].
844
/// See its documentation for more.
845
pub struct ExtractIf<'a, K, V, F> {
846
    inner: ExtractCore<'a, K, V>,
847
    pred: F,
848
}
849
850
impl<K, V, F> ExtractIf<'_, K, V, F> {
851
    #[track_caller]
852
    pub(super) fn new<R>(core: &mut Core<K, V>, range: R, pred: F) -> ExtractIf<'_, K, V, F>
853
    where
854
        R: RangeBounds<usize>,
855
        F: FnMut(&K, &mut V) -> bool,
856
    {
857
        ExtractIf {
858
            inner: core.extract(range),
859
            pred,
860
        }
861
    }
862
}
863
864
impl<K, V, F> Iterator for ExtractIf<'_, K, V, F>
865
where
866
    F: FnMut(&K, &mut V) -> bool,
867
{
868
    type Item = (K, V);
869
870
    fn next(&mut self) -> Option<Self::Item> {
871
        self.inner
872
            .extract_if(|bucket| {
873
                let (key, value) = bucket.ref_mut();
874
                (self.pred)(key, value)
875
            })
876
            .map(Bucket::key_value)
877
    }
878
879
    fn size_hint(&self) -> (usize, Option<usize>) {
880
        (0, Some(self.inner.remaining()))
881
    }
882
}
883
884
impl<K, V, F> FusedIterator for ExtractIf<'_, K, V, F> where F: FnMut(&K, &mut V) -> bool {}
885
886
impl<K, V, F> fmt::Debug for ExtractIf<'_, K, V, F>
887
where
888
    K: fmt::Debug,
889
    V: fmt::Debug,
890
{
891
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
892
        f.debug_struct("ExtractIf").finish_non_exhaustive()
893
    }
894
}