]> git.lizzy.rs Git - rust.git/commitdiff
implement nth_back for Windows
authorAdrian Friedli <adi@koalatux.ch>
Sat, 23 Feb 2019 23:22:41 +0000 (00:22 +0100)
committerAdrian Friedli <adi@koalatux.ch>
Sat, 23 Feb 2019 23:28:04 +0000 (00:28 +0100)
src/libcore/slice/mod.rs
src/libcore/tests/slice.rs

index acca9748372ca15b521a7e4c82a37aa481f1092b..b048a12e402a575d4a34934fc3a985a10aa2a426 100644 (file)
@@ -3835,6 +3835,19 @@ fn next_back(&mut self) -> Option<&'a [T]> {
             ret
         }
     }
+
+    #[inline]
+    fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
+        let (end, overflow) = self.v.len().overflowing_sub(n);
+        if end < self.size || overflow {
+            self.v = &[];
+            None
+        } else {
+            let ret = &self.v[end-self.size..end];
+            self.v = &self.v[..end-1];
+            Some(ret)
+        }
+    }
 }
 
 #[stable(feature = "rust1", since = "1.0.0")]
index 04d646ea01d038842c2709ce328d633a17fd1f9f..1e92b6f7878705451dc2bd706748fb0af31638f1 100644 (file)
@@ -578,6 +578,19 @@ fn test_windows_nth() {
     assert_eq!(c2.next(), None);
 }
 
+#[test]
+fn test_windows_nth_back() {
+    let v: &[i32] = &[0, 1, 2, 3, 4, 5];
+    let mut c = v.windows(2);
+    assert_eq!(c.nth_back(2).unwrap()[0], 2);
+    assert_eq!(c.next_back().unwrap()[1], 2);
+
+    let v2: &[i32] = &[0, 1, 2, 3, 4];
+    let mut c2 = v2.windows(4);
+    assert_eq!(c2.nth_back(1).unwrap()[1], 1);
+    assert_eq!(c2.next_back(), None);
+}
+
 #[test]
 fn test_windows_last() {
     let v: &[i32] = &[0, 1, 2, 3, 4, 5];