Add Vec::retain_mut

This commit is contained in:
Guillaume Gomez 2021-11-10 19:25:54 +01:00 committed by Guillaume Gomez
parent 1d34cb4efc
commit c15b55ace6

View file

@ -1444,6 +1444,34 @@ impl<T, A: Allocator> Vec<T, A> {
pub fn retain<F>(&mut self, mut f: F) pub fn retain<F>(&mut self, mut f: F)
where where
F: FnMut(&T) -> bool, F: FnMut(&T) -> bool,
{
self.retain_mut(|elem| f(elem));
}
/// Retains only the elements specified by the predicate, passing a mutable reference to it.
///
/// In other words, remove all elements `e` such that `f(&mut e)` returns `false`.
/// This method operates in place, visiting each element exactly once in the
/// original order, and preserves the order of the retained elements.
///
/// # Examples
///
/// ```
/// #![feature(vec_retain_mut)]
///
/// let mut vec = vec![1, 2, 3, 4];
/// vec.retain_mut(|x| if *x > 3 {
/// false
/// } else {
/// *x += 1;
/// true
/// });
/// assert_eq!(vec, [2, 3, 4]);
/// ```
#[unstable(feature = "vec_retain_mut", issue = "90829")]
pub fn retain_mut<F>(&mut self, mut f: F)
where
F: FnMut(&mut T) -> bool,
{ {
let original_len = self.len(); let original_len = self.len();
// Avoid double drop if the drop guard is not executed, // Avoid double drop if the drop guard is not executed,
@ -1496,7 +1524,7 @@ impl<T, A: Allocator> Vec<T, A> {
g: &mut BackshiftOnDrop<'_, T, A>, g: &mut BackshiftOnDrop<'_, T, A>,
) -> bool ) -> bool
where where
F: FnMut(&T) -> bool, F: FnMut(&mut T) -> bool,
{ {
// SAFETY: Unchecked element must be valid. // SAFETY: Unchecked element must be valid.
let cur = unsafe { &mut *g.v.as_mut_ptr().add(g.processed_len) }; let cur = unsafe { &mut *g.v.as_mut_ptr().add(g.processed_len) };