about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJosh Stone <jistone@redhat.com>2019-07-11 16:03:21 -0700
committerJosh Stone <jistone@redhat.com>2019-08-12 15:03:44 -0700
commitb1fd3d024d977828e3071392a7ccc0a1e27bd206 (patch)
treece3434435ffa1556fc6c9534b8883cd666e26d09
parentd940ddf8f5851ace3504058d6285f0b7b8c45c9f (diff)
downloadrust-b1fd3d024d977828e3071392a7ccc0a1e27bd206.tar.gz
rust-b1fd3d024d977828e3071392a7ccc0a1e27bd206.zip
Remove genericity in StepBy::size_hint
-rw-r--r--src/libcore/iter/adapters/mod.rs20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/libcore/iter/adapters/mod.rs b/src/libcore/iter/adapters/mod.rs
index 4e54cb2bf31..008907b6e31 100644
--- a/src/libcore/iter/adapters/mod.rs
+++ b/src/libcore/iter/adapters/mod.rs
@@ -448,14 +448,24 @@ impl<I> Iterator for StepBy<I> where I: Iterator {
 
     #[inline]
     fn size_hint(&self) -> (usize, Option<usize>) {
-        let inner_hint = self.iter.size_hint();
+        #[inline]
+        fn first_size(step: usize) -> impl Fn(usize) -> usize {
+            move |n| if n == 0 { 0 } else { 1 + (n - 1) / (step + 1) }
+        }
+
+        #[inline]
+        fn other_size(step: usize) -> impl Fn(usize) -> usize {
+            move |n| n / (step + 1)
+        }
+
+        let (low, high) = self.iter.size_hint();
 
         if self.first_take {
-            let f = |n| if n == 0 { 0 } else { 1 + (n-1)/(self.step+1) };
-            (f(inner_hint.0), inner_hint.1.map(f))
+            let f = first_size(self.step);
+            (f(low), high.map(f))
         } else {
-            let f = |n| n / (self.step+1);
-            (f(inner_hint.0), inner_hint.1.map(f))
+            let f = other_size(self.step);
+            (f(low), high.map(f))
         }
     }