Optimize slice Windows::nth

Generates branchless code
This commit is contained in:
Kornel
2025-03-16 16:48:41 +00:00
parent e649867086
commit 89477aff04

View File

@@ -1380,14 +1380,16 @@ impl<'a, T> Iterator for Windows<'a, T> {
#[inline] #[inline]
fn nth(&mut self, n: usize) -> Option<Self::Item> { fn nth(&mut self, n: usize) -> Option<Self::Item> {
let (end, overflow) = self.size.get().overflowing_add(n); let size = self.size.get();
if end > self.v.len() || overflow { if let Some(rest) = self.v.get(n..)
self.v = &[]; && let Some(nth) = rest.get(..size)
None {
} else { self.v = &rest[1..];
let nth = &self.v[n..end];
self.v = &self.v[n + 1..];
Some(nth) Some(nth)
} else {
// setting length to 0 is cheaper than overwriting the pointer when assigning &[]
self.v = &self.v[..0];
None
} }
} }