Skip to content

Commit 8590074

Browse files
committed
implement nth_back for RangeInclusive
1 parent 26d4c8f commit 8590074

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

src/libcore/iter/range.rs

+28
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,34 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
451451
})
452452
}
453453

454+
#[inline]
455+
fn nth_back(&mut self, n: usize) -> Option<A> {
456+
self.compute_is_empty();
457+
if self.is_empty.unwrap_or_default() {
458+
return None;
459+
}
460+
461+
if let Some(minus_n) = self.end.sub_usize(n) {
462+
use crate::cmp::Ordering::*;
463+
464+
match minus_n.partial_cmp(&self.start) {
465+
Some(Greater) => {
466+
self.is_empty = Some(false);
467+
self.end = minus_n.sub_one();
468+
return Some(minus_n);
469+
}
470+
Some(Equal) => {
471+
self.is_empty = Some(true);
472+
return Some(minus_n);
473+
}
474+
_ => {}
475+
}
476+
}
477+
478+
self.is_empty = Some(true);
479+
None
480+
}
481+
454482
#[inline]
455483
fn try_rfold<B, F, R>(&mut self, init: B, mut f: F) -> R where
456484
Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>

src/libcore/tests/iter.rs

+20
Original file line numberDiff line numberDiff line change
@@ -1731,6 +1731,26 @@ fn test_range_inclusive_nth() {
17311731
assert_eq!(ExactSizeIterator::is_empty(&r), true);
17321732
}
17331733

1734+
#[test]
1735+
fn test_range_inclusive_nth_back() {
1736+
assert_eq!((10..=15).nth_back(0), Some(15));
1737+
assert_eq!((10..=15).nth_back(1), Some(14));
1738+
assert_eq!((10..=15).nth_back(5), Some(10));
1739+
assert_eq!((10..=15).nth_back(6), None);
1740+
assert_eq!((-120..=80_i8).nth_back(200), Some(-120));
1741+
1742+
let mut r = 10_u8..=20;
1743+
assert_eq!(r.nth_back(2), Some(18));
1744+
assert_eq!(r, 10..=17);
1745+
assert_eq!(r.nth_back(2), Some(15));
1746+
assert_eq!(r, 10..=14);
1747+
assert_eq!(r.is_empty(), false);
1748+
assert_eq!(ExactSizeIterator::is_empty(&r), false);
1749+
assert_eq!(r.nth_back(10), None);
1750+
assert_eq!(r.is_empty(), true);
1751+
assert_eq!(ExactSizeIterator::is_empty(&r), true);
1752+
}
1753+
17341754
#[test]
17351755
fn test_range_step() {
17361756
#![allow(deprecated)]

0 commit comments

Comments
 (0)