1use alloc::vec::{self, Vec};
2use core::{
3 fmt,
4 hash::{BuildHasher, Hash},
5 iter::FusedIterator,
6 mem::MaybeUninit,
7 ops::{Index, RangeBounds},
8 slice,
9};
10
11use super::{Bucket, HashValue, IndexMap, Slice};
12use crate::inner::{Core, ExtractCore};
13
14impl<'a, K, V, S> IntoIterator for &'a IndexMap<K, V, S> {
15 type Item = (&'a K, &'a V);
16 type IntoIter = Iter<'a, K, V>;
17
18 fn into_iter(self) -> Self::IntoIter {
19 self.iter()
20 }
21}
22
23impl<'a, K, V, S> IntoIterator for &'a mut IndexMap<K, V, S> {
24 type Item = (&'a K, &'a mut V);
25 type IntoIter = IterMut<'a, K, V>;
26
27 fn into_iter(self) -> Self::IntoIter {
28 self.iter_mut()
29 }
30}
31
32impl<K, V, S> IntoIterator for IndexMap<K, V, S> {
33 type Item = (K, V);
34 type IntoIter = IntoIter<K, V>;
35
36 fn into_iter(self) -> Self::IntoIter {
37 IntoIter::new(self.into_entries())
38 }
39}
40
41pub struct Iter<'a, K, V> {
46 iter: slice::Iter<'a, Bucket<K, V>>,
47}
48
49impl<'a, K, V> Iter<'a, K, V> {
50 pub(super) fn new(entries: &'a [Bucket<K, V>]) -> Self {
51 Self {
52 iter: entries.iter(),
53 }
54 }
55
56 pub fn as_slice(&self) -> &'a Slice<K, V> {
58 Slice::from_slice(self.iter.as_slice())
59 }
60}
61
62impl<'a, K, V> Iterator for Iter<'a, K, V> {
63 type Item = (&'a K, &'a V);
64
65 iterator_methods!(Bucket::refs);
66}
67
68impl<K, V> DoubleEndedIterator for Iter<'_, K, V> {
69 double_ended_iterator_methods!(Bucket::refs);
70}
71
72impl<K, V> ExactSizeIterator for Iter<'_, K, V> {
73 fn len(&self) -> usize {
74 self.iter.len()
75 }
76}
77
78impl<K, V> FusedIterator for Iter<'_, K, V> {}
79
80impl<K, V> Clone for Iter<'_, K, V> {
82 fn clone(&self) -> Self {
83 Iter {
84 iter: self.iter.clone(),
85 }
86 }
87}
88
89impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Iter<'_, K, V> {
90 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
91 f.debug_list().entries(self.clone()).finish()
92 }
93}
94
95impl<K, V> Default for Iter<'_, K, V> {
96 fn default() -> Self {
97 Self {
98 iter: [].iter(),
99 }
100 }
101}
102
103pub struct IterMut<'a, K, V> {
108 iter: slice::IterMut<'a, Bucket<K, V>>,
109}
110
111impl<'a, K, V> IterMut<'a, K, V> {
112 pub(super) fn new(entries: &'a mut [Bucket<K, V>]) -> Self {
113 Self {
114 iter: entries.iter_mut(),
115 }
116 }
117
118 pub fn as_slice(&self) -> &Slice<K, V> {
120 Slice::from_slice(self.iter.as_slice())
121 }
122
123 pub fn into_slice(self) -> &'a mut Slice<K, V> {
127 Slice::from_mut_slice(self.iter.into_slice())
128 }
129}
130
131impl<'a, K, V> Iterator for IterMut<'a, K, V> {
132 type Item = (&'a K, &'a mut V);
133
134 iterator_methods!(Bucket::ref_mut);
135}
136
137impl<K, V> DoubleEndedIterator for IterMut<'_, K, V> {
138 double_ended_iterator_methods!(Bucket::ref_mut);
139}
140
141impl<K, V> ExactSizeIterator for IterMut<'_, K, V> {
142 fn len(&self) -> usize {
143 self.iter.len()
144 }
145}
146
147impl<K, V> FusedIterator for IterMut<'_, K, V> {}
148
149impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IterMut<'_, K, V> {
150 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
151 let iter = self.iter.as_slice().iter().map(Bucket::refs);
152 f.debug_list().entries(iter).finish()
153 }
154}
155
156impl<K, V> Default for IterMut<'_, K, V> {
157 fn default() -> Self {
158 Self {
159 iter: [].iter_mut(),
160 }
161 }
162}
163
164pub struct IterMut2<'a, K, V> {
169 iter: slice::IterMut<'a, Bucket<K, V>>,
170}
171
172impl<'a, K, V> IterMut2<'a, K, V> {
173 pub(super) fn new(entries: &'a mut [Bucket<K, V>]) -> Self {
174 Self {
175 iter: entries.iter_mut(),
176 }
177 }
178
179 pub fn as_slice(&self) -> &Slice<K, V> {
181 Slice::from_slice(self.iter.as_slice())
182 }
183
184 pub fn into_slice(self) -> &'a mut Slice<K, V> {
188 Slice::from_mut_slice(self.iter.into_slice())
189 }
190}
191
192impl<'a, K, V> Iterator for IterMut2<'a, K, V> {
193 type Item = (&'a mut K, &'a mut V);
194
195 iterator_methods!(Bucket::muts);
196}
197
198impl<K, V> DoubleEndedIterator for IterMut2<'_, K, V> {
199 double_ended_iterator_methods!(Bucket::muts);
200}
201
202impl<K, V> ExactSizeIterator for IterMut2<'_, K, V> {
203 fn len(&self) -> usize {
204 self.iter.len()
205 }
206}
207
208impl<K, V> FusedIterator for IterMut2<'_, K, V> {}
209
210impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IterMut2<'_, K, V> {
211 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
212 let iter = self.iter.as_slice().iter().map(Bucket::refs);
213 f.debug_list().entries(iter).finish()
214 }
215}
216
217impl<K, V> Default for IterMut2<'_, K, V> {
218 fn default() -> Self {
219 Self {
220 iter: [].iter_mut(),
221 }
222 }
223}
224
225#[derive(Clone)]
230pub struct IntoIter<K, V> {
231 iter: vec::IntoIter<Bucket<K, V>>,
232}
233
234impl<K, V> IntoIter<K, V> {
235 pub(super) fn new(entries: Vec<Bucket<K, V>>) -> Self {
236 Self {
237 iter: entries.into_iter(),
238 }
239 }
240
241 pub fn as_slice(&self) -> &Slice<K, V> {
243 Slice::from_slice(self.iter.as_slice())
244 }
245
246 pub fn as_mut_slice(&mut self) -> &mut Slice<K, V> {
248 Slice::from_mut_slice(self.iter.as_mut_slice())
249 }
250}
251
252impl<K, V> Iterator for IntoIter<K, V> {
253 type Item = (K, V);
254
255 iterator_methods!(Bucket::key_value);
256}
257
258impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
259 double_ended_iterator_methods!(Bucket::key_value);
260}
261
262impl<K, V> ExactSizeIterator for IntoIter<K, V> {
263 fn len(&self) -> usize {
264 self.iter.len()
265 }
266}
267
268impl<K, V> FusedIterator for IntoIter<K, V> {}
269
270impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IntoIter<K, V> {
271 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
272 let iter = self.iter.as_slice().iter().map(Bucket::refs);
273 f.debug_list().entries(iter).finish()
274 }
275}
276
277impl<K, V> Default for IntoIter<K, V> {
278 fn default() -> Self {
279 Self {
280 iter: Vec::new().into_iter(),
281 }
282 }
283}
284
285pub struct Drain<'a, K, V> {
290 iter: vec::Drain<'a, Bucket<K, V>>,
291}
292
293impl<'a, K, V> Drain<'a, K, V> {
294 pub(super) fn new(iter: vec::Drain<'a, Bucket<K, V>>) -> Self {
295 Self {
296 iter,
297 }
298 }
299
300 pub fn as_slice(&self) -> &Slice<K, V> {
302 Slice::from_slice(self.iter.as_slice())
303 }
304}
305
306impl<K, V> Iterator for Drain<'_, K, V> {
307 type Item = (K, V);
308
309 iterator_methods!(Bucket::key_value);
310}
311
312impl<K, V> DoubleEndedIterator for Drain<'_, K, V> {
313 double_ended_iterator_methods!(Bucket::key_value);
314}
315
316impl<K, V> ExactSizeIterator for Drain<'_, K, V> {
317 fn len(&self) -> usize {
318 self.iter.len()
319 }
320}
321
322impl<K, V> FusedIterator for Drain<'_, K, V> {}
323
324impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Drain<'_, K, V> {
325 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
326 let iter = self.iter.as_slice().iter().map(Bucket::refs);
327 f.debug_list().entries(iter).finish()
328 }
329}
330
331pub struct Keys<'a, K, V> {
336 iter: slice::Iter<'a, Bucket<K, V>>,
337}
338
339impl<'a, K, V> Keys<'a, K, V> {
340 pub(super) fn new(entries: &'a [Bucket<K, V>]) -> Self {
341 Self {
342 iter: entries.iter(),
343 }
344 }
345}
346
347impl<'a, K, V> Iterator for Keys<'a, K, V> {
348 type Item = &'a K;
349
350 iterator_methods!(Bucket::key_ref);
351}
352
353impl<K, V> DoubleEndedIterator for Keys<'_, K, V> {
354 double_ended_iterator_methods!(Bucket::key_ref);
355}
356
357impl<K, V> ExactSizeIterator for Keys<'_, K, V> {
358 fn len(&self) -> usize {
359 self.iter.len()
360 }
361}
362
363impl<K, V> FusedIterator for Keys<'_, K, V> {}
364
365impl<K, V> Clone for Keys<'_, K, V> {
367 fn clone(&self) -> Self {
368 Keys {
369 iter: self.iter.clone(),
370 }
371 }
372}
373
374impl<K: fmt::Debug, V> fmt::Debug for Keys<'_, K, V> {
375 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
376 f.debug_list().entries(self.clone()).finish()
377 }
378}
379
380impl<K, V> Default for Keys<'_, K, V> {
381 fn default() -> Self {
382 Self {
383 iter: [].iter(),
384 }
385 }
386}
387
388impl<K, V> Index<usize> for Keys<'_, K, V> {
445 type Output = K;
446
447 fn index(&self, index: usize) -> &K {
451 &self.iter.as_slice()[index].key
452 }
453}
454
455pub struct IntoKeys<K, V> {
460 iter: vec::IntoIter<Bucket<K, MaybeUninit<V>>>,
464}
465
466impl<K, V> IntoKeys<K, V> {
467 pub(super) fn new(entries: Vec<Bucket<K, V>>) -> Self {
468 let entries = entries
471 .into_iter()
472 .map(
473 |Bucket {
474 hash,
475 key,
476 ..
477 }| Bucket {
478 hash,
479 key,
480 value: MaybeUninit::uninit(),
481 },
482 )
483 .collect::<Vec<_>>();
484 Self {
485 iter: entries.into_iter(),
486 }
487 }
488}
489
490impl<K: Clone, V> Clone for IntoKeys<K, V> {
491 fn clone(&self) -> Self {
492 let entries = self
493 .iter
494 .as_slice()
495 .iter()
496 .map(
497 |Bucket {
498 key, ..
499 }| Bucket {
500 hash: HashValue(0),
501 key: key.clone(),
502 value: MaybeUninit::uninit(),
503 },
504 )
505 .collect::<Vec<_>>();
506 Self {
507 iter: entries.into_iter(),
508 }
509 }
510}
511
512impl<K, V> Iterator for IntoKeys<K, V> {
513 type Item = K;
514
515 iterator_methods!(Bucket::key);
516}
517
518impl<K, V> DoubleEndedIterator for IntoKeys<K, V> {
519 double_ended_iterator_methods!(Bucket::key);
520}
521
522impl<K, V> ExactSizeIterator for IntoKeys<K, V> {
523 fn len(&self) -> usize {
524 self.iter.len()
525 }
526}
527
528impl<K, V> FusedIterator for IntoKeys<K, V> {}
529
530impl<K: fmt::Debug, V> fmt::Debug for IntoKeys<K, V> {
531 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
532 let iter = self.iter.as_slice().iter().map(Bucket::key_ref);
533 f.debug_list().entries(iter).finish()
534 }
535}
536
537impl<K, V> Default for IntoKeys<K, V> {
538 fn default() -> Self {
539 Self {
540 iter: Vec::new().into_iter(),
541 }
542 }
543}
544
545pub struct Values<'a, K, V> {
550 iter: slice::Iter<'a, Bucket<K, V>>,
551}
552
553impl<'a, K, V> Values<'a, K, V> {
554 pub(super) fn new(entries: &'a [Bucket<K, V>]) -> Self {
555 Self {
556 iter: entries.iter(),
557 }
558 }
559}
560
561impl<'a, K, V> Iterator for Values<'a, K, V> {
562 type Item = &'a V;
563
564 iterator_methods!(Bucket::value_ref);
565}
566
567impl<K, V> DoubleEndedIterator for Values<'_, K, V> {
568 double_ended_iterator_methods!(Bucket::value_ref);
569}
570
571impl<K, V> ExactSizeIterator for Values<'_, K, V> {
572 fn len(&self) -> usize {
573 self.iter.len()
574 }
575}
576
577impl<K, V> FusedIterator for Values<'_, K, V> {}
578
579impl<K, V> Clone for Values<'_, K, V> {
581 fn clone(&self) -> Self {
582 Values {
583 iter: self.iter.clone(),
584 }
585 }
586}
587
588impl<K, V: fmt::Debug> fmt::Debug for Values<'_, K, V> {
589 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
590 f.debug_list().entries(self.clone()).finish()
591 }
592}
593
594impl<K, V> Default for Values<'_, K, V> {
595 fn default() -> Self {
596 Self {
597 iter: [].iter(),
598 }
599 }
600}
601
602pub struct ValuesMut<'a, K, V> {
607 iter: slice::IterMut<'a, Bucket<K, V>>,
608}
609
610impl<'a, K, V> ValuesMut<'a, K, V> {
611 pub(super) fn new(entries: &'a mut [Bucket<K, V>]) -> Self {
612 Self {
613 iter: entries.iter_mut(),
614 }
615 }
616}
617
618impl<'a, K, V> Iterator for ValuesMut<'a, K, V> {
619 type Item = &'a mut V;
620
621 iterator_methods!(Bucket::value_mut);
622}
623
624impl<K, V> DoubleEndedIterator for ValuesMut<'_, K, V> {
625 double_ended_iterator_methods!(Bucket::value_mut);
626}
627
628impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> {
629 fn len(&self) -> usize {
630 self.iter.len()
631 }
632}
633
634impl<K, V> FusedIterator for ValuesMut<'_, K, V> {}
635
636impl<K, V: fmt::Debug> fmt::Debug for ValuesMut<'_, K, V> {
637 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
638 let iter = self.iter.as_slice().iter().map(Bucket::value_ref);
639 f.debug_list().entries(iter).finish()
640 }
641}
642
643impl<K, V> Default for ValuesMut<'_, K, V> {
644 fn default() -> Self {
645 Self {
646 iter: [].iter_mut(),
647 }
648 }
649}
650
651pub struct IntoValues<K, V> {
656 iter: vec::IntoIter<Bucket<MaybeUninit<K>, V>>,
660}
661
662impl<K, V> IntoValues<K, V> {
663 pub(super) fn new(entries: Vec<Bucket<K, V>>) -> Self {
664 let entries = entries
667 .into_iter()
668 .map(
669 |Bucket {
670 hash,
671 value,
672 ..
673 }| Bucket {
674 hash,
675 key: MaybeUninit::uninit(),
676 value,
677 },
678 )
679 .collect::<Vec<_>>();
680 Self {
681 iter: entries.into_iter(),
682 }
683 }
684}
685
686impl<K, V: Clone> Clone for IntoValues<K, V> {
687 fn clone(&self) -> Self {
688 let entries = self
689 .iter
690 .as_slice()
691 .iter()
692 .map(
693 |Bucket {
694 value, ..
695 }| Bucket {
696 hash: HashValue(0),
697 key: MaybeUninit::uninit(),
698 value: value.clone(),
699 },
700 )
701 .collect::<Vec<_>>();
702 Self {
703 iter: entries.into_iter(),
704 }
705 }
706}
707
708impl<K, V> Iterator for IntoValues<K, V> {
709 type Item = V;
710
711 iterator_methods!(Bucket::value);
712}
713
714impl<K, V> DoubleEndedIterator for IntoValues<K, V> {
715 double_ended_iterator_methods!(Bucket::value);
716}
717
718impl<K, V> ExactSizeIterator for IntoValues<K, V> {
719 fn len(&self) -> usize {
720 self.iter.len()
721 }
722}
723
724impl<K, V> FusedIterator for IntoValues<K, V> {}
725
726impl<K, V: fmt::Debug> fmt::Debug for IntoValues<K, V> {
727 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
728 let iter = self.iter.as_slice().iter().map(Bucket::value_ref);
729 f.debug_list().entries(iter).finish()
730 }
731}
732
733impl<K, V> Default for IntoValues<K, V> {
734 fn default() -> Self {
735 Self {
736 iter: Vec::new().into_iter(),
737 }
738 }
739}
740
741pub struct Splice<'a, I, K, V, S>
746where
747 I: Iterator<Item = (K, V)>,
748 K: Hash + Eq,
749 S: BuildHasher,
750{
751 map: &'a mut IndexMap<K, V, S>,
752 tail: Core<K, V>,
753 drain: vec::IntoIter<Bucket<K, V>>,
754 replace_with: I,
755}
756
757impl<'a, I, K, V, S> Splice<'a, I, K, V, S>
758where
759 I: Iterator<Item = (K, V)>,
760 K: Hash + Eq,
761 S: BuildHasher,
762{
763 #[track_caller]
764 pub(super) fn new<R>(map: &'a mut IndexMap<K, V, S>, range: R, replace_with: I) -> Self
765 where
766 R: RangeBounds<usize>,
767 {
768 let (tail, drain) = map.core.split_splice(range);
769 Self {
770 map,
771 tail,
772 drain,
773 replace_with,
774 }
775 }
776}
777
778impl<I, K, V, S> Drop for Splice<'_, I, K, V, S>
779where
780 I: Iterator<Item = (K, V)>,
781 K: Hash + Eq,
782 S: BuildHasher,
783{
784 fn drop(&mut self) {
785 let _ = self.drain.nth(usize::MAX);
789
790 while let Some((key, value)) = self.replace_with.next() {
793 let hash = self.map.hash(&key);
796 if let Some(i) = self.tail.get_index_of(hash, &key) {
797 self.tail.as_entries_mut()[i].value = value;
798 } else {
799 self.map.core.insert_full(hash, key, value);
800 }
801 }
802
803 self.map.core.append_unchecked(&mut self.tail);
805 }
806}
807
808impl<I, K, V, S> Iterator for Splice<'_, I, K, V, S>
809where
810 I: Iterator<Item = (K, V)>,
811 K: Hash + Eq,
812 S: BuildHasher,
813{
814 type Item = (K, V);
815
816 fn next(&mut self) -> Option<Self::Item> {
817 self.drain.next().map(Bucket::key_value)
818 }
819
820 fn size_hint(&self) -> (usize, Option<usize>) {
821 self.drain.size_hint()
822 }
823}
824
825impl<I, K, V, S> DoubleEndedIterator for Splice<'_, I, K, V, S>
826where
827 I: Iterator<Item = (K, V)>,
828 K: Hash + Eq,
829 S: BuildHasher,
830{
831 fn next_back(&mut self) -> Option<Self::Item> {
832 self.drain.next_back().map(Bucket::key_value)
833 }
834}
835
836impl<I, K, V, S> ExactSizeIterator for Splice<'_, I, K, V, S>
837where
838 I: Iterator<Item = (K, V)>,
839 K: Hash + Eq,
840 S: BuildHasher,
841{
842 fn len(&self) -> usize {
843 self.drain.len()
844 }
845}
846
847impl<I, K, V, S> FusedIterator for Splice<'_, I, K, V, S>
848where
849 I: Iterator<Item = (K, V)>,
850 K: Hash + Eq,
851 S: BuildHasher,
852{
853}
854
855impl<I, K, V, S> fmt::Debug for Splice<'_, I, K, V, S>
856where
857 I: fmt::Debug + Iterator<Item = (K, V)>,
858 K: fmt::Debug + Hash + Eq,
859 V: fmt::Debug,
860 S: BuildHasher,
861{
862 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
863 f.debug_struct("Splice")
865 .field("drain", &self.drain)
866 .field("replace_with", &self.replace_with)
867 .finish()
868 }
869}
870
871pub struct ExtractIf<'a, K, V, F> {
876 inner: ExtractCore<'a, K, V>,
877 pred: F,
878}
879
880impl<K, V, F> ExtractIf<'_, K, V, F> {
881 #[track_caller]
882 pub(super) fn new<R>(core: &mut Core<K, V>, range: R, pred: F) -> ExtractIf<'_, K, V, F>
883 where
884 R: RangeBounds<usize>,
885 F: FnMut(&K, &mut V) -> bool,
886 {
887 ExtractIf {
888 inner: core.extract(range),
889 pred,
890 }
891 }
892}
893
894impl<K, V, F> Iterator for ExtractIf<'_, K, V, F>
895where
896 F: FnMut(&K, &mut V) -> bool,
897{
898 type Item = (K, V);
899
900 fn next(&mut self) -> Option<Self::Item> {
901 self.inner
902 .extract_if(|bucket| {
903 let (key, value) = bucket.ref_mut();
904 (self.pred)(key, value)
905 })
906 .map(Bucket::key_value)
907 }
908
909 fn size_hint(&self) -> (usize, Option<usize>) {
910 (0, Some(self.inner.remaining()))
911 }
912}
913
914impl<K, V, F> FusedIterator for ExtractIf<'_, K, V, F> where F: FnMut(&K, &mut V) -> bool {}
915
916impl<K, V, F> fmt::Debug for ExtractIf<'_, K, V, F>
917where
918 K: fmt::Debug,
919 V: fmt::Debug,
920{
921 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
922 f.debug_struct("ExtractIf").finish_non_exhaustive()
923 }
924}