@@ -493,39 +493,38 @@ impl<T, const CAP: usize> ArrayVec<T, CAP> {
493
493
494
494
let mut g = BackshiftOnDrop { v : self , processed_len : 0 , deleted_cnt : 0 , original_len } ;
495
495
496
- # [ inline ( always ) ]
497
- fn process_one < F : FnMut ( & mut T ) -> bool , T , const CAP : usize , const DELETED : bool > (
496
+ fn process_loop < F : FnMut ( & mut T ) -> bool , T , const CAP : usize , const DELETED : bool > (
497
+ original_len : usize ,
498
498
f : & mut F ,
499
499
g : & mut BackshiftOnDrop < ' _ , T , CAP >
500
- ) -> bool {
501
- let cur = unsafe { g. v . as_mut_ptr ( ) . add ( g. processed_len ) } ;
502
- if !f ( unsafe { & mut * cur } ) {
503
- g. processed_len += 1 ;
504
- g. deleted_cnt += 1 ;
505
- unsafe { ptr:: drop_in_place ( cur) } ;
506
- return false ;
507
- }
508
- if DELETED {
509
- unsafe {
510
- let hole_slot = g. v . as_mut_ptr ( ) . add ( g. processed_len - g. deleted_cnt ) ;
511
- ptr:: copy_nonoverlapping ( cur, hole_slot, 1 ) ;
500
+ ) {
501
+ while g. processed_len != original_len {
502
+ let cur = unsafe { & mut * g. v . as_mut_ptr ( ) . add ( g. processed_len ) } ;
503
+ if !f ( cur) {
504
+ g. processed_len += 1 ;
505
+ g. deleted_cnt += 1 ;
506
+ unsafe { ptr:: drop_in_place ( cur) } ;
507
+ if DELETED {
508
+ continue ;
509
+ } else {
510
+ break ;
511
+ }
512
+ }
513
+ if DELETED {
514
+ unsafe {
515
+ let hole_slot = g. v . as_mut_ptr ( ) . add ( g. processed_len - g. deleted_cnt ) ;
516
+ ptr:: copy_nonoverlapping ( cur, hole_slot, 1 ) ;
517
+ }
512
518
}
519
+ g. processed_len += 1 ;
513
520
}
514
- g. processed_len += 1 ;
515
- true
516
521
}
517
522
518
523
// Stage 1: Nothing was deleted.
519
- while g. processed_len != original_len {
520
- if !process_one :: < F , T , CAP , false > ( & mut f, & mut g) {
521
- break ;
522
- }
523
- }
524
+ process_loop :: < F , T , CAP , false > ( original_len, & mut f, & mut g) ;
524
525
525
526
// Stage 2: Some elements were deleted.
526
- while g. processed_len != original_len {
527
- process_one :: < F , T , CAP , true > ( & mut f, & mut g) ;
528
- }
527
+ process_loop :: < F , T , CAP , true > ( original_len, & mut f, & mut g) ;
529
528
530
529
drop ( g) ;
531
530
}
0 commit comments