diff options
| -rw-r--r-- | src/libcore/iter/range.rs | 51 | ||||
| -rw-r--r-- | src/libcore/ops/range.rs | 2 |
2 files changed, 50 insertions, 3 deletions
diff --git a/src/libcore/iter/range.rs b/src/libcore/iter/range.rs index 66c09a0ddd0..52b0ccd48d4 100644 --- a/src/libcore/iter/range.rs +++ b/src/libcore/iter/range.rs @@ -1,6 +1,6 @@ use convert::TryFrom; use mem; -use ops::{self, Add, Sub}; +use ops::{self, Add, Sub, Try}; use usize; use super::{FusedIterator, TrustedLen}; @@ -368,11 +368,11 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> { Some(Less) => { self.is_empty = Some(false); self.start = plus_n.add_one(); - return Some(plus_n) + return Some(plus_n); } Some(Equal) => { self.is_empty = Some(true); - return Some(plus_n) + return Some(plus_n); } _ => {} } @@ -383,6 +383,29 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> { } #[inline] + fn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R + where + Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B> + { + self.compute_is_empty(); + + let mut accum = init; + + while self.start < self.end { + let n = self.start.add_one(); + let n = mem::replace(&mut self.start, n); + accum = f(accum, n)?; + } + + if self.start == self.end { + accum = f(accum, self.start.clone())?; + } + + self.is_empty = Some(true); + Try::from_ok(accum) + } + + #[inline] fn last(mut self) -> Option<A> { self.next_back() } @@ -415,6 +438,28 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> { self.end.clone() }) } + + #[inline] + fn try_rfold<B, F, R>(&mut self, init: B, mut f: F) -> R where + Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B> + { + self.compute_is_empty(); + + let mut accum = init; + + while self.start < self.end { + let n = self.end.sub_one(); + let n = mem::replace(&mut self.end, n); + accum = f(accum, n)?; + } + + if self.start == self.end { + accum = f(accum, self.start.clone())?; + } + + self.is_empty = Some(true); + Try::from_ok(accum) + } } #[stable(feature = "fused", since = "1.26.0")] diff --git a/src/libcore/ops/range.rs b/src/libcore/ops/range.rs index 815a4cfeed8..6776ebdc66e 100644 --- a/src/libcore/ops/range.rs +++ b/src/libcore/ops/range.rs @@ -334,12 +334,14 @@ pub struct RangeInclusive<Idx> { trait RangeInclusiveEquality: Sized { fn canonicalized_is_empty(range: &RangeInclusive<Self>) -> bool; } + impl<T> RangeInclusiveEquality for T { #[inline] default fn canonicalized_is_empty(range: &RangeInclusive<Self>) -> bool { range.is_empty.unwrap_or_default() } } + impl<T: PartialOrd> RangeInclusiveEquality for T { #[inline] fn canonicalized_is_empty(range: &RangeInclusive<Self>) -> bool { |
