about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2017-04-09 03:30:09 +0000
committerbors <bors@rust-lang.org>2017-04-09 03:30:09 +0000
commitc2d186a3c9c651b408f95b2158a011678b4910c8 (patch)
treed38326be49561a60d383f4403d062af871de82ce /src/libcore
parentb2d9b6323e3573839760ea3dc83a2c1658a01cf2 (diff)
parent5d2f270395814564f674141a99ace77ea9a03352 (diff)
downloadrust-c2d186a3c9c651b408f95b2158a011678b4910c8.tar.gz
rust-c2d186a3c9c651b408f95b2158a011678b4910c8.zip
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.
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/slice/mod.rs13
-rw-r--r--src/libcore/tests/lib.rs1
-rw-r--r--src/libcore/tests/slice.rs13
3 files changed, 27 insertions, 0 deletions
diff --git a/src/libcore/slice/mod.rs b/src/libcore/slice/mod.rs
index 6d598677c9b..87dfdfe57b6 100644
--- a/src/libcore/slice/mod.rs
+++ b/src/libcore/slice/mod.rs
@@ -1190,6 +1190,19 @@ macro_rules! iterator {
                     }
                 }
             }
+
+            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.
diff --git a/src/libcore/tests/lib.rs b/src/libcore/tests/lib.rs
index d92c378160d..528ab3bc845 100644
--- a/src/libcore/tests/lib.rs
+++ b/src/libcore/tests/lib.rs
@@ -20,6 +20,7 @@
 #![feature(fixed_size_array)]
 #![feature(flt2dec)]
 #![feature(fmt_internals)]
+#![feature(iter_rfind)]
 #![feature(libc)]
 #![feature(nonzero)]
 #![feature(rand)]
diff --git a/src/libcore/tests/slice.rs b/src/libcore/tests/slice.rs
index ec38345030f..15047204e50 100644
--- a/src/libcore/tests/slice.rs
+++ b/src/libcore/tests/slice.rs
@@ -226,6 +226,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];
     let mut tmp = [0; 600];