implement nth_back for Range

This commit is contained in:
Adrian Friedli
2019-06-08 22:30:45 +02:00
parent 5c45343f11
commit 26d4c8f01c
2 changed files with 30 additions and 0 deletions

View File

@@ -281,6 +281,19 @@ impl<A: Step> DoubleEndedIterator for ops::Range<A> {
None
}
}
#[inline]
fn nth_back(&mut self, n: usize) -> Option<A> {
if let Some(minus_n) = self.end.sub_usize(n) {
if minus_n > self.start {
self.end = minus_n.sub_one();
return Some(self.end.clone())
}
}
self.end = self.start.clone();
None
}
}
#[stable(feature = "fused", since = "1.26.0")]

View File

@@ -1657,6 +1657,23 @@ fn test_range_nth() {
assert_eq!(r, 20..20);
}
#[test]
fn test_range_nth_back() {
assert_eq!((10..15).nth_back(0), Some(14));
assert_eq!((10..15).nth_back(1), Some(13));
assert_eq!((10..15).nth_back(4), Some(10));
assert_eq!((10..15).nth_back(5), None);
assert_eq!((-120..80_i8).nth_back(199), Some(-120));
let mut r = 10..20;
assert_eq!(r.nth_back(2), Some(17));
assert_eq!(r, 10..17);
assert_eq!(r.nth_back(2), Some(14));
assert_eq!(r, 10..14);
assert_eq!(r.nth_back(10), None);
assert_eq!(r, 10..10);
}
#[test]
fn test_range_from_nth() {
assert_eq!((10..).nth(0), Some(10));