@@ -29,33 +29,6 @@ impl<I> Fuse<I> {
2929#[ stable( feature = "fused" , since = "1.26.0" ) ]
3030impl < I > FusedIterator for Fuse < I > where I : Iterator { }
3131
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-
5932// Any specialized implementation here is made internal
6033// to avoid exposing default fns outside this trait.
6134#[ stable( feature = "rust1" , since = "1.0.0" ) ]
@@ -281,12 +254,12 @@ where
281254
282255 #[ inline]
283256 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)
285258 }
286259
287260 #[ inline]
288261 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) )
290263 }
291264
292265 #[ inline]
@@ -308,23 +281,23 @@ where
308281 where
309282 P : FnMut ( & Self :: Item ) -> bool ,
310283 {
311- fuse ! ( self . iter. find( predicate) )
284+ and_then_or_clear ( & mut self . iter , |iter| iter. find ( predicate) )
312285 }
313286
314287 #[ inline]
315288 default fn next_back ( & mut self ) -> Option < <I as Iterator >:: Item >
316289 where
317290 I : DoubleEndedIterator ,
318291 {
319- fuse ! ( self . iter. next_back( ) )
292+ and_then_or_clear ( & mut self . iter , |iter| iter. next_back ( ) )
320293 }
321294
322295 #[ inline]
323296 default fn nth_back ( & mut self , n : usize ) -> Option < <I as Iterator >:: Item >
324297 where
325298 I : DoubleEndedIterator ,
326299 {
327- fuse ! ( self . iter. nth_back( n) )
300+ and_then_or_clear ( & mut self . iter , |iter| iter. nth_back ( n) )
328301 }
329302
330303 #[ inline]
@@ -348,7 +321,7 @@ where
348321 P : FnMut ( & Self :: Item ) -> bool ,
349322 I : DoubleEndedIterator ,
350323 {
351- fuse ! ( self . iter. rfind( predicate) )
324+ and_then_or_clear ( & mut self . iter , |iter| iter. rfind ( predicate) )
352325 }
353326}
354327
@@ -361,12 +334,12 @@ where
361334{
362335 #[ inline]
363336 fn next ( & mut self ) -> Option < <I as Iterator >:: Item > {
364- spec ! ( self . iter. next ( ) )
337+ self . iter . as_mut ( ) ? . next ( )
365338 }
366339
367340 #[ inline]
368341 fn nth ( & mut self , n : usize ) -> Option < I :: Item > {
369- spec ! ( self . iter. nth( n) )
342+ self . iter . as_mut ( ) ? . nth ( n)
370343 }
371344
372345 #[ inline]
@@ -387,23 +360,23 @@ where
387360 where
388361 P : FnMut ( & Self :: Item ) -> bool ,
389362 {
390- spec ! ( self . iter. find( predicate) )
363+ self . iter . as_mut ( ) ? . find ( predicate)
391364 }
392365
393366 #[ inline]
394367 fn next_back ( & mut self ) -> Option < <I as Iterator >:: Item >
395368 where
396369 I : DoubleEndedIterator ,
397370 {
398- spec ! ( self . iter. next_back ( ) )
371+ self . iter . as_mut ( ) ? . next_back ( )
399372 }
400373
401374 #[ inline]
402375 fn nth_back ( & mut self , n : usize ) -> Option < <I as Iterator >:: Item >
403376 where
404377 I : DoubleEndedIterator ,
405378 {
406- spec ! ( self . iter. nth_back( n) )
379+ self . iter . as_mut ( ) ? . nth_back ( n)
407380 }
408381
409382 #[ inline]
@@ -426,6 +399,15 @@ where
426399 P : FnMut ( & Self :: Item ) -> bool ,
427400 I : DoubleEndedIterator ,
428401 {
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 ;
430411 }
412+ x
431413}
0 commit comments