slice: Implement .rfind() for slice iterators Iter and IterMut

Just like the forward case find, implement rfind explicitly
This commit is contained in:
Ulrik Sverdrup 2017-04-08 03:43:18 +02:00
parent 53f4bc311b
commit 5d2f270395
3 changed files with 27 additions and 0 deletions

View file

@ -1190,6 +1190,19 @@ fn next_back(&mut self) -> Option<$elem> {
}
}
}
fn rfind<F>(&mut self, mut predicate: F) -> Option<Self::Item>
where F: FnMut(&Self::Item) -> bool,
{
self.rsearch_while(None, move |elt| {
if predicate(&elt) {
SearchWhile::Done(Some(elt))
} else {
SearchWhile::Continue
}
})
}
}
// search_while is a generalization of the internal iteration methods.

View file

@ -20,6 +20,7 @@
#![feature(fixed_size_array)]
#![feature(flt2dec)]
#![feature(fmt_internals)]
#![feature(iter_rfind)]
#![feature(libc)]
#![feature(nonzero)]
#![feature(rand)]

View file

@ -225,6 +225,19 @@ fn get_unchecked_mut_range() {
}
}
#[test]
fn test_find_rfind() {
let v = [0, 1, 2, 3, 4, 5];
let mut iter = v.iter();
let mut i = v.len();
while let Some(&elt) = iter.rfind(|_| true) {
i -= 1;
assert_eq!(elt, v[i]);
}
assert_eq!(i, 0);
assert_eq!(v.iter().rfind(|&&x| x <= 3), Some(&3));
}
#[test]
fn sort_unstable() {
let mut v = [0; 600];