1mod core;
5
6pub use crate::mutable_keys::MutableKeys;
7
8#[cfg(feature = "rayon")]
9pub use crate::rayon::map as rayon;
10
11use crate::EntryVec;
12use ::core::cmp::Ordering;
13use ::core::fmt;
14use ::core::hash::{BuildHasher, Hash, Hasher};
15use ::core::iter::FromIterator;
16use ::core::ops::{Index, IndexMut, RangeBounds};
17
18#[cfg(has_std)]
19use std::collections::hash_map::RandomState;
20
21use self::core::IndexMapCore;
22use crate::equivalent::Equivalent;
23use crate::util::third;
24use crate::{Bucket, Entries, HashValue};
25
26pub use self::core::{Entry, OccupiedEntry, VacantEntry};
27
28#[cfg(has_std)]
70pub struct IndexMap<K, V, S = RandomState> {
71 core: IndexMapCore<K, V>,
72 hash_builder: S,
73}
74#[cfg(not(has_std))]
75pub struct IndexMap<K, V, S> {
76 core: IndexMapCore<K, V>,
77 hash_builder: S,
78}
79
80impl<K, V, S> Clone for IndexMap<K, V, S>
81where
82 K: Clone,
83 V: Clone,
84 S: Clone,
85{
86 fn clone(&self) -> Self {
87 IndexMap {
88 core: self.core.clone(),
89 hash_builder: self.hash_builder.clone(),
90 }
91 }
92
93 fn clone_from(&mut self, other: &Self) {
94 self.core.clone_from(&other.core);
95 self.hash_builder.clone_from(&other.hash_builder);
96 }
97}
98
99impl<K, V, S> Entries for IndexMap<K, V, S> {
100 type Entry = Bucket<K, V>;
101
102 #[inline]
103 fn into_entries(self) -> EntryVec<Self::Entry> {
104 self.core.into_entries()
105 }
106
107 #[inline]
108 fn as_entries(&self) -> &EntryVec<Self::Entry> {
109 self.core.as_entries()
110 }
111
112 #[inline]
113 fn as_entries_mut(&mut self) -> &mut EntryVec<Self::Entry> {
114 self.core.as_entries_mut()
115 }
116
117 fn with_entries<F>(&mut self, f: F)
118 where
119 F: FnOnce(&mut EntryVec<Self::Entry>),
120 {
121 self.core.with_entries(f);
122 }
123}
124
125impl<K, V, S> fmt::Debug for IndexMap<K, V, S>
126where
127 K: fmt::Debug,
128 V: fmt::Debug,
129{
130 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
131 if cfg!(not(feature = "test_debug")) {
132 f.debug_map().entries(self.iter()).finish()
133 } else {
134 f.debug_struct("IndexMap")
136 .field("core", &self.core)
137 .finish()
138 }
139 }
140}
141
142#[cfg(has_std)]
143impl<K, V> IndexMap<K, V> {
144 #[inline]
146 pub fn new() -> Self {
147 Self::with_capacity(0)
148 }
149
150 #[inline]
155 pub fn with_capacity(n: usize) -> Self {
156 Self::with_capacity_and_hasher(n, <_>::default())
157 }
158}
159
160impl<K, V, S> IndexMap<K, V, S> {
161 #[inline]
166 pub fn with_capacity_and_hasher(n: usize, hash_builder: S) -> Self {
167 if n == 0 {
168 IndexMap {
169 core: IndexMapCore::new(),
170 hash_builder,
171 }
172 } else {
173 IndexMap {
174 core: IndexMapCore::with_capacity(n),
175 hash_builder,
176 }
177 }
178 }
179
180 pub fn with_hasher(hash_builder: S) -> Self {
182 Self::with_capacity_and_hasher(0, hash_builder)
183 }
184
185 pub fn capacity(&self) -> usize {
187 self.core.capacity()
188 }
189
190 pub fn hasher(&self) -> &S {
192 &self.hash_builder
193 }
194
195 #[inline]
199 pub fn len(&self) -> usize {
200 self.core.len()
201 }
202
203 #[inline]
207 pub fn is_empty(&self) -> bool {
208 self.len() == 0
209 }
210
211 pub fn iter(&self) -> Iter<'_, K, V> {
213 Iter {
214 iter: self.as_entries().iter(),
215 }
216 }
217
218 pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
220 IterMut {
221 iter: self.as_entries_mut().iter_mut(),
222 }
223 }
224
225 pub fn keys(&self) -> Keys<'_, K, V> {
227 Keys {
228 iter: self.as_entries().iter(),
229 }
230 }
231
232 pub fn values(&self) -> Values<'_, K, V> {
234 Values {
235 iter: self.as_entries().iter(),
236 }
237 }
238
239 pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> {
242 ValuesMut {
243 iter: self.as_entries_mut().iter_mut(),
244 }
245 }
246
247 pub fn clear(&mut self) {
251 self.core.clear();
252 }
253
254 pub fn truncate(&mut self, len: usize) {
258 self.core.truncate(len);
259 }
260
261 pub fn drain<R>(&mut self, range: R) -> Drain<'_, K, V>
275 where
276 R: RangeBounds<usize>,
277 {
278 Drain {
279 iter: self.core.drain(range),
280 }
281 }
282
283 pub fn split_off(&mut self, at: usize) -> Self
291 where
292 S: Clone,
293 {
294 Self {
295 core: self.core.split_off(at),
296 hash_builder: self.hash_builder.clone(),
297 }
298 }
299}
300
301impl<K, V, S> IndexMap<K, V, S>
302where
303 K: Hash + Eq,
304 S: BuildHasher,
305{
306 pub fn reserve(&mut self, additional: usize) {
310 self.core.reserve(additional);
311 }
312
313 pub fn shrink_to_fit(&mut self) {
317 self.core.shrink_to_fit();
318 }
319
320 fn hash<Q: ?Sized + Hash>(&self, key: &Q) -> HashValue {
321 let mut h = self.hash_builder.build_hasher();
322 key.hash(&mut h);
323 HashValue(h.finish() as usize)
324 }
325
326 pub fn insert(&mut self, key: K, value: V) -> Option<V> {
340 self.insert_full(key, value).1
341 }
342
343 pub fn insert_full(&mut self, key: K, value: V) -> (usize, Option<V>) {
357 let hash = self.hash(&key);
358 self.core.insert_full(hash, key, value)
359 }
360
361 pub fn entry(&mut self, key: K) -> Entry<'_, K, V> {
366 let hash = self.hash(&key);
367 self.core.entry(hash, key)
368 }
369
370 pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool
374 where
375 Q: Hash + Equivalent<K>,
376 {
377 self.get_index_of(key).is_some()
378 }
379
380 pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V>
385 where
386 Q: Hash + Equivalent<K>,
387 {
388 if let Some(i) = self.get_index_of(key) {
389 let entry = &self.as_entries()[i];
390 Some(&entry.value)
391 } else {
392 None
393 }
394 }
395
396 pub fn get_key_value<Q: ?Sized>(&self, key: &Q) -> Option<(&K, &V)>
401 where
402 Q: Hash + Equivalent<K>,
403 {
404 if let Some(i) = self.get_index_of(key) {
405 let entry = &self.as_entries()[i];
406 Some((&entry.key, &entry.value))
407 } else {
408 None
409 }
410 }
411
412 pub fn get_full<Q: ?Sized>(&self, key: &Q) -> Option<(usize, &K, &V)>
414 where
415 Q: Hash + Equivalent<K>,
416 {
417 if let Some(i) = self.get_index_of(key) {
418 let entry = &self.as_entries()[i];
419 Some((i, &entry.key, &entry.value))
420 } else {
421 None
422 }
423 }
424
425 pub fn get_index_of<Q: ?Sized>(&self, key: &Q) -> Option<usize>
427 where
428 Q: Hash + Equivalent<K>,
429 {
430 if self.is_empty() {
431 None
432 } else {
433 let hash = self.hash(key);
434 self.core.get_index_of(hash, key)
435 }
436 }
437
438 pub fn get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut V>
439 where
440 Q: Hash + Equivalent<K>,
441 {
442 if let Some(i) = self.get_index_of(key) {
443 let entry = &mut self.as_entries_mut()[i];
444 Some(&mut entry.value)
445 } else {
446 None
447 }
448 }
449
450 pub fn get_full_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<(usize, &K, &mut V)>
451 where
452 Q: Hash + Equivalent<K>,
453 {
454 if let Some(i) = self.get_index_of(key) {
455 let entry = &mut self.as_entries_mut()[i];
456 Some((i, &entry.key, &mut entry.value))
457 } else {
458 None
459 }
460 }
461
462 pub(crate) fn get_full_mut2_impl<Q: ?Sized>(
463 &mut self,
464 key: &Q,
465 ) -> Option<(usize, &mut K, &mut V)>
466 where
467 Q: Hash + Equivalent<K>,
468 {
469 if let Some(i) = self.get_index_of(key) {
470 let entry = &mut self.as_entries_mut()[i];
471 Some((i, &mut entry.key, &mut entry.value))
472 } else {
473 None
474 }
475 }
476
477 pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V>
486 where
487 Q: Hash + Equivalent<K>,
488 {
489 self.swap_remove(key)
490 }
491
492 pub fn remove_entry<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)>
500 where
501 Q: Hash + Equivalent<K>,
502 {
503 self.swap_remove_entry(key)
504 }
505
506 pub fn swap_remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V>
517 where
518 Q: Hash + Equivalent<K>,
519 {
520 self.swap_remove_full(key).map(third)
521 }
522
523 pub fn swap_remove_entry<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)>
533 where
534 Q: Hash + Equivalent<K>,
535 {
536 match self.swap_remove_full(key) {
537 Some((_, key, value)) => Some((key, value)),
538 None => None,
539 }
540 }
541
542 pub fn swap_remove_full<Q: ?Sized>(&mut self, key: &Q) -> Option<(usize, K, V)>
553 where
554 Q: Hash + Equivalent<K>,
555 {
556 if self.is_empty() {
557 return None;
558 }
559 let hash = self.hash(key);
560 self.core.swap_remove_full(hash, key)
561 }
562
563 pub fn shift_remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V>
574 where
575 Q: Hash + Equivalent<K>,
576 {
577 self.shift_remove_full(key).map(third)
578 }
579
580 pub fn shift_remove_entry<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)>
590 where
591 Q: Hash + Equivalent<K>,
592 {
593 match self.shift_remove_full(key) {
594 Some((_, key, value)) => Some((key, value)),
595 None => None,
596 }
597 }
598
599 pub fn shift_remove_full<Q: ?Sized>(&mut self, key: &Q) -> Option<(usize, K, V)>
610 where
611 Q: Hash + Equivalent<K>,
612 {
613 if self.is_empty() {
614 return None;
615 }
616 let hash = self.hash(key);
617 self.core.shift_remove_full(hash, key)
618 }
619
620 pub fn pop(&mut self) -> Option<(K, V)> {
624 self.core.pop()
625 }
626
627 pub fn retain<F>(&mut self, mut keep: F)
635 where
636 F: FnMut(&K, &mut V) -> bool,
637 {
638 self.core.retain_in_order(move |k, v| keep(k, v));
639 }
640
641 pub(crate) fn retain_mut<F>(&mut self, keep: F)
642 where
643 F: FnMut(&mut K, &mut V) -> bool,
644 {
645 self.core.retain_in_order(keep);
646 }
647
648 pub fn sort_keys(&mut self)
652 where
653 K: Ord,
654 {
655 self.with_entries(|entries| {
656 entries
657 .make_contiguous()
658 .sort_by(|a, b| Ord::cmp(&a.key, &b.key));
659 });
660 }
661
662 pub fn sort_by<F>(&mut self, mut cmp: F)
671 where
672 F: FnMut(&K, &V, &K, &V) -> Ordering,
673 {
674 self.with_entries(move |entries| {
675 entries
676 .make_contiguous()
677 .sort_by(move |a, b| cmp(&a.key, &a.value, &b.key, &b.value));
678 });
679 }
680
681 pub fn sorted_by<F>(self, mut cmp: F) -> IntoIter<K, V>
686 where
687 F: FnMut(&K, &V, &K, &V) -> Ordering,
688 {
689 let mut entries = self.into_entries();
690 entries
691 .make_contiguous()
692 .sort_by(move |a, b| cmp(&a.key, &a.value, &b.key, &b.value));
693 IntoIter {
694 iter: entries.into_iter(),
695 }
696 }
697
698 pub fn reverse(&mut self) {
702 self.core.reverse()
703 }
704}
705
706impl<K, V, S> IndexMap<K, V, S> {
707 pub fn get_index(&self, index: usize) -> Option<(&K, &V)> {
713 self.as_entries().get(index).map(Bucket::refs)
714 }
715
716 pub fn get_index_mut(&mut self, index: usize) -> Option<(&mut K, &mut V)> {
722 self.as_entries_mut().get_mut(index).map(Bucket::muts)
723 }
724
725 pub fn first(&self) -> Option<(&K, &V)> {
729 self.as_entries().first().map(Bucket::refs)
730 }
731
732 pub fn first_mut(&mut self) -> Option<(&K, &mut V)> {
736 self.as_entries_mut().first_mut().map(Bucket::ref_mut)
737 }
738
739 pub fn last(&self) -> Option<(&K, &V)> {
743 self.as_entries().last().map(Bucket::refs)
744 }
745
746 pub fn last_mut(&mut self) -> Option<(&K, &mut V)> {
750 self.as_entries_mut().last_mut().map(Bucket::ref_mut)
751 }
752
753 pub fn swap_remove_index(&mut self, index: usize) -> Option<(K, V)> {
763 self.core.swap_remove_index(index)
764 }
765
766 pub fn shift_remove_index(&mut self, index: usize) -> Option<(K, V)> {
776 self.core.shift_remove_index(index)
777 }
778
779 pub fn swap_indices(&mut self, a: usize, b: usize) {
783 self.core.swap_indices(a, b)
784 }
785}
786
787pub struct Keys<'a, K, V> {
795 pub(crate) iter: <&'a EntryVec<Bucket<K, V>> as IntoIterator>::IntoIter,
796}
797
798impl<'a, K, V> Iterator for Keys<'a, K, V> {
799 type Item = &'a K;
800
801 iterator_methods!(Bucket::key_ref);
802}
803
804impl<K, V> DoubleEndedIterator for Keys<'_, K, V> {
805 fn next_back(&mut self) -> Option<Self::Item> {
806 self.iter.next_back().map(Bucket::key_ref)
807 }
808}
809
810impl<K, V> ExactSizeIterator for Keys<'_, K, V> {
811 fn len(&self) -> usize {
812 self.iter.len()
813 }
814}
815
816impl<K, V> Clone for Keys<'_, K, V> {
818 fn clone(&self) -> Self {
819 Keys {
820 iter: self.iter.clone(),
821 }
822 }
823}
824
825impl<K: fmt::Debug, V> fmt::Debug for Keys<'_, K, V> {
826 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
827 f.debug_list().entries(self.clone()).finish()
828 }
829}
830
831pub struct Values<'a, K, V> {
839 iter: <&'a EntryVec<Bucket<K, V>> as IntoIterator>::IntoIter,
840}
841
842impl<'a, K, V> Iterator for Values<'a, K, V> {
843 type Item = &'a V;
844
845 iterator_methods!(Bucket::value_ref);
846}
847
848impl<K, V> DoubleEndedIterator for Values<'_, K, V> {
849 fn next_back(&mut self) -> Option<Self::Item> {
850 self.iter.next_back().map(Bucket::value_ref)
851 }
852}
853
854impl<K, V> ExactSizeIterator for Values<'_, K, V> {
855 fn len(&self) -> usize {
856 self.iter.len()
857 }
858}
859
860impl<K, V> Clone for Values<'_, K, V> {
862 fn clone(&self) -> Self {
863 Values {
864 iter: self.iter.clone(),
865 }
866 }
867}
868
869impl<K, V: fmt::Debug> fmt::Debug for Values<'_, K, V> {
870 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
871 f.debug_list().entries(self.clone()).finish()
872 }
873}
874
875pub struct ValuesMut<'a, K, V> {
883 iter: <&'a mut EntryVec<Bucket<K, V>> as IntoIterator>::IntoIter,
884}
885
886impl<'a, K, V> Iterator for ValuesMut<'a, K, V> {
887 type Item = &'a mut V;
888
889 iterator_methods!(Bucket::value_mut);
890}
891
892impl<K, V> DoubleEndedIterator for ValuesMut<'_, K, V> {
893 fn next_back(&mut self) -> Option<Self::Item> {
894 self.iter.next_back().map(Bucket::value_mut)
895 }
896}
897
898impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> {
899 fn len(&self) -> usize {
900 self.iter.len()
901 }
902}
903
904pub struct Iter<'a, K, V> {
912 iter: <&'a EntryVec<Bucket<K, V>> as IntoIterator>::IntoIter,
913}
914
915impl<'a, K, V> Iterator for Iter<'a, K, V> {
916 type Item = (&'a K, &'a V);
917
918 iterator_methods!(Bucket::refs);
919}
920
921impl<K, V> DoubleEndedIterator for Iter<'_, K, V> {
922 fn next_back(&mut self) -> Option<Self::Item> {
923 self.iter.next_back().map(Bucket::refs)
924 }
925}
926
927impl<K, V> ExactSizeIterator for Iter<'_, K, V> {
928 fn len(&self) -> usize {
929 self.iter.len()
930 }
931}
932
933impl<K, V> Clone for Iter<'_, K, V> {
935 fn clone(&self) -> Self {
936 Iter {
937 iter: self.iter.clone(),
938 }
939 }
940}
941
942impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for Iter<'_, K, V> {
943 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
944 f.debug_list().entries(self.clone()).finish()
945 }
946}
947
948pub struct IterMut<'a, K, V> {
956 iter: <&'a mut EntryVec<Bucket<K, V>> as IntoIterator>::IntoIter,
957}
958
959impl<'a, K, V> Iterator for IterMut<'a, K, V> {
960 type Item = (&'a K, &'a mut V);
961
962 iterator_methods!(Bucket::ref_mut);
963}
964
965impl<K, V> DoubleEndedIterator for IterMut<'_, K, V> {
966 fn next_back(&mut self) -> Option<Self::Item> {
967 self.iter.next_back().map(Bucket::ref_mut)
968 }
969}
970
971impl<K, V> ExactSizeIterator for IterMut<'_, K, V> {
972 fn len(&self) -> usize {
973 self.iter.len()
974 }
975}
976
977pub struct IntoIter<K, V> {
985 pub(crate) iter: <EntryVec<Bucket<K, V>> as IntoIterator>::IntoIter,
986}
987
988impl<K, V> Iterator for IntoIter<K, V> {
989 type Item = (K, V);
990
991 iterator_methods!(Bucket::key_value);
992}
993
994impl<K, V> DoubleEndedIterator for IntoIter<K, V> {
995 fn next_back(&mut self) -> Option<Self::Item> {
996 self.iter.next_back().map(Bucket::key_value)
997 }
998}
999
1000impl<K, V> ExactSizeIterator for IntoIter<K, V> {
1001 fn len(&self) -> usize {
1002 self.iter.len()
1003 }
1004}
1005
1006impl<K: fmt::Debug, V: fmt::Debug> fmt::Debug for IntoIter<K, V> {
1007 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1008 f.debug_struct("IntoIter").finish()
1009 }
1010}
1011
1012pub struct Drain<'a, K, V> {
1020 pub(crate) iter: atone::vc::Drain<'a, Bucket<K, V>>,
1021}
1022
1023impl<K, V> Iterator for Drain<'_, K, V> {
1024 type Item = (K, V);
1025
1026 iterator_methods!(Bucket::key_value);
1027}
1028
1029impl<K, V> DoubleEndedIterator for Drain<'_, K, V> {
1030 double_ended_iterator_methods!(Bucket::key_value);
1031}
1032
1033impl<'a, K, V, S> IntoIterator for &'a IndexMap<K, V, S> {
1034 type Item = (&'a K, &'a V);
1035 type IntoIter = Iter<'a, K, V>;
1036 fn into_iter(self) -> Self::IntoIter {
1037 self.iter()
1038 }
1039}
1040
1041impl<'a, K, V, S> IntoIterator for &'a mut IndexMap<K, V, S> {
1042 type Item = (&'a K, &'a mut V);
1043 type IntoIter = IterMut<'a, K, V>;
1044 fn into_iter(self) -> Self::IntoIter {
1045 self.iter_mut()
1046 }
1047}
1048
1049impl<K, V, S> IntoIterator for IndexMap<K, V, S> {
1050 type Item = (K, V);
1051 type IntoIter = IntoIter<K, V>;
1052 fn into_iter(self) -> Self::IntoIter {
1053 IntoIter {
1054 iter: self.into_entries().into_iter(),
1055 }
1056 }
1057}
1058
1059impl<K, V, Q: ?Sized, S> Index<&Q> for IndexMap<K, V, S>
1082where
1083 Q: Hash + Equivalent<K>,
1084 K: Hash + Eq,
1085 S: BuildHasher,
1086{
1087 type Output = V;
1088
1089 fn index(&self, key: &Q) -> &V {
1093 self.get(key).expect("IndexMap: key not found")
1094 }
1095}
1096
1097impl<K, V, Q: ?Sized, S> IndexMut<&Q> for IndexMap<K, V, S>
1127where
1128 Q: Hash + Equivalent<K>,
1129 K: Hash + Eq,
1130 S: BuildHasher,
1131{
1132 fn index_mut(&mut self, key: &Q) -> &mut V {
1136 self.get_mut(key).expect("IndexMap: key not found")
1137 }
1138}
1139
1140impl<K, V, S> Index<usize> for IndexMap<K, V, S> {
1169 type Output = V;
1170
1171 fn index(&self, index: usize) -> &V {
1175 self.get_index(index)
1176 .expect("IndexMap: index out of bounds")
1177 .1
1178 }
1179}
1180
1181impl<K, V, S> IndexMut<usize> for IndexMap<K, V, S> {
1211 fn index_mut(&mut self, index: usize) -> &mut V {
1215 self.get_index_mut(index)
1216 .expect("IndexMap: index out of bounds")
1217 .1
1218 }
1219}
1220
1221impl<K, V, S> FromIterator<(K, V)> for IndexMap<K, V, S>
1222where
1223 K: Hash + Eq,
1224 S: BuildHasher + Default,
1225{
1226 fn from_iter<I: IntoIterator<Item = (K, V)>>(iterable: I) -> Self {
1232 let iter = iterable.into_iter();
1233 let (low, _) = iter.size_hint();
1234 let mut map = Self::with_capacity_and_hasher(low, <_>::default());
1235 map.extend(iter);
1236 map
1237 }
1238}
1239
1240impl<K, V, S> Extend<(K, V)> for IndexMap<K, V, S>
1241where
1242 K: Hash + Eq,
1243 S: BuildHasher,
1244{
1245 fn extend<I: IntoIterator<Item = (K, V)>>(&mut self, iterable: I) {
1255 let iter = iterable.into_iter();
1261 let reserve = if self.is_empty() {
1262 iter.size_hint().0
1263 } else {
1264 (iter.size_hint().0 + 1) / 2
1265 };
1266 self.reserve(reserve);
1267 iter.for_each(move |(k, v)| {
1268 self.insert(k, v);
1269 });
1270 }
1271}
1272
1273impl<'a, K, V, S> Extend<(&'a K, &'a V)> for IndexMap<K, V, S>
1274where
1275 K: Hash + Eq + Copy,
1276 V: Copy,
1277 S: BuildHasher,
1278{
1279 fn extend<I: IntoIterator<Item = (&'a K, &'a V)>>(&mut self, iterable: I) {
1283 self.extend(iterable.into_iter().map(|(&key, &value)| (key, value)));
1284 }
1285}
1286
1287impl<K, V, S> Default for IndexMap<K, V, S>
1288where
1289 S: Default,
1290{
1291 fn default() -> Self {
1293 Self::with_capacity_and_hasher(0, S::default())
1294 }
1295}
1296
1297impl<K, V1, S1, V2, S2> PartialEq<IndexMap<K, V2, S2>> for IndexMap<K, V1, S1>
1298where
1299 K: Hash + Eq,
1300 V1: PartialEq<V2>,
1301 S1: BuildHasher,
1302 S2: BuildHasher,
1303{
1304 fn eq(&self, other: &IndexMap<K, V2, S2>) -> bool {
1305 if self.len() != other.len() {
1306 return false;
1307 }
1308
1309 self.iter()
1310 .all(|(key, value)| other.get(key).map_or(false, |v| *value == *v))
1311 }
1312}
1313
1314impl<K, V, S> Eq for IndexMap<K, V, S>
1315where
1316 K: Eq + Hash,
1317 V: Eq,
1318 S: BuildHasher,
1319{
1320}
1321
1322#[cfg(test)]
1323mod tests {
1324 use super::*;
1325 use crate::util::enumerate;
1326 use std::string::String;
1327 use std::vec::Vec;
1328
1329 #[test]
1330 fn it_works() {
1331 let mut map = IndexMap::new();
1332 assert_eq!(map.is_empty(), true);
1333 map.insert(1, ());
1334 map.insert(1, ());
1335 assert_eq!(map.len(), 1);
1336 assert!(map.get(&1).is_some());
1337 assert_eq!(map.is_empty(), false);
1338 }
1339
1340 #[test]
1341 fn new() {
1342 let map = IndexMap::<String, String>::new();
1343 println!("{:?}", map);
1344 assert_eq!(map.capacity(), 0);
1345 assert_eq!(map.len(), 0);
1346 assert_eq!(map.is_empty(), true);
1347 }
1348
1349 #[test]
1350 fn insert() {
1351 let insert = [0, 4, 2, 12, 8, 7, 11, 5];
1352 let not_present = [1, 3, 6, 9, 10];
1353 let mut map = IndexMap::with_capacity(insert.len());
1354
1355 for (i, &elt) in enumerate(&insert) {
1356 assert_eq!(map.len(), i);
1357 map.insert(elt, elt);
1358 assert_eq!(map.len(), i + 1);
1359 assert_eq!(map.get(&elt), Some(&elt));
1360 assert_eq!(map[&elt], elt);
1361 }
1362 println!("{:?}", map);
1363
1364 for &elt in ¬_present {
1365 assert!(map.get(&elt).is_none());
1366 }
1367 }
1368
1369 #[test]
1370 fn insert_full() {
1371 let insert = vec![9, 2, 7, 1, 4, 6, 13];
1372 let present = vec![1, 6, 2];
1373 let mut map = IndexMap::with_capacity(insert.len());
1374
1375 for (i, &elt) in enumerate(&insert) {
1376 assert_eq!(map.len(), i);
1377 let (index, existing) = map.insert_full(elt, elt);
1378 assert_eq!(existing, None);
1379 assert_eq!(Some(index), map.get_full(&elt).map(|x| x.0));
1380 assert_eq!(map.len(), i + 1);
1381 }
1382
1383 let len = map.len();
1384 for &elt in &present {
1385 let (index, existing) = map.insert_full(elt, elt);
1386 assert_eq!(existing, Some(elt));
1387 assert_eq!(Some(index), map.get_full(&elt).map(|x| x.0));
1388 assert_eq!(map.len(), len);
1389 }
1390 }
1391
1392 #[test]
1393 fn insert_2() {
1394 let mut map = IndexMap::with_capacity(16);
1395
1396 let mut keys = vec![];
1397 keys.extend(0..16);
1398 keys.extend(128..267);
1399
1400 for &i in &keys {
1401 let old_map = map.clone();
1402 map.insert(i, ());
1403 for key in old_map.keys() {
1404 if map.get(key).is_none() {
1405 println!("old_map: {:?}", old_map);
1406 println!("map: {:?}", map);
1407 panic!("did not find {} in map", key);
1408 }
1409 }
1410 }
1411
1412 for &i in &keys {
1413 assert!(map.get(&i).is_some(), "did not find {}", i);
1414 }
1415 }
1416
1417 #[test]
1418 fn insert_order() {
1419 let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
1420 let mut map = IndexMap::new();
1421
1422 for &elt in &insert {
1423 map.insert(elt, ());
1424 }
1425
1426 assert_eq!(map.keys().count(), map.len());
1427 assert_eq!(map.keys().count(), insert.len());
1428 for (a, b) in insert.iter().zip(map.keys()) {
1429 assert_eq!(a, b);
1430 }
1431 for (i, k) in (0..insert.len()).zip(map.keys()) {
1432 assert_eq!(map.get_index(i).unwrap().0, k);
1433 }
1434 }
1435
1436 #[test]
1437 fn grow() {
1438 let insert = [0, 4, 2, 12, 8, 7, 11];
1439 let not_present = [1, 3, 6, 9, 10];
1440 let mut map = IndexMap::with_capacity(insert.len());
1441
1442 for (i, &elt) in enumerate(&insert) {
1443 assert_eq!(map.len(), i);
1444 map.insert(elt, elt);
1445 assert_eq!(map.len(), i + 1);
1446 assert_eq!(map.get(&elt), Some(&elt));
1447 assert_eq!(map[&elt], elt);
1448 }
1449
1450 println!("{:?}", map);
1451 for &elt in &insert {
1452 map.insert(elt * 10, elt);
1453 }
1454 for &elt in &insert {
1455 map.insert(elt * 100, elt);
1456 }
1457 for (i, &elt) in insert.iter().cycle().enumerate().take(100) {
1458 map.insert(elt * 100 + i as i32, elt);
1459 }
1460 println!("{:?}", map);
1461 for &elt in ¬_present {
1462 assert!(map.get(&elt).is_none());
1463 }
1464 }
1465
1466 #[test]
1467 fn reserve() {
1468 let mut map = IndexMap::<usize, usize>::new();
1469 assert_eq!(map.capacity(), 0);
1470 map.reserve(100);
1471 let capacity = map.capacity();
1472 assert!(capacity >= 100);
1473 for i in 0..capacity {
1474 assert_eq!(map.len(), i);
1475 map.insert(i, i * i);
1476 assert_eq!(map.len(), i + 1);
1477 assert_eq!(map.capacity(), capacity);
1478 assert_eq!(map.get(&i), Some(&(i * i)));
1479 }
1480 map.insert(capacity, std::usize::MAX);
1481 assert_eq!(map.len(), capacity + 1);
1482 assert!(map.capacity() > capacity);
1483 assert_eq!(map.get(&capacity), Some(&std::usize::MAX));
1484 }
1485
1486 #[test]
1487 fn shrink_to_fit() {
1488 let mut map = IndexMap::<usize, usize>::new();
1489 assert_eq!(map.capacity(), 0);
1490 for i in 0..100 {
1491 assert_eq!(map.len(), i);
1492 map.insert(i, i * i);
1493 assert_eq!(map.len(), i + 1);
1494 assert!(map.capacity() >= i + 1);
1495 assert_eq!(map.get(&i), Some(&(i * i)));
1496 map.shrink_to_fit();
1497 assert_eq!(map.len(), i + 1);
1498 assert_eq!(map.get(&i), Some(&(i * i)));
1499 }
1500 }
1501
1502 #[test]
1503 fn remove() {
1504 let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
1505 let mut map = IndexMap::new();
1506
1507 for &elt in &insert {
1508 map.insert(elt, elt);
1509 }
1510
1511 assert_eq!(map.keys().count(), map.len());
1512 assert_eq!(map.keys().count(), insert.len());
1513 for (a, b) in insert.iter().zip(map.keys()) {
1514 assert_eq!(a, b);
1515 }
1516
1517 let remove_fail = [99, 77];
1518 let remove = [4, 12, 8, 7];
1519
1520 for &key in &remove_fail {
1521 assert!(map.swap_remove_full(&key).is_none());
1522 }
1523 println!("{:?}", map);
1524 for &key in &remove {
1525 let index = map.get_full(&key).unwrap().0;
1527 assert_eq!(map.swap_remove_full(&key), Some((index, key, key)));
1528 }
1529 println!("{:?}", map);
1530
1531 for key in &insert {
1532 assert_eq!(map.get(key).is_some(), !remove.contains(key));
1533 }
1534 assert_eq!(map.len(), insert.len() - remove.len());
1535 assert_eq!(map.keys().count(), insert.len() - remove.len());
1536 }
1537
1538 #[test]
1539 fn remove_to_empty() {
1540 let mut map = indexmap! { 0 => 0, 4 => 4, 5 => 5 };
1541 map.swap_remove(&5).unwrap();
1542 map.swap_remove(&4).unwrap();
1543 map.swap_remove(&0).unwrap();
1544 assert!(map.is_empty());
1545 }
1546
1547 #[test]
1548 fn swap_remove_index() {
1549 let insert = [0, 4, 2, 12, 8, 7, 11, 5, 3, 17, 19, 22, 23];
1550 let mut map = IndexMap::new();
1551
1552 for &elt in &insert {
1553 map.insert(elt, elt * 2);
1554 }
1555
1556 let mut vector = insert.to_vec();
1557 let remove_sequence = &[3, 3, 10, 4, 5, 4, 3, 0, 1];
1558
1559 for &rm in remove_sequence {
1562 let out_vec = vector.swap_remove(rm);
1563 let (out_map, _) = map.swap_remove_index(rm).unwrap();
1564 assert_eq!(out_vec, out_map);
1565 }
1566 assert_eq!(vector.len(), map.len());
1567 for (a, b) in vector.iter().zip(map.keys()) {
1568 assert_eq!(a, b);
1569 }
1570 }
1571
1572 #[test]
1573 fn partial_eq_and_eq() {
1574 let mut map_a = IndexMap::new();
1575 map_a.insert(1, "1");
1576 map_a.insert(2, "2");
1577 let mut map_b = map_a.clone();
1578 assert_eq!(map_a, map_b);
1579 map_b.swap_remove(&1);
1580 assert_ne!(map_a, map_b);
1581
1582 let map_c: IndexMap<_, String> = map_b.into_iter().map(|(k, v)| (k, v.into())).collect();
1583 assert_ne!(map_a, map_c);
1584 assert_ne!(map_c, map_a);
1585 }
1586
1587 #[test]
1588 fn extend() {
1589 let mut map = IndexMap::new();
1590 map.extend(vec![(&1, &2), (&3, &4)]);
1591 map.extend(vec![(5, 6)]);
1592 assert_eq!(
1593 map.into_iter().collect::<Vec<_>>(),
1594 vec![(1, 2), (3, 4), (5, 6)]
1595 );
1596 }
1597
1598 #[test]
1599 fn entry() {
1600 let mut map = IndexMap::new();
1601
1602 map.insert(1, "1");
1603 map.insert(2, "2");
1604 {
1605 let e = map.entry(3);
1606 assert_eq!(e.index(), 2);
1607 let e = e.or_insert("3");
1608 assert_eq!(e, &"3");
1609 }
1610
1611 let e = map.entry(2);
1612 assert_eq!(e.index(), 1);
1613 assert_eq!(e.key(), &2);
1614 match e {
1615 Entry::Occupied(ref e) => assert_eq!(e.get(), &"2"),
1616 Entry::Vacant(_) => panic!(),
1617 }
1618 assert_eq!(e.or_insert("4"), &"2");
1619 }
1620
1621 #[test]
1622 fn entry_and_modify() {
1623 let mut map = IndexMap::new();
1624
1625 map.insert(1, "1");
1626 map.entry(1).and_modify(|x| *x = "2");
1627 assert_eq!(Some(&"2"), map.get(&1));
1628
1629 map.entry(2).and_modify(|x| *x = "doesn't exist");
1630 assert_eq!(None, map.get(&2));
1631 }
1632
1633 #[test]
1634 fn entry_or_default() {
1635 let mut map = IndexMap::new();
1636
1637 #[derive(Debug, PartialEq)]
1638 enum TestEnum {
1639 DefaultValue,
1640 NonDefaultValue,
1641 }
1642
1643 impl Default for TestEnum {
1644 fn default() -> Self {
1645 TestEnum::DefaultValue
1646 }
1647 }
1648
1649 map.insert(1, TestEnum::NonDefaultValue);
1650 assert_eq!(&mut TestEnum::NonDefaultValue, map.entry(1).or_default());
1651
1652 assert_eq!(&mut TestEnum::DefaultValue, map.entry(2).or_default());
1653 }
1654
1655 #[test]
1656 fn keys() {
1657 let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
1658 let map: IndexMap<_, _> = vec.into_iter().collect();
1659 let keys: Vec<_> = map.keys().cloned().collect();
1660 assert_eq!(keys.len(), 3);
1661 assert!(keys.contains(&1));
1662 assert!(keys.contains(&2));
1663 assert!(keys.contains(&3));
1664 }
1665
1666 #[test]
1667 fn values() {
1668 let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
1669 let map: IndexMap<_, _> = vec.into_iter().collect();
1670 let values: Vec<_> = map.values().cloned().collect();
1671 assert_eq!(values.len(), 3);
1672 assert!(values.contains(&'a'));
1673 assert!(values.contains(&'b'));
1674 assert!(values.contains(&'c'));
1675 }
1676
1677 #[test]
1678 fn values_mut() {
1679 let vec = vec![(1, 1), (2, 2), (3, 3)];
1680 let mut map: IndexMap<_, _> = vec.into_iter().collect();
1681 for value in map.values_mut() {
1682 *value *= 2
1683 }
1684 let values: Vec<_> = map.values().cloned().collect();
1685 assert_eq!(values.len(), 3);
1686 assert!(values.contains(&2));
1687 assert!(values.contains(&4));
1688 assert!(values.contains(&6));
1689 }
1690}