1313
1414use std:: cmp;
1515use std:: iterator:: RandomAccessIterator ;
16- use std:: iterator:: { Invert , Enumerate } ;
16+ use std:: iterator:: { Invert , Enumerate , Repeat , Map , Zip } ;
1717use std:: num;
1818use std:: ops;
1919use std:: uint;
@@ -206,14 +206,13 @@ impl BigBitv {
206206 #[ inline]
207207 pub fn equals ( & self , b : & BigBitv , nbits : uint ) -> bool {
208208 let len = b. storage . len ( ) ;
209- do uint :: iterate ( 0 , len) |i| {
209+ for i in range ( 0 , len) {
210210 let mask = big_mask ( nbits, i) ;
211211 if mask & self . storage [ i] != mask & b. storage [ i] {
212- false
213- } else {
214- true
212+ return false ;
215213 }
216214 }
215+ true
217216 }
218217}
219218
@@ -864,13 +863,12 @@ impl BitvSet {
864863 /// w1, w2) where the bit location is the number of bits offset so far,
865864 /// and w1/w2 are the words coming from the two vectors self, other.
866865 fn common_iter < ' a > ( & ' a self , other : & ' a BitvSet )
867- -> MapE < ( uint , & uint ) , ( uint , uint , uint ) , & ' a ~[ uint ] , Enumerate < vec:: VecIterator < ' a , uint > > > {
868- let min = num:: min ( self . bitv . storage . len ( ) ,
869- other. bitv . storage . len ( ) ) ;
870- MapE { iter : self . bitv . storage . slice ( 0 , min) . iter ( ) . enumerate ( ) ,
871- env : & other. bitv . storage ,
872- f : |( i, & w) : ( uint , & uint ) , o_store| ( i * uint:: bits, w, o_store[ i] )
873- }
866+ -> Map < ' static , ( ( uint , & ' a uint ) , & ' a ~[ uint ] ) , ( uint , uint , uint ) ,
867+ Zip < Enumerate < vec:: VecIterator < ' a , uint > > , Repeat < & ' a ~[ uint ] > > > {
868+ let min = num:: min ( self . bitv . storage . len ( ) , other. bitv . storage . len ( ) ) ;
869+ self . bitv . storage . slice ( 0 , min) . iter ( ) . enumerate ( )
870+ . zip ( Repeat :: new ( & other. bitv . storage ) )
871+ . transform ( |( ( i, & w) , o_store) | ( i * uint:: bits, w, o_store[ i] ) )
874872 }
875873
876874 /// Visits each word in self or other that extends beyond the other. This
@@ -881,45 +879,21 @@ impl BitvSet {
881879 /// is true if the word comes from 'self', and false if it comes from
882880 /// 'other'.
883881 fn outlier_iter < ' a > ( & ' a self , other : & ' a BitvSet )
884- -> MapE < ( uint , & uint ) , ( bool , uint , uint ) , uint , Enumerate < vec:: VecIterator < ' a , uint > > > {
885- let len1 = self . bitv . storage . len ( ) ;
886- let len2 = other. bitv . storage . len ( ) ;
887- let min = num:: min ( len1, len2) ;
888-
889- if min < len1 {
890- MapE { iter : self . bitv . storage . slice ( min, len1) . iter ( ) . enumerate ( ) ,
891- env : min,
892- f : |( i, & w) : ( uint , & uint ) , min| ( true , ( i + min) * uint:: bits, w)
893- }
882+ -> Map < ' static , ( ( uint , & ' a uint ) , uint ) , ( bool , uint , uint ) ,
883+ Zip < Enumerate < vec:: VecIterator < ' a , uint > > , Repeat < uint > > > {
884+ let slen = self . bitv . storage . len ( ) ;
885+ let olen = other. bitv . storage . len ( ) ;
886+
887+ if olen < slen {
888+ self . bitv . storage . slice_from ( olen) . iter ( ) . enumerate ( )
889+ . zip ( Repeat :: new ( olen) )
890+ . transform ( |( ( i, & w) , min) | ( true , ( i + min) * uint:: bits, w) )
894891 } else {
895- MapE { iter : other. bitv . storage . slice ( min, len2) . iter ( ) . enumerate ( ) ,
896- env : min,
897- f : |( i, & w) : ( uint , & uint ) , min| ( false , ( i + min) * uint:: bits, w)
898- }
899- }
900- }
901- }
902-
903- /// Like iterator::Map with explicit env capture
904- struct MapE < A , B , Env , I > {
905- priv env: Env ,
906- priv f: & ' static fn ( A , Env ) -> B ,
907- priv iter : I ,
908- }
909-
910- impl < ' self , A , B , Env : Clone , I : Iterator < A > > Iterator < B > for MapE < A , B , Env , I > {
911- #[ inline]
912- fn next ( & mut self ) -> Option < B > {
913- match self . iter . next ( ) {
914- Some ( elt) => Some ( ( self . f ) ( elt, self . env . clone ( ) ) ) ,
915- None => None
892+ other. bitv . storage . slice_from ( slen) . iter ( ) . enumerate ( )
893+ . zip ( Repeat :: new ( slen) )
894+ . transform ( |( ( i, & w) , min) | ( false , ( i + min) * uint:: bits, w) )
916895 }
917896 }
918-
919- #[ inline]
920- fn size_hint ( & self ) -> ( uint , Option < uint > ) {
921- self . iter . size_hint ( )
922- }
923897}
924898
925899pub struct BitvSetIterator < ' self > {
0 commit comments