Skip to content

Commit d187786

Browse files
committed
Optimize slice Windows::nth
Generates branchless code
1 parent 83e0cb8 commit d187786

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

core/src/slice/iter.rs

+9-7
Original file line numberDiff line numberDiff line change
@@ -1380,14 +1380,16 @@ impl<'a, T> Iterator for Windows<'a, T> {
13801380

13811381
#[inline]
13821382
fn nth(&mut self, n: usize) -> Option<Self::Item> {
1383-
let (end, overflow) = self.size.get().overflowing_add(n);
1384-
if end > self.v.len() || overflow {
1385-
self.v = &[];
1386-
None
1387-
} else {
1388-
let nth = &self.v[n..end];
1389-
self.v = &self.v[n + 1..];
1383+
let size = self.size.get();
1384+
if let Some(rest) = self.v.get(n..)
1385+
&& let Some(nth) = rest.get(..size)
1386+
{
1387+
self.v = &rest[1..];
13901388
Some(nth)
1389+
} else {
1390+
// setting length to 0 is cheaper than overwriting the pointer when assigning &[]
1391+
self.v = &self.v[..0];
1392+
None
13911393
}
13921394
}
13931395

0 commit comments

Comments
 (0)