@@ -681,12 +681,7 @@ impl<I: Iterator, P> Iterator for Filter<I, P> where P: FnMut(&I::Item) -> bool
681
681
682
682
#[ inline]
683
683
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 ( )
690
685
}
691
686
692
687
#[ inline]
@@ -707,12 +702,9 @@ impl<I: Iterator, P> Iterator for Filter<I, P> where P: FnMut(&I::Item) -> bool
707
702
// Using the branchless version will also simplify the LLVM byte code, thus
708
703
// leaving more budget for LLVM optimizations.
709
704
#[ 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 ( )
716
708
}
717
709
718
710
#[ inline]
@@ -746,12 +738,7 @@ impl<I: DoubleEndedIterator, P> DoubleEndedIterator for Filter<I, P>
746
738
{
747
739
#[ inline]
748
740
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 ( )
755
742
}
756
743
757
744
#[ inline]
@@ -820,12 +807,7 @@ impl<B, I: Iterator, F> Iterator for FilterMap<I, F>
820
807
821
808
#[ inline]
822
809
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 ( )
829
811
}
830
812
831
813
#[ inline]
@@ -863,12 +845,7 @@ impl<B, I: DoubleEndedIterator, F> DoubleEndedIterator for FilterMap<I, F>
863
845
{
864
846
#[ inline]
865
847
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 ( )
872
849
}
873
850
874
851
#[ inline]
0 commit comments