pub fn retain<F>(&mut self, mut f: F)
where F: FnMut(&T) -> bool
{
- let len = self.len();
- let mut del = 0;
- {
- let v = &mut **self;
-
- for i in 0..len {
- if !f(&v[i]) {
- del += 1;
- unsafe {
- ptr::drop_in_place(&mut v[i]);
- }
- } else if del > 0 {
- let src: *const T = &v[i];
- let dst: *mut T = &mut v[i - del];
- unsafe {
- ptr::copy_nonoverlapping(src, dst, 1);
- }
- }
- }
- }
- self.len = len - del;
+ self.drain_filter(|x| !f(x));
}
/// Removes all but the first of consecutive elements in the vector that resolve to the same