Skip to content

Commit 40ed948

Browse files
committed
Optimize retain implementation
1 parent 1e0dc3b commit 40ed948

File tree

1 file changed

+17
-19
lines changed

1 file changed

+17
-19
lines changed

soa-derive-internal/src/vec.rs

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -317,21 +317,21 @@ pub fn derive(input: &Input) -> TokenStream {
317317
#[doc = #vec_name_str]
318318
/// ::retain()`](https://doc.rust-lang.org/std/vec/struct.Vec.html#method.retain).
319319
pub fn retain<F>(&mut self, mut f: F) where F: FnMut(#ref_name) -> bool {
320-
let len = self.len();
321-
let mut del = 0;
322-
323-
{
324-
let mut slice = self.as_mut_slice();
325-
for i in 0..len {
326-
if !f(slice.get(i).unwrap()) {
327-
del += 1;
328-
} else if del > 0 {
329-
slice.swap(i - del, i);
320+
let mut slice = self.as_mut_slice();
321+
let len = slice.len();
322+
let mut write_idx = 0;
323+
324+
for read_idx in 0..len {
325+
if f(slice.get(read_idx).unwrap()) {
326+
if write_idx != read_idx {
327+
slice.swap(write_idx, read_idx);
330328
}
329+
write_idx += 1;
331330
}
332331
}
333-
if del > 0 {
334-
self.truncate(len - del);
332+
333+
if write_idx < len {
334+
self.truncate(write_idx);
335335
}
336336
}
337337

@@ -343,14 +343,12 @@ pub fn derive(input: &Input) -> TokenStream {
343343
let len = slice.len();
344344
let mut write_idx = 0;
345345

346-
{
347-
for read_idx in 0..len {
348-
if f(slice.get_mut(read_idx).unwrap()) {
349-
if write_idx != read_idx {
350-
slice.swap(write_idx, read_idx);
351-
}
352-
write_idx += 1;
346+
for read_idx in 0..len {
347+
if f(slice.get_mut(read_idx).unwrap()) {
348+
if write_idx != read_idx {
349+
slice.swap(write_idx, read_idx);
353350
}
351+
write_idx += 1;
354352
}
355353
}
356354

0 commit comments

Comments
 (0)