Optimize slice Windows::nth
Generates branchless code
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user