Skip to content

Commit 26d4c8f

Browse files
committed
implement nth_back for Range
1 parent 5c45343 commit 26d4c8f

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

src/libcore/iter/range.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,19 @@ impl<A: Step> DoubleEndedIterator for ops::Range<A> {
281281
None
282282
}
283283
}
284+
285+
#[inline]
286+
fn nth_back(&mut self, n: usize) -> Option<A> {
287+
if let Some(minus_n) = self.end.sub_usize(n) {
288+
if minus_n > self.start {
289+
self.end = minus_n.sub_one();
290+
return Some(self.end.clone())
291+
}
292+
}
293+
294+
self.end = self.start.clone();
295+
None
296+
}
284297
}
285298

286299
#[stable(feature = "fused", since = "1.26.0")]

src/libcore/tests/iter.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,6 +1657,23 @@ fn test_range_nth() {
16571657
assert_eq!(r, 20..20);
16581658
}
16591659

1660+
#[test]
1661+
fn test_range_nth_back() {
1662+
assert_eq!((10..15).nth_back(0), Some(14));
1663+
assert_eq!((10..15).nth_back(1), Some(13));
1664+
assert_eq!((10..15).nth_back(4), Some(10));
1665+
assert_eq!((10..15).nth_back(5), None);
1666+
assert_eq!((-120..80_i8).nth_back(199), Some(-120));
1667+
1668+
let mut r = 10..20;
1669+
assert_eq!(r.nth_back(2), Some(17));
1670+
assert_eq!(r, 10..17);
1671+
assert_eq!(r.nth_back(2), Some(14));
1672+
assert_eq!(r, 10..14);
1673+
assert_eq!(r.nth_back(10), None);
1674+
assert_eq!(r, 10..10);
1675+
}
1676+
16601677
#[test]
16611678
fn test_range_from_nth() {
16621679
assert_eq!((10..).nth(0), Some(10));

0 commit comments

Comments
 (0)