@@ -2410,24 +2410,23 @@ impl<B, I, St, F> Iterator for Scan<I, St, F> where
2410
2410
/// [`Iterator`]: trait.Iterator.html
2411
2411
#[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
2412
2412
#[ stable( feature = "rust1" , since = "1.0.0" ) ]
2413
- #[ derive( Clone ) ]
2414
2413
pub struct FlatMap < I , U : IntoIterator , F > {
2415
- iter : I ,
2416
- f : F ,
2417
- frontiter : Option < U :: IntoIter > ,
2418
- backiter : Option < U :: IntoIter > ,
2414
+ inner : FlattenCompat < Map < I , F > , <U as IntoIterator >:: IntoIter >
2415
+ }
2416
+
2417
+ #[ stable( feature = "rust1" , since = "1.0.0" ) ]
2418
+ impl < I : Clone , U : Clone + IntoIterator , F : Clone > Clone for FlatMap < I , U , F >
2419
+ where <U as IntoIterator >:: IntoIter : Clone
2420
+ {
2421
+ fn clone ( & self ) -> Self { FlatMap { inner : self . inner . clone ( ) } }
2419
2422
}
2420
2423
2421
2424
#[ stable( feature = "core_impl_debug" , since = "1.9.0" ) ]
2422
2425
impl < I : fmt:: Debug , U : IntoIterator , F > fmt:: Debug for FlatMap < I , U , F >
2423
2426
where U :: IntoIter : fmt:: Debug
2424
2427
{
2425
2428
fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
2426
- f. debug_struct ( "FlatMap" )
2427
- . field ( "iter" , & self . iter )
2428
- . field ( "frontiter" , & self . frontiter )
2429
- . field ( "backiter" , & self . backiter )
2430
- . finish ( )
2429
+ f. debug_struct ( "FlatMap" ) . field ( "inner" , & self . inner ) . finish ( )
2431
2430
}
2432
2431
}
2433
2432
@@ -2437,17 +2436,173 @@ impl<I: Iterator, U: IntoIterator, F> Iterator for FlatMap<I, U, F>
2437
2436
{
2438
2437
type Item = U :: Item ;
2439
2438
2439
+ #[ inline]
2440
+ fn next ( & mut self ) -> Option < U :: Item > { self . inner . next ( ) }
2441
+
2442
+ #[ inline]
2443
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
2444
+
2445
+ #[ inline]
2446
+ fn try_fold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
2447
+ Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
2448
+ {
2449
+ self . inner . try_fold ( init, fold)
2450
+ }
2451
+
2452
+ #[ inline]
2453
+ fn fold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
2454
+ where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2455
+ {
2456
+ self . inner . fold ( init, fold)
2457
+ }
2458
+ }
2459
+
2460
+ #[ stable( feature = "rust1" , since = "1.0.0" ) ]
2461
+ impl < I : DoubleEndedIterator , U , F > DoubleEndedIterator for FlatMap < I , U , F >
2462
+ where F : FnMut ( I :: Item ) -> U ,
2463
+ U : IntoIterator ,
2464
+ U :: IntoIter : DoubleEndedIterator
2465
+ {
2466
+ #[ inline]
2467
+ fn next_back ( & mut self ) -> Option < U :: Item > { self . inner . next_back ( ) }
2468
+
2469
+ #[ inline]
2470
+ fn try_rfold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
2471
+ Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
2472
+ {
2473
+ self . inner . try_rfold ( init, fold)
2474
+ }
2475
+
2476
+ #[ inline]
2477
+ fn rfold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
2478
+ where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2479
+ {
2480
+ self . inner . rfold ( init, fold)
2481
+ }
2482
+ }
2483
+
2484
+ #[ unstable( feature = "fused" , issue = "35602" ) ]
2485
+ impl < I , U , F > FusedIterator for FlatMap < I , U , F >
2486
+ where I : FusedIterator , U : IntoIterator , F : FnMut ( I :: Item ) -> U { }
2487
+
2488
+ /// An iterator that flattens one level of nesting in an iterator of things
2489
+ /// that can be turned into iterators.
2490
+ ///
2491
+ /// This `struct` is created by the [`flatten`] method on [`Iterator`]. See its
2492
+ /// documentation for more.
2493
+ ///
2494
+ /// [`flatten`]: trait.Iterator.html#method.flatten
2495
+ /// [`Iterator`]: trait.Iterator.html
2496
+ #[ must_use = "iterator adaptors are lazy and do nothing unless consumed" ]
2497
+ #[ unstable( feature = "iterator_flatten" , issue = "48213" ) ]
2498
+ pub struct Flatten < I : Iterator >
2499
+ where I :: Item : IntoIterator {
2500
+ inner : FlattenCompat < I , <I :: Item as IntoIterator >:: IntoIter > ,
2501
+ }
2502
+
2503
+ #[ unstable( feature = "iterator_flatten" , issue = "48213" ) ]
2504
+ impl < I , U > fmt:: Debug for Flatten < I >
2505
+ where I : Iterator + fmt:: Debug , U : Iterator + fmt:: Debug ,
2506
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item > ,
2507
+ {
2508
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
2509
+ f. debug_struct ( "Flatten" ) . field ( "inner" , & self . inner ) . finish ( )
2510
+ }
2511
+ }
2512
+
2513
+ #[ unstable( feature = "iterator_flatten" , issue = "48213" ) ]
2514
+ impl < I , U > Clone for Flatten < I >
2515
+ where I : Iterator + Clone , U : Iterator + Clone ,
2516
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item > ,
2517
+ {
2518
+ fn clone ( & self ) -> Self { Flatten { inner : self . inner . clone ( ) } }
2519
+ }
2520
+
2521
+ #[ unstable( feature = "iterator_flatten" , issue = "48213" ) ]
2522
+ impl < I , U > Iterator for Flatten < I >
2523
+ where I : Iterator , U : Iterator ,
2524
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item >
2525
+ {
2526
+ type Item = U :: Item ;
2527
+
2528
+ #[ inline]
2529
+ fn next ( & mut self ) -> Option < U :: Item > { self . inner . next ( ) }
2530
+
2531
+ #[ inline]
2532
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) { self . inner . size_hint ( ) }
2533
+
2534
+ #[ inline]
2535
+ fn try_fold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
2536
+ Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
2537
+ {
2538
+ self . inner . try_fold ( init, fold)
2539
+ }
2540
+
2541
+ #[ inline]
2542
+ fn fold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
2543
+ where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2544
+ {
2545
+ self . inner . fold ( init, fold)
2546
+ }
2547
+ }
2548
+
2549
+ #[ unstable( feature = "iterator_flatten" , issue = "48213" ) ]
2550
+ impl < I , U > DoubleEndedIterator for Flatten < I >
2551
+ where I : DoubleEndedIterator , U : DoubleEndedIterator ,
2552
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item >
2553
+ {
2554
+ #[ inline]
2555
+ fn next_back ( & mut self ) -> Option < U :: Item > { self . inner . next_back ( ) }
2556
+
2557
+ #[ inline]
2558
+ fn try_rfold < Acc , Fold , R > ( & mut self , init : Acc , fold : Fold ) -> R where
2559
+ Self : Sized , Fold : FnMut ( Acc , Self :: Item ) -> R , R : Try < Ok =Acc >
2560
+ {
2561
+ self . inner . try_rfold ( init, fold)
2562
+ }
2563
+
2564
+ #[ inline]
2565
+ fn rfold < Acc , Fold > ( self , init : Acc , fold : Fold ) -> Acc
2566
+ where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2567
+ {
2568
+ self . inner . rfold ( init, fold)
2569
+ }
2570
+ }
2571
+
2572
+ #[ unstable( feature = "fused" , issue = "35602" ) ]
2573
+ impl < I , U > FusedIterator for Flatten < I >
2574
+ where I : FusedIterator , U : Iterator ,
2575
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item > { }
2576
+
2577
+ /// Adapts an iterator by flattening it, for use in `flatten()` and `flat_map()`.
2578
+ fn flatten_compat < I , U > ( iter : I ) -> FlattenCompat < I , U > {
2579
+ FlattenCompat { iter, frontiter : None , backiter : None }
2580
+ }
2581
+
2582
+ /// Real logic of both `Flatten` and `FlatMap` which simply delegate to
2583
+ /// this type.
2584
+ #[ derive( Clone , Debug ) ]
2585
+ struct FlattenCompat < I , U > {
2586
+ iter : I ,
2587
+ frontiter : Option < U > ,
2588
+ backiter : Option < U > ,
2589
+ }
2590
+
2591
+ impl < I , U > Iterator for FlattenCompat < I , U >
2592
+ where I : Iterator , U : Iterator ,
2593
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item >
2594
+ {
2595
+ type Item = U :: Item ;
2596
+
2440
2597
#[ inline]
2441
2598
fn next ( & mut self ) -> Option < U :: Item > {
2442
2599
loop {
2443
2600
if let Some ( ref mut inner) = self . frontiter {
2444
- if let Some ( x) = inner. by_ref ( ) . next ( ) {
2445
- return Some ( x)
2446
- }
2601
+ if let elt@Some ( _) = inner. next ( ) { return elt }
2447
2602
}
2448
- match self . iter . next ( ) . map ( & mut self . f ) {
2603
+ match self . iter . next ( ) {
2449
2604
None => return self . backiter . as_mut ( ) . and_then ( |it| it. next ( ) ) ,
2450
- next => self . frontiter = next . map ( IntoIterator :: into_iter) ,
2605
+ Some ( inner ) => self . frontiter = Some ( inner . into_iter ( ) ) ,
2451
2606
}
2452
2607
}
2453
2608
}
@@ -2473,10 +2628,9 @@ impl<I: Iterator, U: IntoIterator, F> Iterator for FlatMap<I, U, F>
2473
2628
self . frontiter = None ;
2474
2629
2475
2630
{
2476
- let f = & mut self . f ;
2477
2631
let frontiter = & mut self . frontiter ;
2478
2632
init = self . iter . try_fold ( init, |acc, x| {
2479
- let mut mid = f ( x ) . into_iter ( ) ;
2633
+ let mut mid = x . into_iter ( ) ;
2480
2634
let r = mid. try_fold ( acc, & mut fold) ;
2481
2635
* frontiter = Some ( mid) ;
2482
2636
r
@@ -2497,27 +2651,23 @@ impl<I: Iterator, U: IntoIterator, F> Iterator for FlatMap<I, U, F>
2497
2651
where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2498
2652
{
2499
2653
self . frontiter . into_iter ( )
2500
- . chain ( self . iter . map ( self . f ) . map ( U :: into_iter) )
2654
+ . chain ( self . iter . map ( IntoIterator :: into_iter) )
2501
2655
. chain ( self . backiter )
2502
2656
. fold ( init, |acc, iter| iter. fold ( acc, & mut fold) )
2503
2657
}
2504
2658
}
2505
2659
2506
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
2507
- impl < I : DoubleEndedIterator , U , F > DoubleEndedIterator for FlatMap < I , U , F > where
2508
- F : FnMut ( I :: Item ) -> U ,
2509
- U : IntoIterator ,
2510
- U :: IntoIter : DoubleEndedIterator
2660
+ impl < I , U > DoubleEndedIterator for FlattenCompat < I , U >
2661
+ where I : DoubleEndedIterator , U : DoubleEndedIterator ,
2662
+ I :: Item : IntoIterator < IntoIter = U , Item = U :: Item >
2511
2663
{
2512
2664
#[ inline]
2513
2665
fn next_back ( & mut self ) -> Option < U :: Item > {
2514
2666
loop {
2515
2667
if let Some ( ref mut inner) = self . backiter {
2516
- if let Some ( y) = inner. next_back ( ) {
2517
- return Some ( y)
2518
- }
2668
+ if let elt@Some ( _) = inner. next_back ( ) { return elt }
2519
2669
}
2520
- match self . iter . next_back ( ) . map ( & mut self . f ) {
2670
+ match self . iter . next_back ( ) {
2521
2671
None => return self . frontiter . as_mut ( ) . and_then ( |it| it. next_back ( ) ) ,
2522
2672
next => self . backiter = next. map ( IntoIterator :: into_iter) ,
2523
2673
}
@@ -2534,10 +2684,9 @@ impl<I: DoubleEndedIterator, U, F> DoubleEndedIterator for FlatMap<I, U, F> wher
2534
2684
self . backiter = None ;
2535
2685
2536
2686
{
2537
- let f = & mut self . f ;
2538
2687
let backiter = & mut self . backiter ;
2539
2688
init = self . iter . try_rfold ( init, |acc, x| {
2540
- let mut mid = f ( x ) . into_iter ( ) ;
2689
+ let mut mid = x . into_iter ( ) ;
2541
2690
let r = mid. try_rfold ( acc, & mut fold) ;
2542
2691
* backiter = Some ( mid) ;
2543
2692
r
@@ -2558,16 +2707,12 @@ impl<I: DoubleEndedIterator, U, F> DoubleEndedIterator for FlatMap<I, U, F> wher
2558
2707
where Fold : FnMut ( Acc , Self :: Item ) -> Acc ,
2559
2708
{
2560
2709
self . frontiter . into_iter ( )
2561
- . chain ( self . iter . map ( self . f ) . map ( U :: into_iter) )
2710
+ . chain ( self . iter . map ( IntoIterator :: into_iter) )
2562
2711
. chain ( self . backiter )
2563
2712
. rfold ( init, |acc, iter| iter. rfold ( acc, & mut fold) )
2564
2713
}
2565
2714
}
2566
2715
2567
- #[ unstable( feature = "fused" , issue = "35602" ) ]
2568
- impl < I , U , F > FusedIterator for FlatMap < I , U , F >
2569
- where I : FusedIterator , U : IntoIterator , F : FnMut ( I :: Item ) -> U { }
2570
-
2571
2716
/// An iterator that yields `None` forever after the underlying iterator
2572
2717
/// yields `None` once.
2573
2718
///
0 commit comments