@@ -12,7 +12,7 @@ use crate::vec::{self, Vec};
1212use :: core:: cmp:: Ordering ;
1313use :: core:: fmt;
1414use :: core:: hash:: { BuildHasher , Hash , Hasher } ;
15- use :: core:: iter:: FromIterator ;
15+ use :: core:: iter:: { FromIterator , FusedIterator } ;
1616use :: core:: ops:: { Index , IndexMut , RangeBounds } ;
1717use :: core:: slice:: { Iter as SliceIter , IterMut as SliceIterMut } ;
1818
@@ -813,9 +813,7 @@ impl<'a, K, V> Iterator for Keys<'a, K, V> {
813813}
814814
815815impl < K , V > DoubleEndedIterator for Keys < ' _ , K , V > {
816- fn next_back ( & mut self ) -> Option < Self :: Item > {
817- self . iter . next_back ( ) . map ( Bucket :: key_ref)
818- }
816+ double_ended_iterator_methods ! ( Bucket :: key_ref) ;
819817}
820818
821819impl < K , V > ExactSizeIterator for Keys < ' _ , K , V > {
@@ -824,6 +822,8 @@ impl<K, V> ExactSizeIterator for Keys<'_, K, V> {
824822 }
825823}
826824
825+ impl < K , V > FusedIterator for Keys < ' _ , K , V > { }
826+
827827// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
828828impl < K , V > Clone for Keys < ' _ , K , V > {
829829 fn clone ( & self ) -> Self {
@@ -857,9 +857,7 @@ impl<K, V> Iterator for IntoKeys<K, V> {
857857}
858858
859859impl < K , V > DoubleEndedIterator for IntoKeys < K , V > {
860- fn next_back ( & mut self ) -> Option < Self :: Item > {
861- self . iter . next_back ( ) . map ( Bucket :: key)
862- }
860+ double_ended_iterator_methods ! ( Bucket :: key) ;
863861}
864862
865863impl < K , V > ExactSizeIterator for IntoKeys < K , V > {
@@ -868,6 +866,8 @@ impl<K, V> ExactSizeIterator for IntoKeys<K, V> {
868866 }
869867}
870868
869+ impl < K , V > FusedIterator for IntoKeys < K , V > { }
870+
871871impl < K : fmt:: Debug , V > fmt:: Debug for IntoKeys < K , V > {
872872 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
873873 let iter = self . iter . as_slice ( ) . iter ( ) . map ( Bucket :: key_ref) ;
@@ -893,9 +893,7 @@ impl<'a, K, V> Iterator for Values<'a, K, V> {
893893}
894894
895895impl < K , V > DoubleEndedIterator for Values < ' _ , K , V > {
896- fn next_back ( & mut self ) -> Option < Self :: Item > {
897- self . iter . next_back ( ) . map ( Bucket :: value_ref)
898- }
896+ double_ended_iterator_methods ! ( Bucket :: value_ref) ;
899897}
900898
901899impl < K , V > ExactSizeIterator for Values < ' _ , K , V > {
@@ -904,6 +902,8 @@ impl<K, V> ExactSizeIterator for Values<'_, K, V> {
904902 }
905903}
906904
905+ impl < K , V > FusedIterator for Values < ' _ , K , V > { }
906+
907907// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
908908impl < K , V > Clone for Values < ' _ , K , V > {
909909 fn clone ( & self ) -> Self {
@@ -937,9 +937,7 @@ impl<'a, K, V> Iterator for ValuesMut<'a, K, V> {
937937}
938938
939939impl < K , V > DoubleEndedIterator for ValuesMut < ' _ , K , V > {
940- fn next_back ( & mut self ) -> Option < Self :: Item > {
941- self . iter . next_back ( ) . map ( Bucket :: value_mut)
942- }
940+ double_ended_iterator_methods ! ( Bucket :: value_mut) ;
943941}
944942
945943impl < K , V > ExactSizeIterator for ValuesMut < ' _ , K , V > {
@@ -948,6 +946,10 @@ impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> {
948946 }
949947}
950948
949+ impl < K , V > FusedIterator for ValuesMut < ' _ , K , V > { }
950+
951+ // TODO: `impl Debug for ValuesMut` once we have MSRV 1.53 for `slice::IterMut::as_slice`
952+
951953/// An owning iterator over the values of a `IndexMap`.
952954///
953955/// This `struct` is created by the [`into_values`] method on [`IndexMap`].
@@ -966,9 +968,7 @@ impl<K, V> Iterator for IntoValues<K, V> {
966968}
967969
968970impl < K , V > DoubleEndedIterator for IntoValues < K , V > {
969- fn next_back ( & mut self ) -> Option < Self :: Item > {
970- self . iter . next_back ( ) . map ( Bucket :: value)
971- }
971+ double_ended_iterator_methods ! ( Bucket :: value) ;
972972}
973973
974974impl < K , V > ExactSizeIterator for IntoValues < K , V > {
@@ -977,6 +977,8 @@ impl<K, V> ExactSizeIterator for IntoValues<K, V> {
977977 }
978978}
979979
980+ impl < K , V > FusedIterator for IntoValues < K , V > { }
981+
980982impl < K , V : fmt:: Debug > fmt:: Debug for IntoValues < K , V > {
981983 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
982984 let iter = self . iter . as_slice ( ) . iter ( ) . map ( Bucket :: value_ref) ;
@@ -1002,9 +1004,7 @@ impl<'a, K, V> Iterator for Iter<'a, K, V> {
10021004}
10031005
10041006impl < K , V > DoubleEndedIterator for Iter < ' _ , K , V > {
1005- fn next_back ( & mut self ) -> Option < Self :: Item > {
1006- self . iter . next_back ( ) . map ( Bucket :: refs)
1007- }
1007+ double_ended_iterator_methods ! ( Bucket :: refs) ;
10081008}
10091009
10101010impl < K , V > ExactSizeIterator for Iter < ' _ , K , V > {
@@ -1013,6 +1013,8 @@ impl<K, V> ExactSizeIterator for Iter<'_, K, V> {
10131013 }
10141014}
10151015
1016+ impl < K , V > FusedIterator for Iter < ' _ , K , V > { }
1017+
10161018// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
10171019impl < K , V > Clone for Iter < ' _ , K , V > {
10181020 fn clone ( & self ) -> Self {
@@ -1046,9 +1048,7 @@ impl<'a, K, V> Iterator for IterMut<'a, K, V> {
10461048}
10471049
10481050impl < K , V > DoubleEndedIterator for IterMut < ' _ , K , V > {
1049- fn next_back ( & mut self ) -> Option < Self :: Item > {
1050- self . iter . next_back ( ) . map ( Bucket :: ref_mut)
1051- }
1051+ double_ended_iterator_methods ! ( Bucket :: ref_mut) ;
10521052}
10531053
10541054impl < K , V > ExactSizeIterator for IterMut < ' _ , K , V > {
@@ -1057,6 +1057,10 @@ impl<K, V> ExactSizeIterator for IterMut<'_, K, V> {
10571057 }
10581058}
10591059
1060+ impl < K , V > FusedIterator for IterMut < ' _ , K , V > { }
1061+
1062+ // TODO: `impl Debug for IterMut` once we have MSRV 1.53 for `slice::IterMut::as_slice`
1063+
10601064/// An owning iterator over the entries of a `IndexMap`.
10611065///
10621066/// This `struct` is created by the [`into_iter`] method on [`IndexMap`]
@@ -1075,9 +1079,7 @@ impl<K, V> Iterator for IntoIter<K, V> {
10751079}
10761080
10771081impl < K , V > DoubleEndedIterator for IntoIter < K , V > {
1078- fn next_back ( & mut self ) -> Option < Self :: Item > {
1079- self . iter . next_back ( ) . map ( Bucket :: key_value)
1080- }
1082+ double_ended_iterator_methods ! ( Bucket :: key_value) ;
10811083}
10821084
10831085impl < K , V > ExactSizeIterator for IntoIter < K , V > {
@@ -1086,6 +1088,8 @@ impl<K, V> ExactSizeIterator for IntoIter<K, V> {
10861088 }
10871089}
10881090
1091+ impl < K , V > FusedIterator for IntoIter < K , V > { }
1092+
10891093impl < K : fmt:: Debug , V : fmt:: Debug > fmt:: Debug for IntoIter < K , V > {
10901094 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
10911095 let iter = self . iter . as_slice ( ) . iter ( ) . map ( Bucket :: refs) ;
@@ -1114,6 +1118,21 @@ impl<K, V> DoubleEndedIterator for Drain<'_, K, V> {
11141118 double_ended_iterator_methods ! ( Bucket :: key_value) ;
11151119}
11161120
1121+ impl < K , V > ExactSizeIterator for Drain < ' _ , K , V > {
1122+ fn len ( & self ) -> usize {
1123+ self . iter . len ( )
1124+ }
1125+ }
1126+
1127+ impl < K , V > FusedIterator for Drain < ' _ , K , V > { }
1128+
1129+ impl < K : fmt:: Debug , V : fmt:: Debug > fmt:: Debug for Drain < ' _ , K , V > {
1130+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
1131+ let iter = self . iter . as_slice ( ) . iter ( ) . map ( Bucket :: refs) ;
1132+ f. debug_list ( ) . entries ( iter) . finish ( )
1133+ }
1134+ }
1135+
11171136impl < ' a , K , V , S > IntoIterator for & ' a IndexMap < K , V , S > {
11181137 type Item = ( & ' a K , & ' a V ) ;
11191138 type IntoIter = Iter < ' a , K , V > ;
0 commit comments