@@ -381,29 +381,43 @@ impl<T, R> CollectAndApply<T, R> for T {
381
381
I : Iterator < Item = T > ,
382
382
F : FnOnce ( & [ T ] ) -> R ,
383
383
{
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 ( & [ t1] ) ;
394
+ } ;
395
+
396
+ let Some ( t3) = iter. next ( ) else {
397
+ return f ( & [ t1, t2] ) ;
398
+ } ;
399
+
400
+ let Some ( t4) = iter. next ( ) else {
401
+ return f ( & [ t1, t2, t3] ) ;
402
+ } ;
403
+
404
+ let Some ( t5) = iter. next ( ) else {
405
+ return f ( & [ t1, t2, t3, t4] ) ;
406
+ } ;
407
+
408
+ let Some ( t6) = iter. next ( ) else {
409
+ return f ( & [ t1, t2, t3, t4, t5] ) ;
410
+ } ;
411
+
412
+ let Some ( t7) = iter. next ( ) else {
413
+ return f ( & [ t1, t2, t3, t4, t5, t6] ) ;
414
+ } ;
415
+
416
+ let Some ( t8) = iter. next ( ) else {
417
+ return f ( & [ t1, t2, t3, t4, t5, t6, t7] ) ;
418
+ } ;
419
+
420
+ f ( & [ t1, t2, t3, t4, t5, t6, t7, t8] . into_iter ( ) . chain ( iter) . collect :: < Vec < _ > > ( ) )
407
421
}
408
422
}
409
423
@@ -440,6 +454,51 @@ impl<T, R, E> CollectAndApply<T, R> for Result<T, E> {
440
454
assert ! ( iter. next( ) . is_none( ) ) ;
441
455
f ( & [ t0, t1] )
442
456
}
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
+ }
443
502
_ => f ( & iter. collect :: < Result < SmallVec < [ _ ; 8 ] > , _ > > ( ) ?) ,
444
503
} )
445
504
}
0 commit comments