@@ -381,29 +381,43 @@ impl<T, R> CollectAndApply<T, R> for T {
381381 I : Iterator < Item = T > ,
382382 F : FnOnce ( & [ T ] ) -> R ,
383383 {
384- // This code is hot enough that it's worth specializing for the most
385- // common length lists, to avoid the overhead of `SmallVec` creation.
386- // Lengths 0, 1, and 2 typically account for ~95% of cases. If
387- // `size_hint` is incorrect a panic will occur via an `unwrap` or an
388- // `assert`.
389- match iter. size_hint ( ) {
390- ( 0 , Some ( 0 ) ) => {
391- assert ! ( iter. next( ) . is_none( ) ) ;
392- f ( & [ ] )
393- }
394- ( 1 , Some ( 1 ) ) => {
395- let t0 = iter. next ( ) . unwrap ( ) ;
396- assert ! ( iter. next( ) . is_none( ) ) ;
397- f ( & [ t0] )
398- }
399- ( 2 , Some ( 2 ) ) => {
400- let t0 = iter. next ( ) . unwrap ( ) ;
401- let t1 = iter. next ( ) . unwrap ( ) ;
402- assert ! ( iter. next( ) . is_none( ) ) ;
403- f ( & [ t0, t1] )
404- }
405- _ => f ( & iter. collect :: < SmallVec < [ _ ; 8 ] > > ( ) ) ,
406- }
384+ let Some ( t0) = iter. next ( ) else {
385+ return f ( & [ ] ) ;
386+ } ;
387+
388+ let Some ( t1) = iter. next ( ) else {
389+ return f ( & [ t0] ) ;
390+ } ;
391+
392+ let Some ( t2) = iter. next ( ) else {
393+ return f ( & [ t0, t1] ) ;
394+ } ;
395+
396+ let Some ( t3) = iter. next ( ) else {
397+ return f ( & [ t0, t1, t2] ) ;
398+ } ;
399+
400+ let Some ( t4) = iter. next ( ) else {
401+ return f ( & [ t0, t1, t2, t3] ) ;
402+ } ;
403+
404+ let Some ( t5) = iter. next ( ) else {
405+ return f ( & [ t0, t1, t2, t3, t4] ) ;
406+ } ;
407+
408+ let Some ( t6) = iter. next ( ) else {
409+ return f ( & [ t0, t1, t2, t3, t4, t5] ) ;
410+ } ;
411+
412+ let Some ( t7) = iter. next ( ) else {
413+ return f ( & [ t0, t1, t2, t3, t4, t5, t6] ) ;
414+ } ;
415+
416+ let Some ( t8) = iter. next ( ) else {
417+ return f ( & [ t0, t1, t2, t3, t4, t5, t6, t7] ) ;
418+ } ;
419+
420+ f ( & [ t0, t1, t2, t3, t4, t5, t6, t7, t8] . into_iter ( ) . chain ( iter) . collect :: < Vec < _ > > ( ) )
407421 }
408422}
409423
@@ -440,6 +454,51 @@ impl<T, R, E> CollectAndApply<T, R> for Result<T, E> {
440454 assert ! ( iter. next( ) . is_none( ) ) ;
441455 f ( & [ t0, t1] )
442456 }
457+ ( 3 , Some ( 3 ) ) => {
458+ let t0 = iter. next ( ) . unwrap ( ) ?;
459+ let t1 = iter. next ( ) . unwrap ( ) ?;
460+ let t2 = iter. next ( ) . unwrap ( ) ?;
461+ assert ! ( iter. next( ) . is_none( ) ) ;
462+ f ( & [ t0, t1, t2] )
463+ }
464+ ( 4 , Some ( 4 ) ) => {
465+ let t0 = iter. next ( ) . unwrap ( ) ?;
466+ let t1 = iter. next ( ) . unwrap ( ) ?;
467+ let t2 = iter. next ( ) . unwrap ( ) ?;
468+ let t3 = iter. next ( ) . unwrap ( ) ?;
469+ assert ! ( iter. next( ) . is_none( ) ) ;
470+ f ( & [ t0, t1, t2, t3] )
471+ }
472+ ( 5 , Some ( 5 ) ) => {
473+ let t0 = iter. next ( ) . unwrap ( ) ?;
474+ let t1 = iter. next ( ) . unwrap ( ) ?;
475+ let t2 = iter. next ( ) . unwrap ( ) ?;
476+ let t3 = iter. next ( ) . unwrap ( ) ?;
477+ let t4 = iter. next ( ) . unwrap ( ) ?;
478+ assert ! ( iter. next( ) . is_none( ) ) ;
479+ f ( & [ t0, t1, t2, t3, t4] )
480+ }
481+ ( 6 , Some ( 6 ) ) => {
482+ let t0 = iter. next ( ) . unwrap ( ) ?;
483+ let t1 = iter. next ( ) . unwrap ( ) ?;
484+ let t2 = iter. next ( ) . unwrap ( ) ?;
485+ let t3 = iter. next ( ) . unwrap ( ) ?;
486+ let t4 = iter. next ( ) . unwrap ( ) ?;
487+ let t5 = iter. next ( ) . unwrap ( ) ?;
488+ assert ! ( iter. next( ) . is_none( ) ) ;
489+ f ( & [ t0, t1, t2, t3, t4, t5] )
490+ }
491+ ( 7 , Some ( 7 ) ) => {
492+ let t0 = iter. next ( ) . unwrap ( ) ?;
493+ let t1 = iter. next ( ) . unwrap ( ) ?;
494+ let t2 = iter. next ( ) . unwrap ( ) ?;
495+ let t3 = iter. next ( ) . unwrap ( ) ?;
496+ let t4 = iter. next ( ) . unwrap ( ) ?;
497+ let t5 = iter. next ( ) . unwrap ( ) ?;
498+ let t6 = iter. next ( ) . unwrap ( ) ?;
499+ assert ! ( iter. next( ) . is_none( ) ) ;
500+ f ( & [ t0, t1, t2, t3, t4, t5, t6] )
501+ }
443502 _ => f ( & iter. collect :: < Result < SmallVec < [ _ ; 8 ] > , _ > > ( ) ?) ,
444503 } )
445504 }
0 commit comments