@@ -29,33 +29,6 @@ impl<I> Fuse<I> {
29
29
#[ stable( feature = "fused" , since = "1.26.0" ) ]
30
30
impl < I > FusedIterator for Fuse < I > where I : Iterator { }
31
31
32
- /// Fuse the iterator if the expression is `None`.
33
- macro_rules! fuse {
34
- ( $self: ident . iter . $( $call: tt) +) => {
35
- match $self. iter {
36
- Some ( ref mut iter) => match iter. $( $call) + {
37
- None => {
38
- $self. iter = None ;
39
- None
40
- }
41
- item => item,
42
- } ,
43
- None => None ,
44
- }
45
- } ;
46
- }
47
-
48
- /// Specialized macro that doesn't check if the expression is `None`.
49
- /// (We trust that a `FusedIterator` will fuse itself.)
50
- macro_rules! spec {
51
- ( $self: ident . iter . $( $call: tt) +) => {
52
- match $self. iter {
53
- Some ( ref mut iter) => iter. $( $call) +,
54
- None => None ,
55
- }
56
- } ;
57
- }
58
-
59
32
// Any specialized implementation here is made internal
60
33
// to avoid exposing default fns outside this trait.
61
34
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -281,12 +254,12 @@ where
281
254
282
255
#[ inline]
283
256
default fn next ( & mut self ) -> Option < <I as Iterator >:: Item > {
284
- fuse ! ( self . iter. next( ) )
257
+ and_then_or_clear ( & mut self . iter , Iterator :: next)
285
258
}
286
259
287
260
#[ inline]
288
261
default fn nth ( & mut self , n : usize ) -> Option < I :: Item > {
289
- fuse ! ( self . iter. nth( n) )
262
+ and_then_or_clear ( & mut self . iter , |iter| iter. nth ( n) )
290
263
}
291
264
292
265
#[ inline]
@@ -308,23 +281,23 @@ where
308
281
where
309
282
P : FnMut ( & Self :: Item ) -> bool ,
310
283
{
311
- fuse ! ( self . iter. find( predicate) )
284
+ and_then_or_clear ( & mut self . iter , |iter| iter. find ( predicate) )
312
285
}
313
286
314
287
#[ inline]
315
288
default fn next_back ( & mut self ) -> Option < <I as Iterator >:: Item >
316
289
where
317
290
I : DoubleEndedIterator ,
318
291
{
319
- fuse ! ( self . iter. next_back( ) )
292
+ and_then_or_clear ( & mut self . iter , |iter| iter. next_back ( ) )
320
293
}
321
294
322
295
#[ inline]
323
296
default fn nth_back ( & mut self , n : usize ) -> Option < <I as Iterator >:: Item >
324
297
where
325
298
I : DoubleEndedIterator ,
326
299
{
327
- fuse ! ( self . iter. nth_back( n) )
300
+ and_then_or_clear ( & mut self . iter , |iter| iter. nth_back ( n) )
328
301
}
329
302
330
303
#[ inline]
@@ -348,7 +321,7 @@ where
348
321
P : FnMut ( & Self :: Item ) -> bool ,
349
322
I : DoubleEndedIterator ,
350
323
{
351
- fuse ! ( self . iter. rfind( predicate) )
324
+ and_then_or_clear ( & mut self . iter , |iter| iter. rfind ( predicate) )
352
325
}
353
326
}
354
327
@@ -361,12 +334,12 @@ where
361
334
{
362
335
#[ inline]
363
336
fn next ( & mut self ) -> Option < <I as Iterator >:: Item > {
364
- spec ! ( self . iter. next ( ) )
337
+ self . iter . as_mut ( ) ? . next ( )
365
338
}
366
339
367
340
#[ inline]
368
341
fn nth ( & mut self , n : usize ) -> Option < I :: Item > {
369
- spec ! ( self . iter. nth( n) )
342
+ self . iter . as_mut ( ) ? . nth ( n)
370
343
}
371
344
372
345
#[ inline]
@@ -387,23 +360,23 @@ where
387
360
where
388
361
P : FnMut ( & Self :: Item ) -> bool ,
389
362
{
390
- spec ! ( self . iter. find( predicate) )
363
+ self . iter . as_mut ( ) ? . find ( predicate)
391
364
}
392
365
393
366
#[ inline]
394
367
fn next_back ( & mut self ) -> Option < <I as Iterator >:: Item >
395
368
where
396
369
I : DoubleEndedIterator ,
397
370
{
398
- spec ! ( self . iter. next_back ( ) )
371
+ self . iter . as_mut ( ) ? . next_back ( )
399
372
}
400
373
401
374
#[ inline]
402
375
fn nth_back ( & mut self , n : usize ) -> Option < <I as Iterator >:: Item >
403
376
where
404
377
I : DoubleEndedIterator ,
405
378
{
406
- spec ! ( self . iter. nth_back( n) )
379
+ self . iter . as_mut ( ) ? . nth_back ( n)
407
380
}
408
381
409
382
#[ inline]
@@ -426,6 +399,15 @@ where
426
399
P : FnMut ( & Self :: Item ) -> bool ,
427
400
I : DoubleEndedIterator ,
428
401
{
429
- spec ! ( self . iter. rfind( predicate) )
402
+ self . iter . as_mut ( ) ?. rfind ( predicate)
403
+ }
404
+ }
405
+
406
+ #[ inline]
407
+ fn and_then_or_clear < T , U > ( opt : & mut Option < T > , f : impl FnOnce ( & mut T ) -> Option < U > ) -> Option < U > {
408
+ let x = f ( opt. as_mut ( ) ?) ;
409
+ if x. is_none ( ) {
410
+ * opt = None ;
430
411
}
412
+ x
431
413
}
0 commit comments