@@ -493,39 +493,38 @@ impl<T, const CAP: usize> ArrayVec<T, CAP> {
493493
494494 let mut g = BackshiftOnDrop { v : self , processed_len : 0 , deleted_cnt : 0 , original_len } ;
495495
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 ,
498498 f : & mut F ,
499499 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 { g. v . as_mut_ptr ( ) . add ( g. processed_len ) } ;
503+ if !f ( unsafe { & mut * 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+ }
512518 }
519+ g. processed_len += 1 ;
513520 }
514- g. processed_len += 1 ;
515- true
516521 }
517522
518523 // 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) ;
524525
525526 // 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) ;
529528
530529 drop ( g) ;
531530 }
0 commit comments