diff options
| author | Kornel <kornel@geekhood.net> | 2025-03-16 16:48:41 +0000 |
|---|---|---|
| committer | Kornel <kornel@geekhood.net> | 2025-04-04 15:52:34 +0100 |
| commit | 89477aff04a4d8f837a50deb62416cf33ecf766c (patch) | |
| tree | 0fd0b4ccd180d26aae379ff90c0c46c65945e450 | |
| parent | e6498670868810b7d232223487e8f2019a6ebdbb (diff) | |
| download | rust-89477aff04a4d8f837a50deb62416cf33ecf766c.tar.gz rust-89477aff04a4d8f837a50deb62416cf33ecf766c.zip | |
Optimize slice Windows::nth
Generates branchless code
| -rw-r--r-- | library/core/src/slice/iter.rs | 16 |
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 } } |
