Skip to content

Commit 739ba04

Browse files
committed
implement nth_back for Windows
1 parent 4837fb4 commit 739ba04

File tree

2 files changed

+26
-0
lines changed

2 files changed

+26
-0
lines changed

src/libcore/slice/mod.rs

+13
Original file line numberDiff line numberDiff line change
@@ -3835,6 +3835,19 @@ impl<'a, T> DoubleEndedIterator for Windows<'a, T> {
38353835
ret
38363836
}
38373837
}
3838+
3839+
#[inline]
3840+
fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
3841+
let (end, overflow) = self.v.len().overflowing_sub(n);
3842+
if end < self.size || overflow {
3843+
self.v = &[];
3844+
None
3845+
} else {
3846+
let ret = &self.v[end-self.size..end];
3847+
self.v = &self.v[..end-1];
3848+
Some(ret)
3849+
}
3850+
}
38383851
}
38393852

38403853
#[stable(feature = "rust1", since = "1.0.0")]

src/libcore/tests/slice.rs

+13
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,19 @@ fn test_windows_nth() {
578578
assert_eq!(c2.next(), None);
579579
}
580580

581+
#[test]
582+
fn test_windows_nth_back() {
583+
let v: &[i32] = &[0, 1, 2, 3, 4, 5];
584+
let mut c = v.windows(2);
585+
assert_eq!(c.nth_back(2).unwrap()[0], 2);
586+
assert_eq!(c.next_back().unwrap()[1], 2);
587+
588+
let v2: &[i32] = &[0, 1, 2, 3, 4];
589+
let mut c2 = v2.windows(4);
590+
assert_eq!(c2.nth_back(1).unwrap()[1], 1);
591+
assert_eq!(c2.next_back(), None);
592+
}
593+
581594
#[test]
582595
fn test_windows_last() {
583596
let v: &[i32] = &[0, 1, 2, 3, 4, 5];

0 commit comments

Comments
 (0)