12
12
13
13
14
14
use std:: cmp;
15
- use std:: iterator:: { DoubleEndedIterator , RandomAccessIterator , Invert } ;
15
+ use std:: iterator:: RandomAccessIterator ;
16
+ use std:: iterator:: { Invert , Enumerate } ;
16
17
use std:: num;
17
18
use std:: ops;
18
19
use std:: uint;
@@ -164,7 +165,7 @@ impl BigBitv {
164
165
}
165
166
166
167
#[ inline]
167
- pub fn negate ( & mut self ) { for self . each_storage |w| { * w = !* w } }
168
+ pub fn negate ( & mut self ) { do self . each_storage |w| { * w = !* w; true } ; }
168
169
169
170
#[ inline]
170
171
pub fn union ( & mut self , b : & BigBitv , nbits : uint ) -> bool {
@@ -723,12 +724,12 @@ impl cmp::Eq for BitvSet {
723
724
if self . size != other. size {
724
725
return false ;
725
726
}
726
- for self . each_common ( other) | _, w1, w2| {
727
+ for self . common_iter ( other) . advance | ( _, w1, w2) | {
727
728
if w1 != w2 {
728
729
return false ;
729
730
}
730
731
}
731
- for self . each_outlier ( other) | _, _, w| {
732
+ for self . outlier_iter ( other) . advance | ( _, _, w) | {
732
733
if w != 0 {
733
734
return false ;
734
735
}
@@ -746,7 +747,7 @@ impl Container for BitvSet {
746
747
747
748
impl Mutable for BitvSet {
748
749
fn clear ( & mut self ) {
749
- for self . bitv. each_storage |w| { * w = 0 ; }
750
+ do self . bitv . each_storage |w| { * w = 0 ; true } ;
750
751
self . size = 0 ;
751
752
}
752
753
}
@@ -757,22 +758,21 @@ impl Set<uint> for BitvSet {
757
758
}
758
759
759
760
fn is_disjoint ( & self , other : & BitvSet ) -> bool {
760
- for self . intersection( other) |_| {
761
- return false ;
761
+ do self . intersection ( other) |_| {
762
+ false
762
763
}
763
- return true ;
764
764
}
765
765
766
766
fn is_subset ( & self , other : & BitvSet ) -> bool {
767
- for self . each_common ( other) | _, w1, w2| {
767
+ for self . common_iter ( other) . advance | ( _, w1, w2) | {
768
768
if w1 & w2 != w1 {
769
769
return false ;
770
770
}
771
771
}
772
772
/* If anything is not ours, then everything is not ours so we're
773
773
definitely a subset in that case. Otherwise if there's any stray
774
774
ones that 'other' doesn't have, we're not a subset. */
775
- for self . each_outlier ( other) | mine, _, w| {
775
+ for self . outlier_iter ( other) . advance | ( mine, _, w) | {
776
776
if !mine {
777
777
return true ;
778
778
} else if w != 0 {
@@ -787,38 +787,38 @@ impl Set<uint> for BitvSet {
787
787
}
788
788
789
789
fn difference ( & self , other : & BitvSet , f : & fn ( & uint ) -> bool ) -> bool {
790
- for self . each_common ( other) | i, w1, w2| {
790
+ for self . common_iter ( other) . advance | ( i, w1, w2) | {
791
791
if !iterate_bits ( i, w1 & !w2, |b| f ( & b) ) {
792
792
return false ;
793
793
}
794
794
}
795
795
/* everything we have that they don't also shows up */
796
- self . each_outlier ( other, | mine, i, w|
796
+ self . outlier_iter ( other) . advance ( | ( mine, i, w) |
797
797
!mine || iterate_bits ( i, w, |b| f ( & b) )
798
798
)
799
799
}
800
800
801
801
fn symmetric_difference ( & self , other : & BitvSet ,
802
802
f : & fn ( & uint ) -> bool ) -> bool {
803
- for self . each_common ( other) | i, w1, w2| {
803
+ for self . common_iter ( other) . advance | ( i, w1, w2) | {
804
804
if !iterate_bits ( i, w1 ^ w2, |b| f ( & b) ) {
805
805
return false ;
806
806
}
807
807
}
808
- self . each_outlier ( other, | _, i, w| iterate_bits ( i, w, |b| f ( & b) ) )
808
+ self . outlier_iter ( other) . advance ( | ( _, i, w) | iterate_bits ( i, w, |b| f ( & b) ) )
809
809
}
810
810
811
811
fn intersection ( & self , other : & BitvSet , f : & fn ( & uint ) -> bool ) -> bool {
812
- self . each_common ( other, | i, w1, w2| iterate_bits ( i, w1 & w2, |b| f ( & b) ) )
812
+ self . common_iter ( other) . advance ( | ( i, w1, w2) | iterate_bits ( i, w1 & w2, |b| f ( & b) ) )
813
813
}
814
814
815
815
fn union ( & self , other : & BitvSet , f : & fn ( & uint ) -> bool ) -> bool {
816
- for self . each_common ( other) | i, w1, w2| {
816
+ for self . common_iter ( other) . advance | ( i, w1, w2) | {
817
817
if !iterate_bits ( i, w1 | w2, |b| f ( & b) ) {
818
818
return false ;
819
819
}
820
820
}
821
- self . each_outlier ( other, | _, i, w| iterate_bits ( i, w, |b| f ( & b) ) )
821
+ self . outlier_iter ( other) . advance ( | ( _, i, w) | iterate_bits ( i, w, |b| f ( & b) ) )
822
822
}
823
823
}
824
824
@@ -861,13 +861,14 @@ impl BitvSet {
861
861
/// both have in common. The three yielded arguments are (bit location,
862
862
/// w1, w2) where the bit location is the number of bits offset so far,
863
863
/// and w1/w2 are the words coming from the two vectors self, other.
864
- fn each_common ( & self , other : & BitvSet ,
865
- f : & fn ( uint , uint , uint ) -> bool ) -> bool {
864
+ fn common_iter < ' a > ( & ' a self , other : & ' a BitvSet )
865
+ -> MapE < ( uint , & uint ) , ( uint , uint , uint ) , & ' a ~ [ uint ] , Enumerate < vec :: VecIterator < ' a , uint > > > {
866
866
let min = num:: min ( self . bitv . storage . len ( ) ,
867
867
other. bitv . storage . len ( ) ) ;
868
- self . bitv . storage . slice ( 0 , min) . iter ( ) . enumerate ( ) . advance ( |( i, & w) | {
869
- f ( i * uint:: bits, w, other. bitv . storage [ i] )
870
- } )
868
+ MapE { iter : self . bitv . storage . slice ( 0 , min) . iter ( ) . enumerate ( ) ,
869
+ env : & other. bitv . storage ,
870
+ f : |( i, & w) : ( uint , & uint ) , o_store| ( i * uint:: bits, w, o_store[ i] )
871
+ }
871
872
}
872
873
873
874
/// Visits each word in self or other that extends beyond the other. This
@@ -877,24 +878,45 @@ impl BitvSet {
877
878
/// The yielded arguments are a bool, the bit offset, and a word. The bool
878
879
/// is true if the word comes from 'self', and false if it comes from
879
880
/// 'other'.
880
- fn each_outlier ( & self , other : & BitvSet ,
881
- f : & fn ( bool , uint , uint ) -> bool ) -> bool {
881
+ fn outlier_iter < ' a > ( & ' a self , other : & ' a BitvSet )
882
+ -> MapE < ( uint , & uint ) , ( bool , uint , uint ) , uint , Enumerate < vec :: VecIterator < ' a , uint > > > {
882
883
let len1 = self . bitv . storage . len ( ) ;
883
884
let len2 = other. bitv . storage . len ( ) ;
884
885
let min = num:: min ( len1, len2) ;
885
886
886
- /* only one of these loops will execute and that's the point */
887
- foreach ( i , & w ) in self . bitv . storage . slice ( min, len1) . iter ( ) . enumerate ( ) {
888
- if ! f ( true , ( i + min ) * uint :: bits , w ) {
889
- return false ;
887
+ if min < len1 {
888
+ MapE { iter : self . bitv . storage . slice ( min, len1) . iter ( ) . enumerate ( ) ,
889
+ env : min ,
890
+ f : | ( i , & w ) : ( uint , & uint ) , min| ( true , ( i + min ) * uint :: bits , w )
890
891
}
891
- }
892
- foreach ( i , & w ) in other. bitv . storage . slice ( min, len2) . iter ( ) . enumerate ( ) {
893
- if ! f ( false , ( i + min ) * uint :: bits , w ) {
894
- return false ;
892
+ } else {
893
+ MapE { iter : other. bitv . storage . slice ( min, len2) . iter ( ) . enumerate ( ) ,
894
+ env : min ,
895
+ f : | ( i , & w ) : ( uint , & uint ) , min| ( false , ( i + min ) * uint :: bits , w )
895
896
}
896
897
}
897
- return true ;
898
+ }
899
+ }
900
+
901
+ /// Like iterator::Map with explicit env capture
902
+ struct MapE < A , B , Env , I > {
903
+ priv env: Env ,
904
+ priv f: & ' static fn ( A , Env ) -> B ,
905
+ priv iter : I ,
906
+ }
907
+
908
+ impl < ' self , A , B , Env : Clone , I : Iterator < A > > Iterator < B > for MapE < A , B , Env , I > {
909
+ #[ inline]
910
+ fn next ( & mut self ) -> Option < B > {
911
+ match self . iter . next ( ) {
912
+ Some ( elt) => Some ( ( self . f ) ( elt, self . env . clone ( ) ) ) ,
913
+ None => None
914
+ }
915
+ }
916
+
917
+ #[ inline]
918
+ fn size_hint ( & self ) -> ( uint , Option < uint > ) {
919
+ self . iter . size_hint ( )
898
920
}
899
921
}
900
922
0 commit comments