diff options
| author | Kornel <kornel@geekhood.net> | 2025-03-16 16:17:33 +0000 |
|---|---|---|
| committer | Kornel <kornel@geekhood.net> | 2025-04-04 15:52:33 +0100 |
| commit | e6498670868810b7d232223487e8f2019a6ebdbb (patch) | |
| tree | af768e178ff4a71f50caebb3408703d1e5bb8f7c | |
| parent | a4166dabaae56ab0d35a7825c3e7008778eacf34 (diff) | |
| download | rust-e6498670868810b7d232223487e8f2019a6ebdbb.tar.gz rust-e6498670868810b7d232223487e8f2019a6ebdbb.zip | |
Optimize slice Iter::nth
| -rw-r--r-- | library/core/src/slice/iter.rs | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/library/core/src/slice/iter.rs b/library/core/src/slice/iter.rs index d48248749c2..b1a19e3427d 100644 --- a/library/core/src/slice/iter.rs +++ b/library/core/src/slice/iter.rs @@ -1536,17 +1536,15 @@ impl<'a, T> Iterator for Chunks<'a, T> { #[inline] fn nth(&mut self, n: usize) -> Option<Self::Item> { let (start, overflow) = n.overflowing_mul(self.chunk_size); - if start >= self.v.len() || overflow { - self.v = &[]; - None - } else { - let end = match start.checked_add(self.chunk_size) { - Some(sum) => cmp::min(self.v.len(), sum), - None => self.v.len(), - }; - let nth = &self.v[start..end]; - self.v = &self.v[end..]; + // min(len) makes a wrong start harmless, but enables optimizing this to brachless code + let chunk_start = &self.v[start.min(self.v.len())..]; + let (nth, remainder) = chunk_start.split_at(self.chunk_size.min(chunk_start.len())); + if !overflow && start < self.v.len() { + self.v = remainder; Some(nth) + } else { + self.v = &self.v[..0]; // cheaper than &[] + None } } |
