]> git.lizzy.rs Git - rust.git/commitdiff
slice: Implement .rfind() for slice iterators Iter and IterMut
authorUlrik Sverdrup <bluss@users.noreply.github.com>
Sat, 8 Apr 2017 01:43:18 +0000 (03:43 +0200)
committerUlrik Sverdrup <bluss@users.noreply.github.com>
Sat, 8 Apr 2017 01:45:48 +0000 (03:45 +0200)
Just like the forward case find, implement rfind explicitly

src/libcore/slice/mod.rs
src/libcore/tests/lib.rs
src/libcore/tests/slice.rs

index 6d598677c9ba4f0cad90dc5bf1458d1d94433f58..87dfdfe57b65c77db0443d99ea6e7d46143c5089 100644 (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.
index d92c378160d2e0e4ba3eabcc5fcdc813675b07c4..528ab3bc84523e184ee7b41b12bbce7d9e36ee57 100644 (file)
@@ -20,6 +20,7 @@
 #![feature(fixed_size_array)]
 #![feature(flt2dec)]
 #![feature(fmt_internals)]
+#![feature(iter_rfind)]
 #![feature(libc)]
 #![feature(nonzero)]
 #![feature(rand)]
index ec38345030fa5897423ff55d2f4f882dcff4c1ee..15047204e50d609699e5df8bcee730d9aa37ee6c 100644 (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];