@@ -87,8 +87,8 @@ use std::hash;
87
87
88
88
use vec:: Vec ;
89
89
90
- type Blocks < ' a > = Cloned < Items < ' a , u32 > >
91
- type MutBlocks < ' a > MutItems <' a, u32>;
90
+ type Blocks < ' a > = Cloned < Items < ' a , u32 > > ;
91
+ type MutBlocks < ' a > = MutItems < ' a , u32 > ;
92
92
type MatchWords < ' a > = Chain < Enumerate < Blocks < ' a > > , Skip < Take < Enumerate < Repeat < u32 > > > > > ;
93
93
94
94
// Take two BitV's, and return iterators of their words, where the shorter one
@@ -174,6 +174,12 @@ fn blocks_for_bits(bits: uint) -> uint {
174
174
175
175
}
176
176
177
+ /// Computes the bitmask for the final word of the vector
178
+ fn mask_for_bits ( bits : uint ) -> u32 {
179
+ // Note especially that a perfect multiple of u32::BITS should mask all 1s.
180
+ !0u32 >> ( u32:: BITS - bits % u32:: BITS )
181
+ }
182
+
177
183
impl Bitv {
178
184
/// Applies the given operation to the blocks of self and other, and sets self to
179
185
/// be the result.
@@ -199,7 +205,7 @@ impl Bitv {
199
205
/// Iterator over mutable refs to the underlying blocks of data.
200
206
fn blocks_mut ( & mut self ) -> MutBlocks {
201
207
let blocks = blocks_for_bits ( self . len ( ) ) ;
202
- self . storage [ .. blocks] . iter_mut ( )
208
+ self . storage . slice_to_mut ( blocks) . iter_mut ( )
203
209
}
204
210
205
211
/// Iterator over the underlying blocks of data
@@ -336,7 +342,7 @@ impl Bitv {
336
342
assert ! ( i < self . nbits) ;
337
343
let w = i / u32:: BITS ;
338
344
let b = i % u32:: BITS ;
339
- self . storage . get ( w) . map ( |block|
345
+ self . storage . get ( w) . map ( |& block|
340
346
( block & ( 1 << b) ) != 0
341
347
)
342
348
}
@@ -526,7 +532,7 @@ impl Bitv {
526
532
last_word = elem;
527
533
tmp == !0u32
528
534
// and then check the last one has enough ones
529
- } ) && ( last_word == ( ( 1 << self . nbits % u32 :: BITS ) - 1 ) || last_word == ! 0u32 )
535
+ } ) && ( last_word == mask_for_bits ( self . nbits ) )
530
536
}
531
537
532
538
/// Returns an iterator over the elements of the vector in order.
@@ -788,15 +794,15 @@ impl Bitv {
788
794
let new_nblocks = blocks_for_bits ( new_nbits) ;
789
795
let full_value = if value { !0 } else { 0 } ;
790
796
791
- // Correct the old tail word
797
+ // Correct the old tail word, setting or clearing formerly unused bits
792
798
let old_last_word = blocks_for_bits ( self . nbits ) - 1 ;
793
799
if self . nbits % u32:: BITS > 0 {
794
- let overhang = self . nbits % u32:: BITS ; // # of already-used bits
795
- let mask = !( ( 1 << overhang) - 1 ) ; // e.g. 5 unused bits => 111110..0
800
+ let mask = mask_for_bits ( self . nbits ) ;
796
801
if value {
797
- self . storage [ old_last_word] |= mask;
802
+ self . storage [ old_last_word] |= ! mask;
798
803
} else {
799
- self . storage [ old_last_word] &= !mask;
804
+ // Extra bits are already supposed to be zero by invariant, but play it safe...
805
+ self . storage [ old_last_word] &= mask;
800
806
}
801
807
}
802
808
@@ -835,10 +841,11 @@ impl Bitv {
835
841
if self . is_empty ( ) {
836
842
None
837
843
} else {
838
- let ret = self [ self . nbits - 1 ] ;
844
+ let i = self . nbits - 1 ;
845
+ let ret = self [ i] ;
839
846
// Second rule of Bitv Club
840
- self . set ( self . nbits - 1 , false ) ;
841
- self . nbits -= 1 ;
847
+ self . set ( i , false ) ;
848
+ self . nbits = i ;
842
849
Some ( ret)
843
850
}
844
851
}
@@ -1794,14 +1801,17 @@ mod bitv_test {
1794
1801
let act = Bitv :: new ( ) ;
1795
1802
let exp = Vec :: from_elem ( 0 u, false ) ;
1796
1803
assert ! ( act. eq_vec( exp. as_slice( ) ) ) ;
1804
+ assert ! ( act. none( ) && act. all( ) ) ;
1797
1805
}
1798
1806
1799
1807
#[ test]
1800
1808
fn test_1_element ( ) {
1801
1809
let mut act = Bitv :: from_elem ( 1 u, false ) ;
1802
1810
assert ! ( act. eq_vec( & [ false ] ) ) ;
1811
+ assert ! ( act. none( ) && !act. all( ) ) ;
1803
1812
act = Bitv :: from_elem ( 1 u, true ) ;
1804
1813
assert ! ( act. eq_vec( & [ true ] ) ) ;
1814
+ assert ! ( !act. none( ) && act. all( ) ) ;
1805
1815
}
1806
1816
1807
1817
#[ test]
@@ -1810,6 +1820,7 @@ mod bitv_test {
1810
1820
b. set ( 0 , true ) ;
1811
1821
b. set ( 1 , false ) ;
1812
1822
assert_eq ! ( b. to_string( ) . as_slice( ) , "10" ) ;
1823
+ assert ! ( !b. none( ) && !b. all( ) ) ;
1813
1824
}
1814
1825
1815
1826
#[ test]
@@ -1820,10 +1831,12 @@ mod bitv_test {
1820
1831
act = Bitv :: from_elem ( 10 u, false ) ;
1821
1832
assert ! ( ( act. eq_vec(
1822
1833
& [ false , false , false , false , false , false , false , false , false , false ] ) ) ) ;
1834
+ assert ! ( act. none( ) && !act. all( ) ) ;
1823
1835
// all 1
1824
1836
1825
1837
act = Bitv :: from_elem ( 10 u, true ) ;
1826
1838
assert ! ( ( act. eq_vec( & [ true , true , true , true , true , true , true , true , true , true ] ) ) ) ;
1839
+ assert ! ( !act. none( ) && act. all( ) ) ;
1827
1840
// mixed
1828
1841
1829
1842
act = Bitv :: from_elem ( 10 u, false ) ;
@@ -1833,6 +1846,7 @@ mod bitv_test {
1833
1846
act. set ( 3 u, true ) ;
1834
1847
act. set ( 4 u, true ) ;
1835
1848
assert ! ( ( act. eq_vec( & [ true , true , true , true , true , false , false , false , false , false ] ) ) ) ;
1849
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1836
1850
// mixed
1837
1851
1838
1852
act = Bitv :: from_elem ( 10 u, false ) ;
@@ -1842,6 +1856,7 @@ mod bitv_test {
1842
1856
act. set ( 8 u, true ) ;
1843
1857
act. set ( 9 u, true ) ;
1844
1858
assert ! ( ( act. eq_vec( & [ false , false , false , false , false , true , true , true , true , true ] ) ) ) ;
1859
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1845
1860
// mixed
1846
1861
1847
1862
act = Bitv :: from_elem ( 10 u, false ) ;
@@ -1850,6 +1865,7 @@ mod bitv_test {
1850
1865
act. set ( 6 u, true ) ;
1851
1866
act. set ( 9 u, true ) ;
1852
1867
assert ! ( ( act. eq_vec( & [ true , false , false , true , false , false , true , false , false , true ] ) ) ) ;
1868
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1853
1869
}
1854
1870
1855
1871
#[ test]
@@ -1862,13 +1878,15 @@ mod bitv_test {
1862
1878
& [ false , false , false , false , false , false , false , false , false , false , false ,
1863
1879
false , false , false , false , false , false , false , false , false , false , false ,
1864
1880
false , false , false , false , false , false , false , false , false ] ) ) ;
1881
+ assert ! ( act. none( ) && !act. all( ) ) ;
1865
1882
// all 1
1866
1883
1867
1884
act = Bitv :: from_elem ( 31 u, true ) ;
1868
1885
assert ! ( act. eq_vec(
1869
1886
& [ true , true , true , true , true , true , true , true , true , true , true , true , true ,
1870
1887
true , true , true , true , true , true , true , true , true , true , true , true , true ,
1871
1888
true , true , true , true , true ] ) ) ;
1889
+ assert ! ( !act. none( ) && act. all( ) ) ;
1872
1890
// mixed
1873
1891
1874
1892
act = Bitv :: from_elem ( 31 u, false ) ;
@@ -1884,6 +1902,7 @@ mod bitv_test {
1884
1902
& [ true , true , true , true , true , true , true , true , false , false , false , false , false ,
1885
1903
false , false , false , false , false , false , false , false , false , false , false ,
1886
1904
false , false , false , false , false , false , false ] ) ) ;
1905
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1887
1906
// mixed
1888
1907
1889
1908
act = Bitv :: from_elem ( 31 u, false ) ;
@@ -1899,6 +1918,7 @@ mod bitv_test {
1899
1918
& [ false , false , false , false , false , false , false , false , false , false , false ,
1900
1919
false , false , false , false , false , true , true , true , true , true , true , true , true ,
1901
1920
false , false , false , false , false , false , false ] ) ) ;
1921
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1902
1922
// mixed
1903
1923
1904
1924
act = Bitv :: from_elem ( 31 u, false ) ;
@@ -1913,6 +1933,7 @@ mod bitv_test {
1913
1933
& [ false , false , false , false , false , false , false , false , false , false , false ,
1914
1934
false , false , false , false , false , false , false , false , false , false , false ,
1915
1935
false , false , true , true , true , true , true , true , true ] ) ) ;
1936
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1916
1937
// mixed
1917
1938
1918
1939
act = Bitv :: from_elem ( 31 u, false ) ;
@@ -1923,6 +1944,7 @@ mod bitv_test {
1923
1944
& [ false , false , false , true , false , false , false , false , false , false , false , false ,
1924
1945
false , false , false , false , false , true , false , false , false , false , false , false ,
1925
1946
false , false , false , false , false , false , true ] ) ) ;
1947
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1926
1948
}
1927
1949
1928
1950
#[ test]
@@ -1935,13 +1957,15 @@ mod bitv_test {
1935
1957
& [ false , false , false , false , false , false , false , false , false , false , false ,
1936
1958
false , false , false , false , false , false , false , false , false , false , false ,
1937
1959
false , false , false , false , false , false , false , false , false , false ] ) ) ;
1960
+ assert ! ( act. none( ) && !act. all( ) ) ;
1938
1961
// all 1
1939
1962
1940
1963
act = Bitv :: from_elem ( 32 u, true ) ;
1941
1964
assert ! ( act. eq_vec(
1942
1965
& [ true , true , true , true , true , true , true , true , true , true , true , true , true ,
1943
1966
true , true , true , true , true , true , true , true , true , true , true , true , true ,
1944
1967
true , true , true , true , true , true ] ) ) ;
1968
+ assert ! ( !act. none( ) && act. all( ) ) ;
1945
1969
// mixed
1946
1970
1947
1971
act = Bitv :: from_elem ( 32 u, false ) ;
@@ -1957,6 +1981,7 @@ mod bitv_test {
1957
1981
& [ true , true , true , true , true , true , true , true , false , false , false , false , false ,
1958
1982
false , false , false , false , false , false , false , false , false , false , false ,
1959
1983
false , false , false , false , false , false , false , false ] ) ) ;
1984
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1960
1985
// mixed
1961
1986
1962
1987
act = Bitv :: from_elem ( 32 u, false ) ;
@@ -1972,6 +1997,7 @@ mod bitv_test {
1972
1997
& [ false , false , false , false , false , false , false , false , false , false , false ,
1973
1998
false , false , false , false , false , true , true , true , true , true , true , true , true ,
1974
1999
false , false , false , false , false , false , false , false ] ) ) ;
2000
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1975
2001
// mixed
1976
2002
1977
2003
act = Bitv :: from_elem ( 32 u, false ) ;
@@ -1987,6 +2013,7 @@ mod bitv_test {
1987
2013
& [ false , false , false , false , false , false , false , false , false , false , false ,
1988
2014
false , false , false , false , false , false , false , false , false , false , false ,
1989
2015
false , false , true , true , true , true , true , true , true , true ] ) ) ;
2016
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1990
2017
// mixed
1991
2018
1992
2019
act = Bitv :: from_elem ( 32 u, false ) ;
@@ -1998,6 +2025,7 @@ mod bitv_test {
1998
2025
& [ false , false , false , true , false , false , false , false , false , false , false , false ,
1999
2026
false , false , false , false , false , true , false , false , false , false , false , false ,
2000
2027
false , false , false , false , false , false , true , true ] ) ) ;
2028
+ assert ! ( !act. none( ) && !act. all( ) ) ;
2001
2029
}
2002
2030
2003
2031
#[ test]
@@ -2010,13 +2038,15 @@ mod bitv_test {
2010
2038
& [ false , false , false , false , false , false , false , false , false , false , false ,
2011
2039
false , false , false , false , false , false , false , false , false , false , false ,
2012
2040
false , false , false , false , false , false , false , false , false , false , false ] ) ) ;
2041
+ assert ! ( act. none( ) && !act. all( ) ) ;
2013
2042
// all 1
2014
2043
2015
2044
act = Bitv :: from_elem ( 33 u, true ) ;
2016
2045
assert ! ( act. eq_vec(
2017
2046
& [ true , true , true , true , true , true , true , true , true , true , true , true , true ,
2018
2047
true , true , true , true , true , true , true , true , true , true , true , true , true ,
2019
2048
true , true , true , true , true , true , true ] ) ) ;
2049
+ assert ! ( !act. none( ) && act. all( ) ) ;
2020
2050
// mixed
2021
2051
2022
2052
act = Bitv :: from_elem ( 33 u, false ) ;
@@ -2032,6 +2062,7 @@ mod bitv_test {
2032
2062
& [ true , true , true , true , true , true , true , true , false , false , false , false , false ,
2033
2063
false , false , false , false , false , false , false , false , false , false , false ,
2034
2064
false , false , false , false , false , false , false , false , false ] ) ) ;
2065
+ assert ! ( !act. none( ) && !act. all( ) ) ;
2035
2066
// mixed
2036
2067
2037
2068
act = Bitv :: from_elem ( 33 u, false ) ;
@@ -2047,6 +2078,7 @@ mod bitv_test {
2047
2078
& [ false , false , false , false , false , false , false , false , false , false , false ,
2048
2079
false , false , false , false , false , true , true , true , true , true , true , true , true ,
2049
2080
false , false , false , false , false , false , false , false , false ] ) ) ;
2081
+ assert ! ( !act. none( ) && !act. all( ) ) ;
2050
2082
// mixed
2051
2083
2052
2084
act = Bitv :: from_elem ( 33 u, false ) ;
@@ -2062,6 +2094,7 @@ mod bitv_test {
2062
2094
& [ false , false , false , false , false , false , false , false , false , false , false ,
2063
2095
false , false , false , false , false , false , false , false , false , false , false ,
2064
2096
false , false , true , true , true , true , true , true , true , true , false ] ) ) ;
2097
+ assert ! ( !act. none( ) && !act. all( ) ) ;
2065
2098
// mixed
2066
2099
2067
2100
act = Bitv :: from_elem ( 33 u, false ) ;
@@ -2074,6 +2107,7 @@ mod bitv_test {
2074
2107
& [ false , false , false , true , false , false , false , false , false , false , false , false ,
2075
2108
false , false , false , false , false , true , false , false , false , false , false , false ,
2076
2109
false , false , false , false , false , false , true , true , true ] ) ) ;
2110
+ assert ! ( !act. none( ) && !act. all( ) ) ;
2077
2111
}
2078
2112
2079
2113
#[ test]
@@ -2191,15 +2225,17 @@ mod bitv_test {
2191
2225
#[ test]
2192
2226
fn test_small_clear ( ) {
2193
2227
let mut b = Bitv :: from_elem ( 14 , true ) ;
2228
+ assert ! ( !b. none( ) && b. all( ) ) ;
2194
2229
b. clear ( ) ;
2195
- assert ! ( b. none( ) ) ;
2230
+ assert ! ( b. none( ) && !b . all ( ) ) ;
2196
2231
}
2197
2232
2198
2233
#[ test]
2199
2234
fn test_big_clear ( ) {
2200
2235
let mut b = Bitv :: from_elem ( 140 , true ) ;
2236
+ assert ! ( !b. none( ) && b. all( ) ) ;
2201
2237
b. clear ( ) ;
2202
- assert ! ( b. none( ) ) ;
2238
+ assert ! ( b. none( ) && !b . all ( ) ) ;
2203
2239
}
2204
2240
2205
2241
#[ test]
0 commit comments