@@ -12,7 +12,7 @@ use crate::vec::{self, Vec};
12
12
use :: core:: cmp:: Ordering ;
13
13
use :: core:: fmt;
14
14
use :: core:: hash:: { BuildHasher , Hash , Hasher } ;
15
- use :: core:: iter:: FromIterator ;
15
+ use :: core:: iter:: { FromIterator , FusedIterator } ;
16
16
use :: core:: ops:: { Index , IndexMut , RangeBounds } ;
17
17
use :: core:: slice:: { Iter as SliceIter , IterMut as SliceIterMut } ;
18
18
@@ -813,9 +813,7 @@ impl<'a, K, V> Iterator for Keys<'a, K, V> {
813
813
}
814
814
815
815
impl < 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) ;
819
817
}
820
818
821
819
impl < K , V > ExactSizeIterator for Keys < ' _ , K , V > {
@@ -824,6 +822,8 @@ impl<K, V> ExactSizeIterator for Keys<'_, K, V> {
824
822
}
825
823
}
826
824
825
+ impl < K , V > FusedIterator for Keys < ' _ , K , V > { }
826
+
827
827
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
828
828
impl < K , V > Clone for Keys < ' _ , K , V > {
829
829
fn clone ( & self ) -> Self {
@@ -857,9 +857,7 @@ impl<K, V> Iterator for IntoKeys<K, V> {
857
857
}
858
858
859
859
impl < 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) ;
863
861
}
864
862
865
863
impl < K , V > ExactSizeIterator for IntoKeys < K , V > {
@@ -868,6 +866,8 @@ impl<K, V> ExactSizeIterator for IntoKeys<K, V> {
868
866
}
869
867
}
870
868
869
+ impl < K , V > FusedIterator for IntoKeys < K , V > { }
870
+
871
871
impl < K : fmt:: Debug , V > fmt:: Debug for IntoKeys < K , V > {
872
872
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
873
873
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> {
893
893
}
894
894
895
895
impl < 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) ;
899
897
}
900
898
901
899
impl < K , V > ExactSizeIterator for Values < ' _ , K , V > {
@@ -904,6 +902,8 @@ impl<K, V> ExactSizeIterator for Values<'_, K, V> {
904
902
}
905
903
}
906
904
905
+ impl < K , V > FusedIterator for Values < ' _ , K , V > { }
906
+
907
907
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
908
908
impl < K , V > Clone for Values < ' _ , K , V > {
909
909
fn clone ( & self ) -> Self {
@@ -937,9 +937,7 @@ impl<'a, K, V> Iterator for ValuesMut<'a, K, V> {
937
937
}
938
938
939
939
impl < 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) ;
943
941
}
944
942
945
943
impl < K , V > ExactSizeIterator for ValuesMut < ' _ , K , V > {
@@ -948,6 +946,10 @@ impl<K, V> ExactSizeIterator for ValuesMut<'_, K, V> {
948
946
}
949
947
}
950
948
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
+
951
953
/// An owning iterator over the values of a `IndexMap`.
952
954
///
953
955
/// This `struct` is created by the [`into_values`] method on [`IndexMap`].
@@ -966,9 +968,7 @@ impl<K, V> Iterator for IntoValues<K, V> {
966
968
}
967
969
968
970
impl < 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) ;
972
972
}
973
973
974
974
impl < K , V > ExactSizeIterator for IntoValues < K , V > {
@@ -977,6 +977,8 @@ impl<K, V> ExactSizeIterator for IntoValues<K, V> {
977
977
}
978
978
}
979
979
980
+ impl < K , V > FusedIterator for IntoValues < K , V > { }
981
+
980
982
impl < K , V : fmt:: Debug > fmt:: Debug for IntoValues < K , V > {
981
983
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
982
984
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> {
1002
1004
}
1003
1005
1004
1006
impl < 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) ;
1008
1008
}
1009
1009
1010
1010
impl < K , V > ExactSizeIterator for Iter < ' _ , K , V > {
@@ -1013,6 +1013,8 @@ impl<K, V> ExactSizeIterator for Iter<'_, K, V> {
1013
1013
}
1014
1014
}
1015
1015
1016
+ impl < K , V > FusedIterator for Iter < ' _ , K , V > { }
1017
+
1016
1018
// FIXME(#26925) Remove in favor of `#[derive(Clone)]`
1017
1019
impl < K , V > Clone for Iter < ' _ , K , V > {
1018
1020
fn clone ( & self ) -> Self {
@@ -1046,9 +1048,7 @@ impl<'a, K, V> Iterator for IterMut<'a, K, V> {
1046
1048
}
1047
1049
1048
1050
impl < 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) ;
1052
1052
}
1053
1053
1054
1054
impl < K , V > ExactSizeIterator for IterMut < ' _ , K , V > {
@@ -1057,6 +1057,10 @@ impl<K, V> ExactSizeIterator for IterMut<'_, K, V> {
1057
1057
}
1058
1058
}
1059
1059
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
+
1060
1064
/// An owning iterator over the entries of a `IndexMap`.
1061
1065
///
1062
1066
/// This `struct` is created by the [`into_iter`] method on [`IndexMap`]
@@ -1075,9 +1079,7 @@ impl<K, V> Iterator for IntoIter<K, V> {
1075
1079
}
1076
1080
1077
1081
impl < 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) ;
1081
1083
}
1082
1084
1083
1085
impl < K , V > ExactSizeIterator for IntoIter < K , V > {
@@ -1086,6 +1088,8 @@ impl<K, V> ExactSizeIterator for IntoIter<K, V> {
1086
1088
}
1087
1089
}
1088
1090
1091
+ impl < K , V > FusedIterator for IntoIter < K , V > { }
1092
+
1089
1093
impl < K : fmt:: Debug , V : fmt:: Debug > fmt:: Debug for IntoIter < K , V > {
1090
1094
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
1091
1095
let iter = self . iter . as_slice ( ) . iter ( ) . map ( Bucket :: refs) ;
@@ -1114,6 +1118,21 @@ impl<K, V> DoubleEndedIterator for Drain<'_, K, V> {
1114
1118
double_ended_iterator_methods ! ( Bucket :: key_value) ;
1115
1119
}
1116
1120
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
+
1117
1136
impl < ' a , K , V , S > IntoIterator for & ' a IndexMap < K , V , S > {
1118
1137
type Item = ( & ' a K , & ' a V ) ;
1119
1138
type IntoIter = Iter < ' a , K , V > ;
0 commit comments