diff options
| author | oberien <jaro.fietz@gmx.de> | 2018-01-19 22:34:22 +0100 |
|---|---|---|
| committer | oberien <jaro.fietz@gmx.de> | 2018-01-19 22:34:22 +0100 |
| commit | f72b7f7c86b16fe8b76c4eb02052943dd6ef1ab2 (patch) | |
| tree | 618e9f84767edece6fbb95ba18d35a8fcb73be13 | |
| parent | f08dec114f6008cb7a906ffd55c221fd30d70987 (diff) | |
| download | rust-f72b7f7c86b16fe8b76c4eb02052943dd6ef1ab2.tar.gz rust-f72b7f7c86b16fe8b76c4eb02052943dd6ef1ab2.zip | |
Optimize StepBy::nth overflow handling
| -rw-r--r-- | src/libcore/iter/mod.rs | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/libcore/iter/mod.rs b/src/libcore/iter/mod.rs index 57e7e03a6ce..5923e6dc3ee 100644 --- a/src/libcore/iter/mod.rs +++ b/src/libcore/iter/mod.rs @@ -307,6 +307,7 @@ use fmt; use iter_private::TrustedRandomAccess; use ops::Try; use usize; +use intrinsics; #[stable(feature = "rust1", since = "1.0.0")] pub use self::iterator::Iterator; @@ -718,7 +719,11 @@ impl<I> Iterator for StepBy<I> where I: Iterator { } // overflow handling - while n.checked_mul(step).is_none() { + loop { + let mul = n.checked_mul(step); + if unsafe { intrinsics::likely(mul.is_some())} { + return self.iter.nth(mul.unwrap() - 1); + } let div_n = usize::MAX / n; let div_step = usize::MAX / step; let nth_n = div_n * n; @@ -732,7 +737,6 @@ impl<I> Iterator for StepBy<I> where I: Iterator { }; self.iter.nth(nth - 1); } - self.iter.nth(n * step - 1) } } |
