]> git.lizzy.rs Git - rust.git/commitdiff
Simplify `Skip::nth` and `Skip::last` implementations
authorOliver Middleton <olliemail27@gmail.com>
Tue, 28 Jan 2020 12:39:18 +0000 (12:39 +0000)
committerOliver Middleton <olliemail27@gmail.com>
Tue, 28 Jan 2020 12:39:18 +0000 (12:39 +0000)
The main improvement is to make `last` no longer recursive.

src/libcore/iter/adapters/mod.rs

index 5787b9174edaba8928e329d19f5554d43c28c81c..df824dd493e51446c7771b392999b8a94221f8a2 100644 (file)
@@ -1801,17 +1801,15 @@ fn next(&mut self) -> Option<I::Item> {
     #[inline]
     fn nth(&mut self, n: usize) -> Option<I::Item> {
         // Can't just add n + self.n due to overflow.
-        if self.n == 0 {
-            self.iter.nth(n)
-        } else {
+        if self.n > 0 {
             let to_skip = self.n;
             self.n = 0;
             // nth(n) skips n+1
             if self.iter.nth(to_skip - 1).is_none() {
                 return None;
             }
-            self.iter.nth(n)
         }
+        self.iter.nth(n)
     }
 
     #[inline]
@@ -1827,17 +1825,13 @@ fn count(mut self) -> usize {
 
     #[inline]
     fn last(mut self) -> Option<I::Item> {
-        if self.n == 0 {
-            self.iter.last()
-        } else {
-            let next = self.next();
-            if next.is_some() {
-                // recurse. n should be 0.
-                self.last().or(next)
-            } else {
-                None
+        if self.n > 0 {
+            // nth(n) skips n+1
+            if self.iter.nth(self.n - 1).is_none() {
+                return None;
             }
         }
+        self.iter.last()
     }
 
     #[inline]