@@ -188,34 +188,16 @@ where
188
188
}
189
189
}
190
190
191
- // NOTE: for `I: FusedIterator`, we assume that the iterator is always `Some`
192
- impl < I : FusedIterator > Fuse < I > {
193
- # [ inline ( always ) ]
194
- fn as_inner ( & self ) -> & I {
195
- match self . iter {
196
- Some ( ref iter) => iter,
191
+ // NOTE: for `I: FusedIterator`, we assume that the iterator is always `Some`.
192
+ // Implementing this as a directly-expanded macro helps codegen performance.
193
+ macro_rules! unchecked {
194
+ ( $ self: ident ) => {
195
+ match $ self {
196
+ Fuse { iter : Some ( iter) } => iter,
197
197
// SAFETY: the specialized iterator never sets `None`
198
- None => unsafe { intrinsics:: unreachable ( ) } ,
198
+ Fuse { iter : None } => unsafe { intrinsics:: unreachable( ) } ,
199
199
}
200
- }
201
-
202
- #[ inline( always) ]
203
- fn as_inner_mut ( & mut self ) -> & mut I {
204
- match self . iter {
205
- Some ( ref mut iter) => iter,
206
- // SAFETY: the specialized iterator never sets `None`
207
- None => unsafe { intrinsics:: unreachable ( ) } ,
208
- }
209
- }
210
-
211
- #[ inline( always) ]
212
- fn into_inner ( self ) -> I {
213
- match self . iter {
214
- Some ( iter) => iter,
215
- // SAFETY: the specialized iterator never sets `None`
216
- None => unsafe { intrinsics:: unreachable ( ) } ,
217
- }
218
- }
200
+ } ;
219
201
}
220
202
221
203
#[ stable( feature = "fused" , since = "1.26.0" ) ]
@@ -225,27 +207,27 @@ where
225
207
{
226
208
#[ inline]
227
209
fn next ( & mut self ) -> Option < <I as Iterator >:: Item > {
228
- self . as_inner_mut ( ) . next ( )
210
+ unchecked ! ( self ) . next ( )
229
211
}
230
212
231
213
#[ inline]
232
214
fn nth ( & mut self , n : usize ) -> Option < I :: Item > {
233
- self . as_inner_mut ( ) . nth ( n)
215
+ unchecked ! ( self ) . nth ( n)
234
216
}
235
217
236
218
#[ inline]
237
219
fn last ( self ) -> Option < I :: Item > {
238
- self . into_inner ( ) . last ( )
220
+ unchecked ! ( self ) . last ( )
239
221
}
240
222
241
223
#[ inline]
242
224
fn count ( self ) -> usize {
243
- self . into_inner ( ) . count ( )
225
+ unchecked ! ( self ) . count ( )
244
226
}
245
227
246
228
#[ inline]
247
229
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
248
- self . as_inner ( ) . size_hint ( )
230
+ unchecked ! ( self ) . size_hint ( )
249
231
}
250
232
251
233
#[ inline]
@@ -255,23 +237,23 @@ where
255
237
Fold : FnMut ( Acc , Self :: Item ) -> R ,
256
238
R : Try < Ok = Acc > ,
257
239
{
258
- self . as_inner_mut ( ) . try_fold ( init, fold)
240
+ unchecked ! ( self ) . try_fold ( init, fold)
259
241
}
260
242
261
243
#[ inline]
262
244
fn fold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
263
245
where
264
246
Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
265
247
{
266
- self . into_inner ( ) . fold ( init, fold)
248
+ unchecked ! ( self ) . fold ( init, fold)
267
249
}
268
250
269
251
#[ inline]
270
252
fn find < P > ( & mut self , predicate : P ) -> Option < Self :: Item >
271
253
where
272
254
P : FnMut ( & Self :: Item ) -> bool ,
273
255
{
274
- self . as_inner_mut ( ) . find ( predicate)
256
+ unchecked ! ( self ) . find ( predicate)
275
257
}
276
258
}
277
259
@@ -282,12 +264,12 @@ where
282
264
{
283
265
#[ inline]
284
266
fn next_back ( & mut self ) -> Option < <I as Iterator >:: Item > {
285
- self . as_inner_mut ( ) . next_back ( )
267
+ unchecked ! ( self ) . next_back ( )
286
268
}
287
269
288
270
#[ inline]
289
271
fn nth_back ( & mut self , n : usize ) -> Option < <I as Iterator >:: Item > {
290
- self . as_inner_mut ( ) . nth_back ( n)
272
+ unchecked ! ( self ) . nth_back ( n)
291
273
}
292
274
293
275
#[ inline]
@@ -297,23 +279,23 @@ where
297
279
Fold : FnMut ( Acc , Self :: Item ) -> R ,
298
280
R : Try < Ok = Acc > ,
299
281
{
300
- self . as_inner_mut ( ) . try_rfold ( init, fold)
282
+ unchecked ! ( self ) . try_rfold ( init, fold)
301
283
}
302
284
303
285
#[ inline]
304
286
fn rfold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
305
287
where
306
288
Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
307
289
{
308
- self . into_inner ( ) . rfold ( init, fold)
290
+ unchecked ! ( self ) . rfold ( init, fold)
309
291
}
310
292
311
293
#[ inline]
312
294
fn rfind < P > ( & mut self , predicate : P ) -> Option < Self :: Item >
313
295
where
314
296
P : FnMut ( & Self :: Item ) -> bool ,
315
297
{
316
- self . as_inner_mut ( ) . rfind ( predicate)
298
+ unchecked ! ( self ) . rfind ( predicate)
317
299
}
318
300
}
319
301
@@ -323,11 +305,11 @@ where
323
305
I : ExactSizeIterator + FusedIterator ,
324
306
{
325
307
fn len ( & self ) -> usize {
326
- self . as_inner ( ) . len ( )
308
+ unchecked ! ( self ) . len ( )
327
309
}
328
310
329
311
fn is_empty ( & self ) -> bool {
330
- self . as_inner ( ) . is_empty ( )
312
+ unchecked ! ( self ) . is_empty ( )
331
313
}
332
314
}
333
315
0 commit comments