Skip to content

Commit 5b04c16

Browse files
committed
Auto merge of #24879 - Stebalien:vec_deque, r=alexcrichton
According to rust-lang/rfcs#235, `VecDeque` should have this method (`VecDeque` was called `RingBuf` at the time) but it was never implemented. I marked this stable since "1.0.0" because it's stable in `Vec`.
2 parents 7bd7163 + decf395 commit 5b04c16

File tree

3 files changed

+46
-0
lines changed

3 files changed

+46
-0
lines changed

src/libcollections/vec_deque.rs

+36
Original file line numberDiff line numberDiff line change
@@ -1395,6 +1395,42 @@ impl<T> VecDeque<T> {
13951395
// naive impl
13961396
self.extend(other.drain());
13971397
}
1398+
1399+
/// Retains only the elements specified by the predicate.
1400+
///
1401+
/// In other words, remove all elements `e` such that `f(&e)` returns false.
1402+
/// This method operates in place and preserves the order of the retained
1403+
/// elements.
1404+
///
1405+
/// # Examples
1406+
///
1407+
/// ```
1408+
/// # #![feature(vec_deque_retain)]
1409+
/// use std::collections::VecDeque;
1410+
///
1411+
/// let mut buf = VecDeque::new();
1412+
/// buf.extend(1..5);
1413+
/// buf.retain(|&x| x%2 == 0);
1414+
///
1415+
/// let v: Vec<_> = buf.into_iter().collect();
1416+
/// assert_eq!(&v[..], &[2, 4]);
1417+
/// ```
1418+
#[unstable(feature = "vec_deque_retain",
1419+
reason = "new API, waiting for dust to settle")]
1420+
pub fn retain<F>(&mut self, mut f: F) where F: FnMut(&T) -> bool {
1421+
let len = self.len();
1422+
let mut del = 0;
1423+
for i in 0..len {
1424+
if !f(&self[i]) {
1425+
del += 1;
1426+
} else if del > 0 {
1427+
self.swap(i-del, i);
1428+
}
1429+
}
1430+
if del > 0 {
1431+
self.truncate(len - del);
1432+
}
1433+
}
13981434
}
13991435

14001436
impl<T: Clone> VecDeque<T> {

src/libcollectionstest/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#![feature(into_cow)]
2222
#![feature(step_by)]
2323
#![cfg_attr(test, feature(str_char))]
24+
#![cfg_attr(test, feature(vec_deque_retain))]
2425

2526
#[macro_use] extern crate log;
2627

src/libcollectionstest/vec_deque.rs

+9
Original file line numberDiff line numberDiff line change
@@ -885,3 +885,12 @@ fn test_append() {
885885
assert_eq!(b.iter().cloned().collect::<Vec<_>>(), [1, 2, 3, 4, 5, 6]);
886886
assert_eq!(a.iter().cloned().collect::<Vec<_>>(), []);
887887
}
888+
889+
#[test]
890+
fn test_retain() {
891+
let mut buf = VecDeque::new();
892+
buf.extend(1..5);
893+
buf.retain(|&x| x % 2 == 0);
894+
let v: Vec<_> = buf.into_iter().collect();
895+
assert_eq!(&v[..], &[2, 4]);
896+
}

0 commit comments

Comments
 (0)