Skip to content

Commit c525ed5

Browse files
committed
Follow simplification of Vec::retain() (rust-lang/rust#91527)
1 parent 67ec907 commit c525ed5

File tree

1 file changed

+23
-24
lines changed

1 file changed

+23
-24
lines changed

src/arrayvec.rs

+23-24
Original file line numberDiff line numberDiff line change
@@ -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 { &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+
}
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

Comments
 (0)