about summary refs log tree commit diff
diff options
context:
space:
mode:
authoroberien <jaro.fietz@gmx.de>2018-01-19 22:34:22 +0100
committeroberien <jaro.fietz@gmx.de>2018-01-19 22:34:22 +0100
commitf72b7f7c86b16fe8b76c4eb02052943dd6ef1ab2 (patch)
tree618e9f84767edece6fbb95ba18d35a8fcb73be13
parentf08dec114f6008cb7a906ffd55c221fd30d70987 (diff)
downloadrust-f72b7f7c86b16fe8b76c4eb02052943dd6ef1ab2.tar.gz
rust-f72b7f7c86b16fe8b76c4eb02052943dd6ef1ab2.zip
Optimize StepBy::nth overflow handling
-rw-r--r--src/libcore/iter/mod.rs8
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)
     }
 }