Skip to content

Commit 850e6a7

Browse files
committedApr 28, 2015
Implement retain for vec_deque
1 parent d8b64c7 commit 850e6a7

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed
 

‎src/libcollections/vec_deque.rs

+34
Original file line numberDiff line numberDiff line change
@@ -1396,6 +1396,40 @@ impl<T> VecDeque<T> {
13961396
// naive impl
13971397
self.extend(other.drain());
13981398
}
1399+
1400+
/// Retains only the elements specified by the predicate.
1401+
///
1402+
/// In other words, remove all elements `e` such that `f(&e)` returns false.
1403+
/// This method operates in place and preserves the order of the retained
1404+
/// elements.
1405+
///
1406+
/// # Examples
1407+
///
1408+
/// ```
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+
#[stable(feature = "vec_deque_retain", since = "1.1.0")]
1419+
pub fn retain<F>(&mut self, mut f: F) where F: FnMut(&T) -> bool {
1420+
let len = self.len();
1421+
let mut del = 0;
1422+
for i in 0..len {
1423+
if !f(&self[i]) {
1424+
del += 1;
1425+
} else if del > 0 {
1426+
self.swap(i-del, i);
1427+
}
1428+
}
1429+
if del > 0 {
1430+
self.truncate(len - del);
1431+
}
1432+
}
13991433
}
14001434

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

‎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)
Please sign in to comment.