copy_stack_vec/vec/array/
retain.rs

1// This file is part of copy-stack-vec.
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4// Crate import
5use crate::vec::CopyStackVec;
6
7impl<T: Copy, const N: usize> CopyStackVec<T, N> {
8    /// Retains only the elements specified by the predicate `f`, preserving order.
9    ///
10    /// The predicate is applied to each element in iteration order.
11    #[inline]
12    pub fn retain<F: FnMut(&T) -> bool>(&mut self, mut f: F) {
13        let mut write = 0;
14        for read in 0..self.len {
15            if f(&self.buf[read]) {
16                if write != read {
17                    self.buf[write] = self.buf[read];
18                }
19                write += 1;
20            }
21        }
22        self.len = write;
23    }
24}