about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKornel <kornel@geekhood.net>2025-03-16 16:48:41 +0000
committerKornel <kornel@geekhood.net>2025-04-04 15:52:34 +0100
commit89477aff04a4d8f837a50deb62416cf33ecf766c (patch)
tree0fd0b4ccd180d26aae379ff90c0c46c65945e450
parente6498670868810b7d232223487e8f2019a6ebdbb (diff)
downloadrust-89477aff04a4d8f837a50deb62416cf33ecf766c.tar.gz
rust-89477aff04a4d8f837a50deb62416cf33ecf766c.zip
Optimize slice Windows::nth
Generates branchless code
-rw-r--r--library/core/src/slice/iter.rs16
1 files changed, 9 insertions, 7 deletions
diff --git a/library/core/src/slice/iter.rs b/library/core/src/slice/iter.rs
index b1a19e3427d..e9c27ddbbba 100644
--- a/library/core/src/slice/iter.rs
+++ b/library/core/src/slice/iter.rs
@@ -1380,14 +1380,16 @@ impl<'a, T> Iterator for Windows<'a, T> {
 
     #[inline]
     fn nth(&mut self, n: usize) -> Option<Self::Item> {
-        let (end, overflow) = self.size.get().overflowing_add(n);
-        if end > self.v.len() || overflow {
-            self.v = &[];
-            None
-        } else {
-            let nth = &self.v[n..end];
-            self.v = &self.v[n + 1..];
+        let size = self.size.get();
+        if let Some(rest) = self.v.get(n..)
+            && let Some(nth) = rest.get(..size)
+        {
+            self.v = &rest[1..];
             Some(nth)
+        } else {
+            // setting length to 0 is cheaper than overwriting the pointer when assigning &[]
+            self.v = &self.v[..0];
+            None
         }
     }