@@ -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