implement nth_back for Windows

This commit is contained in:
Adrian Friedli 2019-02-24 00:22:41 +01:00
parent 4837fb45ff
commit 739ba0417a
No known key found for this signature in database
GPG Key ID: 72488301A5824477
2 changed files with 26 additions and 0 deletions

View 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")]

View 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];