Skip to content

Commit c2d186a

Browse files
committed
Auto merge of #41154 - bluss:slice-rfind, r=alexcrichton
Implement .rfind() for slice iterators Iter and IterMut Just like the forward case find, implement rfind explicitly for slice iterators Iter and IterMut.
2 parents b2d9b63 + 5d2f270 commit c2d186a

File tree

3 files changed

+27
-0
lines changed

3 files changed

+27
-0
lines changed

src/libcore/slice/mod.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,6 +1190,19 @@ macro_rules! iterator {
11901190
}
11911191
}
11921192
}
1193+
1194+
fn rfind<F>(&mut self, mut predicate: F) -> Option<Self::Item>
1195+
where F: FnMut(&Self::Item) -> bool,
1196+
{
1197+
self.rsearch_while(None, move |elt| {
1198+
if predicate(&elt) {
1199+
SearchWhile::Done(Some(elt))
1200+
} else {
1201+
SearchWhile::Continue
1202+
}
1203+
})
1204+
}
1205+
11931206
}
11941207

11951208
// search_while is a generalization of the internal iteration methods.

src/libcore/tests/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#![feature(fixed_size_array)]
2121
#![feature(flt2dec)]
2222
#![feature(fmt_internals)]
23+
#![feature(iter_rfind)]
2324
#![feature(libc)]
2425
#![feature(nonzero)]
2526
#![feature(rand)]

src/libcore/tests/slice.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,19 @@ fn get_unchecked_mut_range() {
225225
}
226226
}
227227

228+
#[test]
229+
fn test_find_rfind() {
230+
let v = [0, 1, 2, 3, 4, 5];
231+
let mut iter = v.iter();
232+
let mut i = v.len();
233+
while let Some(&elt) = iter.rfind(|_| true) {
234+
i -= 1;
235+
assert_eq!(elt, v[i]);
236+
}
237+
assert_eq!(i, 0);
238+
assert_eq!(v.iter().rfind(|&&x| x <= 3), Some(&3));
239+
}
240+
228241
#[test]
229242
fn sort_unstable() {
230243
let mut v = [0; 600];

0 commit comments

Comments
 (0)