Use the slice length to hint the optimizer

Using the len of the iterator doesn't give the same result.
That's also why we can't generalize it to all TrustedLen iterators.
This commit is contained in:
arthurprs 2018-01-26 12:49:14 +01:00
parent 0b56ab0f7b
commit 4f7109a424

View file

@ -1223,7 +1223,8 @@ macro_rules! iterator {
P: FnMut(Self::Item) -> bool,
{
// The addition might panic on overflow
let n = self.len();
// Use the len of the slice to hint optimizer to remove result index bounds check.
let n = make_slice!(self.ptr, self.end).len();
self.try_fold(0, move |i, x| {
if predicate(x) { Err(i) }
else { Ok(i + 1) }
@ -1241,7 +1242,8 @@ macro_rules! iterator {
{
// No need for an overflow check here, because `ExactSizeIterator`
// implies that the number of elements fits into a `usize`.
let n = self.len();
// Use the len of the slice to hint optimizer to remove result index bounds check.
let n = make_slice!(self.ptr, self.end).len();
self.try_rfold(n, move |i, x| {
let i = i - 1;
if predicate(x) { Err(i) }