Skip to content

Commit 1fd2f16

Browse files
committed
Have all methods of Filter and FilterMap use internal iteration
1 parent 31eb0e2 commit 1fd2f16

File tree

1 file changed

+7
-30
lines changed
  • src/libcore/iter/adapters

1 file changed

+7
-30
lines changed

src/libcore/iter/adapters/mod.rs

+7-30
Original file line numberDiff line numberDiff line change
@@ -681,12 +681,7 @@ impl<I: Iterator, P> Iterator for Filter<I, P> where P: FnMut(&I::Item) -> bool
681681

682682
#[inline]
683683
fn next(&mut self) -> Option<I::Item> {
684-
for x in &mut self.iter {
685-
if (self.predicate)(&x) {
686-
return Some(x);
687-
}
688-
}
689-
None
684+
self.try_for_each(Err).err()
690685
}
691686

692687
#[inline]
@@ -707,12 +702,9 @@ impl<I: Iterator, P> Iterator for Filter<I, P> where P: FnMut(&I::Item) -> bool
707702
// Using the branchless version will also simplify the LLVM byte code, thus
708703
// leaving more budget for LLVM optimizations.
709704
#[inline]
710-
fn count(mut self) -> usize {
711-
let mut count = 0;
712-
for x in &mut self.iter {
713-
count += (self.predicate)(&x) as usize;
714-
}
715-
count
705+
fn count(self) -> usize {
706+
let mut predicate = self.predicate;
707+
self.iter.map(|x| predicate(&x) as usize).sum()
716708
}
717709

718710
#[inline]
@@ -746,12 +738,7 @@ impl<I: DoubleEndedIterator, P> DoubleEndedIterator for Filter<I, P>
746738
{
747739
#[inline]
748740
fn next_back(&mut self) -> Option<I::Item> {
749-
for x in self.iter.by_ref().rev() {
750-
if (self.predicate)(&x) {
751-
return Some(x);
752-
}
753-
}
754-
None
741+
self.try_rfold((), |_, x| Err(x)).err()
755742
}
756743

757744
#[inline]
@@ -820,12 +807,7 @@ impl<B, I: Iterator, F> Iterator for FilterMap<I, F>
820807

821808
#[inline]
822809
fn next(&mut self) -> Option<B> {
823-
for x in self.iter.by_ref() {
824-
if let Some(y) = (self.f)(x) {
825-
return Some(y);
826-
}
827-
}
828-
None
810+
self.try_for_each(Err).err()
829811
}
830812

831813
#[inline]
@@ -863,12 +845,7 @@ impl<B, I: DoubleEndedIterator, F> DoubleEndedIterator for FilterMap<I, F>
863845
{
864846
#[inline]
865847
fn next_back(&mut self) -> Option<B> {
866-
for x in self.iter.by_ref().rev() {
867-
if let Some(y) = (self.f)(x) {
868-
return Some(y);
869-
}
870-
}
871-
None
848+
self.try_rfold((), |_, x| Err(x)).err()
872849
}
873850

874851
#[inline]

0 commit comments

Comments
 (0)