@@ -27,10 +27,7 @@ pub trait Step: PartialOrd + Sized {
27
27
///
28
28
/// Returns `None` if it is not possible to calculate `steps_between`
29
29
/// without overflow.
30
- fn steps_between ( start : & Self , end : & Self , by : & Self ) -> Option < usize > ;
31
-
32
- /// Same as `steps_between`, but with a `by` of 1
33
- fn steps_between_by_one ( start : & Self , end : & Self ) -> Option < usize > ;
30
+ fn steps_between ( start : & Self , end : & Self ) -> Option < usize > ;
34
31
35
32
/// Replaces this step with `1`, returning itself
36
33
fn replace_one ( & mut self ) -> Self ;
@@ -53,17 +50,10 @@ macro_rules! step_impl_unsigned {
53
50
impl Step for $t {
54
51
#[ inline]
55
52
#[ allow( trivial_numeric_casts) ]
56
- fn steps_between( start: & $t, end: & $t, by: & $t) -> Option <usize > {
57
- if * by == 0 { return None ; }
53
+ fn steps_between( start: & $t, end: & $t) -> Option <usize > {
58
54
if * start < * end {
59
55
// Note: We assume $t <= usize here
60
- let diff = ( * end - * start) as usize ;
61
- let by = * by as usize ;
62
- if diff % by > 0 {
63
- Some ( diff / by + 1 )
64
- } else {
65
- Some ( diff / by)
66
- }
56
+ Some ( ( * end - * start) as usize )
67
57
} else {
68
58
Some ( 0 )
69
59
}
@@ -88,11 +78,6 @@ macro_rules! step_impl_unsigned {
88
78
fn sub_one( & self ) -> Self {
89
79
Sub :: sub( * self , 1 )
90
80
}
91
-
92
- #[ inline]
93
- fn steps_between_by_one( start: & Self , end: & Self ) -> Option <usize > {
94
- Self :: steps_between( start, end, & 1 )
95
- }
96
81
}
97
82
) * )
98
83
}
@@ -104,30 +89,14 @@ macro_rules! step_impl_signed {
104
89
impl Step for $t {
105
90
#[ inline]
106
91
#[ allow( trivial_numeric_casts) ]
107
- fn steps_between( start: & $t, end: & $t, by: & $t) -> Option <usize > {
108
- if * by == 0 { return None ; }
109
- let diff: usize ;
110
- let by_u: usize ;
111
- if * by > 0 {
112
- if * start >= * end {
113
- return Some ( 0 ) ;
114
- }
92
+ fn steps_between( start: & $t, end: & $t) -> Option <usize > {
93
+ if * start < * end {
115
94
// Note: We assume $t <= isize here
116
95
// Use .wrapping_sub and cast to usize to compute the
117
96
// difference that may not fit inside the range of isize.
118
- diff = ( * end as isize ) . wrapping_sub( * start as isize ) as usize ;
119
- by_u = * by as usize ;
120
- } else {
121
- if * start <= * end {
122
- return Some ( 0 ) ;
123
- }
124
- diff = ( * start as isize ) . wrapping_sub( * end as isize ) as usize ;
125
- by_u = ( * by as isize ) . wrapping_mul( -1 ) as usize ;
126
- }
127
- if diff % by_u > 0 {
128
- Some ( diff / by_u + 1 )
97
+ Some ( ( * end as isize ) . wrapping_sub( * start as isize ) as usize )
129
98
} else {
130
- Some ( diff / by_u )
99
+ Some ( 0 )
131
100
}
132
101
}
133
102
@@ -150,11 +119,6 @@ macro_rules! step_impl_signed {
150
119
fn sub_one( & self ) -> Self {
151
120
Sub :: sub( * self , 1 )
152
121
}
153
-
154
- #[ inline]
155
- fn steps_between_by_one( start: & Self , end: & Self ) -> Option <usize > {
156
- Self :: steps_between( start, end, & 1 )
157
- }
158
122
}
159
123
) * )
160
124
}
@@ -166,7 +130,7 @@ macro_rules! step_impl_no_between {
166
130
issue = "42168" ) ]
167
131
impl Step for $t {
168
132
#[ inline]
169
- fn steps_between( _a : & $t , _b : & $t , _by : & $t ) -> Option <usize > {
133
+ fn steps_between( _start : & Self , _end : & Self ) -> Option <usize > {
170
134
None
171
135
}
172
136
@@ -189,11 +153,6 @@ macro_rules! step_impl_no_between {
189
153
fn sub_one( & self ) -> Self {
190
154
Sub :: sub( * self , 1 )
191
155
}
192
-
193
- #[ inline]
194
- fn steps_between_by_one( start: & Self , end: & Self ) -> Option <usize > {
195
- Self :: steps_between( start, end, & 1 )
196
- }
197
156
}
198
157
) * )
199
158
}
@@ -259,7 +218,7 @@ impl<A: Step> Iterator for ops::Range<A> {
259
218
260
219
#[ inline]
261
220
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
262
- match Step :: steps_between_by_one ( & self . start , & self . end ) {
221
+ match Step :: steps_between ( & self . start , & self . end ) {
263
222
Some ( hint) => ( hint, Some ( hint) ) ,
264
223
None => ( 0 , None )
265
224
}
@@ -344,7 +303,7 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
344
303
return ( 0 , Some ( 0 ) ) ;
345
304
}
346
305
347
- match Step :: steps_between_by_one ( & self . start , & self . end ) {
306
+ match Step :: steps_between ( & self . start , & self . end ) {
348
307
Some ( hint) => ( hint. saturating_add ( 1 ) , hint. checked_add ( 1 ) ) ,
349
308
None => ( 0 , None ) ,
350
309
}
0 commit comments