diff options
| author | Adrian Friedli <adi@koalatux.ch> | 2019-06-08 22:30:45 +0200 |
|---|---|---|
| committer | Adrian Friedli <adi@koalatux.ch> | 2019-06-08 22:30:45 +0200 |
| commit | 26d4c8f01c07fdb3b0c0354dd9b509c955a87e9c (patch) | |
| tree | 6f136ea10a2e377a9b1210343768a45dc11d3d50 /src/libcore | |
| parent | 5c45343f11fbf93cf4e15568aee3ff3f2f287466 (diff) | |
implement nth_back for Range
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/iter/range.rs | 13 | ||||
| -rw-r--r-- | src/libcore/tests/iter.rs | 17 |
2 files changed, 30 insertions, 0 deletions
diff --git a/src/libcore/iter/range.rs b/src/libcore/iter/range.rs index 6bbf776fb8f..e171108a146 100644 --- a/src/libcore/iter/range.rs +++ b/src/libcore/iter/range.rs @@ -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")] diff --git a/src/libcore/tests/iter.rs b/src/libcore/tests/iter.rs index bedb9e75612..171a33695bc 100644 --- a/src/libcore/tests/iter.rs +++ b/src/libcore/tests/iter.rs @@ -1658,6 +1658,23 @@ fn test_range_nth() { } #[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)); assert_eq!((10..).nth(1), Some(11)); |
