Specialize count for range iterators

This commit is contained in:
ltdk 2023-06-02 20:07:26 -04:00
parent e81f85fe9e
commit 08aa6c9b65

View File

@ -765,6 +765,15 @@ impl<A: Step> Iterator for ops::Range<A> {
}
}
#[inline]
fn count(self) -> usize {
if self.start < self.end {
Step::steps_between(&self.start, &self.end).expect("count overflowed usize")
} else {
0
}
}
#[inline]
fn nth(&mut self, n: usize) -> Option<A> {
self.spec_nth(n)
@ -1162,6 +1171,17 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
}
}
#[inline]
fn count(self) -> usize {
if self.is_empty() {
return 0;
}
Step::steps_between(&self.start, &self.end)
.and_then(|steps| steps.checked_add(1))
.expect("count overflowed usize")
}
#[inline]
fn nth(&mut self, n: usize) -> Option<A> {
if self.is_empty() {