1
1
use crate :: cmp;
2
2
use crate :: fmt;
3
- use crate :: ops:: Try ;
3
+ use crate :: ops:: { Add , AddAssign , Try } ;
4
4
use crate :: usize;
5
5
use crate :: intrinsics;
6
6
@@ -994,14 +994,12 @@ impl<I> Iterator for Enumerate<I> where I: Iterator {
994
994
///
995
995
/// Might panic if the index of the element overflows a `usize`.
996
996
#[ inline]
997
- #[ rustc_inherit_overflow_checks]
998
997
fn next ( & mut self ) -> Option < ( usize , <I as Iterator >:: Item ) > {
999
- self . iter . next ( ) . map ( |a| {
1000
- let ret = ( self . count , a) ;
1001
- // Possible undefined overflow.
1002
- self . count += 1 ;
1003
- ret
1004
- } )
998
+ let a = self . iter . next ( ) ?;
999
+ let i = self . count ;
1000
+ // Possible undefined overflow.
1001
+ AddAssign :: add_assign ( & mut self . count , 1 ) ;
1002
+ Some ( ( i, a) )
1005
1003
}
1006
1004
1007
1005
#[ inline]
@@ -1010,13 +1008,12 @@ impl<I> Iterator for Enumerate<I> where I: Iterator {
1010
1008
}
1011
1009
1012
1010
#[ inline]
1013
- #[ rustc_inherit_overflow_checks]
1014
1011
fn nth ( & mut self , n : usize ) -> Option < ( usize , I :: Item ) > {
1015
- self . iter . nth ( n) . map ( |a| {
1016
- let i = self . count + n ;
1017
- self . count = i + 1 ;
1018
- ( i, a )
1019
- } )
1012
+ let a = self . iter . nth ( n) ? ;
1013
+ // Possible undefined overflow.
1014
+ let i = Add :: add ( self . count , n ) ;
1015
+ self . count = Add :: add ( i, 1 ) ;
1016
+ Some ( ( i , a ) )
1020
1017
}
1021
1018
1022
1019
#[ inline]
@@ -1025,29 +1022,43 @@ impl<I> Iterator for Enumerate<I> where I: Iterator {
1025
1022
}
1026
1023
1027
1024
#[ inline]
1028
- #[ rustc_inherit_overflow_checks]
1029
- fn try_fold < Acc , Fold , R > ( & mut self , init : Acc , mut fold : Fold ) -> R where
1025
+ fn try_fold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
1030
1026
Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
1031
1027
{
1032
- let count = & mut self . count ;
1033
- self . iter . try_fold ( init, move |acc, item| {
1034
- let acc = fold ( acc, ( * count, item) ) ;
1035
- * count += 1 ;
1036
- acc
1037
- } )
1028
+ #[ inline]
1029
+ fn enumerate < ' a , T , Acc , R > (
1030
+ count : & ' a mut usize ,
1031
+ mut fold : impl FnMut ( Acc , ( usize , T ) ) -> R + ' a ,
1032
+ ) -> impl FnMut ( Acc , T ) -> R + ' a {
1033
+ move |acc, item| {
1034
+ let acc = fold ( acc, ( * count, item) ) ;
1035
+ // Possible undefined overflow.
1036
+ AddAssign :: add_assign ( count, 1 ) ;
1037
+ acc
1038
+ }
1039
+ }
1040
+
1041
+ self . iter . try_fold ( init, enumerate ( & mut self . count , fold) )
1038
1042
}
1039
1043
1040
1044
#[ inline]
1041
- #[ rustc_inherit_overflow_checks]
1042
- fn fold < Acc , Fold > ( self , init : Acc , mut fold : Fold ) -> Acc
1045
+ fn fold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
1043
1046
where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
1044
1047
{
1045
- let mut count = self . count ;
1046
- self . iter . fold ( init, move |acc, item| {
1047
- let acc = fold ( acc, ( count, item) ) ;
1048
- count += 1 ;
1049
- acc
1050
- } )
1048
+ #[ inline]
1049
+ fn enumerate < T , Acc > (
1050
+ mut count : usize ,
1051
+ mut fold : impl FnMut ( Acc , ( usize , T ) ) -> Acc ,
1052
+ ) -> impl FnMut ( Acc , T ) -> Acc {
1053
+ move |acc, item| {
1054
+ let acc = fold ( acc, ( count, item) ) ;
1055
+ // Possible undefined overflow.
1056
+ AddAssign :: add_assign ( & mut count, 1 ) ;
1057
+ acc
1058
+ }
1059
+ }
1060
+
1061
+ self . iter . fold ( init, enumerate ( self . count , fold) )
1051
1062
}
1052
1063
}
1053
1064
@@ -1057,48 +1068,60 @@ impl<I> DoubleEndedIterator for Enumerate<I> where
1057
1068
{
1058
1069
#[ inline]
1059
1070
fn next_back ( & mut self ) -> Option < ( usize , <I as Iterator >:: Item ) > {
1060
- self . iter . next_back ( ) . map ( |a| {
1061
- let len = self . iter . len ( ) ;
1062
- // Can safely add, `ExactSizeIterator` promises that the number of
1063
- // elements fits into a `usize`.
1064
- ( self . count + len, a)
1065
- } )
1071
+ let a = self . iter . next_back ( ) ?;
1072
+ let len = self . iter . len ( ) ;
1073
+ // Can safely add, `ExactSizeIterator` promises that the number of
1074
+ // elements fits into a `usize`.
1075
+ Some ( ( self . count + len, a) )
1066
1076
}
1067
1077
1068
1078
#[ inline]
1069
1079
fn nth_back ( & mut self , n : usize ) -> Option < ( usize , <I as Iterator >:: Item ) > {
1070
- self . iter . nth_back ( n) . map ( |a| {
1071
- let len = self . iter . len ( ) ;
1072
- // Can safely add, `ExactSizeIterator` promises that the number of
1073
- // elements fits into a `usize`.
1074
- ( self . count + len, a)
1075
- } )
1080
+ let a = self . iter . nth_back ( n) ?;
1081
+ let len = self . iter . len ( ) ;
1082
+ // Can safely add, `ExactSizeIterator` promises that the number of
1083
+ // elements fits into a `usize`.
1084
+ Some ( ( self . count + len, a) )
1076
1085
}
1077
1086
1078
1087
#[ inline]
1079
- fn try_rfold < Acc , Fold , R > ( & mut self , init : Acc , mut fold : Fold ) -> R where
1088
+ fn try_rfold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
1080
1089
Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
1081
1090
{
1082
1091
// Can safely add and subtract the count, as `ExactSizeIterator` promises
1083
1092
// that the number of elements fits into a `usize`.
1084
- let mut count = self . count + self . iter . len ( ) ;
1085
- self . iter . try_rfold ( init, move |acc, item| {
1086
- count -= 1 ;
1087
- fold ( acc, ( count, item) )
1088
- } )
1093
+ fn enumerate < T , Acc , R > (
1094
+ mut count : usize ,
1095
+ mut fold : impl FnMut ( Acc , ( usize , T ) ) -> R ,
1096
+ ) -> impl FnMut ( Acc , T ) -> R {
1097
+ move |acc, item| {
1098
+ count -= 1 ;
1099
+ fold ( acc, ( count, item) )
1100
+ }
1101
+ }
1102
+
1103
+ let count = self . count + self . iter . len ( ) ;
1104
+ self . iter . try_rfold ( init, enumerate ( count, fold) )
1089
1105
}
1090
1106
1091
1107
#[ inline]
1092
- fn rfold < Acc , Fold > ( self , init : Acc , mut fold : Fold ) -> Acc
1108
+ fn rfold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
1093
1109
where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
1094
1110
{
1095
1111
// Can safely add and subtract the count, as `ExactSizeIterator` promises
1096
1112
// that the number of elements fits into a `usize`.
1097
- let mut count = self . count + self . iter . len ( ) ;
1098
- self . iter . rfold ( init, move |acc, item| {
1099
- count -= 1 ;
1100
- fold ( acc, ( count, item) )
1101
- } )
1113
+ fn enumerate < T , Acc > (
1114
+ mut count : usize ,
1115
+ mut fold : impl FnMut ( Acc , ( usize , T ) ) -> Acc ,
1116
+ ) -> impl FnMut ( Acc , T ) -> Acc {
1117
+ move |acc, item| {
1118
+ count -= 1 ;
1119
+ fold ( acc, ( count, item) )
1120
+ }
1121
+ }
1122
+
1123
+ let count = self . count + self . iter . len ( ) ;
1124
+ self . iter . rfold ( init, enumerate ( count, fold) )
1102
1125
}
1103
1126
}
1104
1127
0 commit comments