@@ -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 ) % 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.
@@ -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
@@ -1808,14 +1814,17 @@ mod tests {
1808
1814
let act = Bitv :: new ( ) ;
1809
1815
let exp = Vec :: from_elem ( 0 u, false ) ;
1810
1816
assert ! ( act. eq_vec( exp. as_slice( ) ) ) ;
1817
+ assert ! ( act. none( ) && act. all( ) ) ;
1811
1818
}
1812
1819
1813
1820
#[ test]
1814
1821
fn test_1_element ( ) {
1815
1822
let mut act = Bitv :: from_elem ( 1 u, false ) ;
1816
1823
assert ! ( act. eq_vec( & [ false ] ) ) ;
1824
+ assert ! ( act. none( ) && !act. all( ) ) ;
1817
1825
act = Bitv :: from_elem ( 1 u, true ) ;
1818
1826
assert ! ( act. eq_vec( & [ true ] ) ) ;
1827
+ assert ! ( !act. none( ) && act. all( ) ) ;
1819
1828
}
1820
1829
1821
1830
#[ test]
@@ -1824,6 +1833,7 @@ mod tests {
1824
1833
b. set ( 0 , true ) ;
1825
1834
b. set ( 1 , false ) ;
1826
1835
assert_eq ! ( b. to_string( ) , "10" ) ;
1836
+ assert ! ( !b. none( ) && !b. all( ) ) ;
1827
1837
}
1828
1838
1829
1839
#[ test]
@@ -1834,10 +1844,12 @@ mod tests {
1834
1844
act = Bitv :: from_elem ( 10 u, false ) ;
1835
1845
assert ! ( ( act. eq_vec(
1836
1846
& [ false , false , false , false , false , false , false , false , false , false ] ) ) ) ;
1847
+ assert ! ( act. none( ) && !act. all( ) ) ;
1837
1848
// all 1
1838
1849
1839
1850
act = Bitv :: from_elem ( 10 u, true ) ;
1840
1851
assert ! ( ( act. eq_vec( & [ true , true , true , true , true , true , true , true , true , true ] ) ) ) ;
1852
+ assert ! ( !act. none( ) && act. all( ) ) ;
1841
1853
// mixed
1842
1854
1843
1855
act = Bitv :: from_elem ( 10 u, false ) ;
@@ -1847,6 +1859,7 @@ mod tests {
1847
1859
act. set ( 3 u, true ) ;
1848
1860
act. set ( 4 u, true ) ;
1849
1861
assert ! ( ( act. eq_vec( & [ true , true , true , true , true , false , false , false , false , false ] ) ) ) ;
1862
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1850
1863
// mixed
1851
1864
1852
1865
act = Bitv :: from_elem ( 10 u, false ) ;
@@ -1856,6 +1869,7 @@ mod tests {
1856
1869
act. set ( 8 u, true ) ;
1857
1870
act. set ( 9 u, true ) ;
1858
1871
assert ! ( ( act. eq_vec( & [ false , false , false , false , false , true , true , true , true , true ] ) ) ) ;
1872
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1859
1873
// mixed
1860
1874
1861
1875
act = Bitv :: from_elem ( 10 u, false ) ;
@@ -1864,6 +1878,7 @@ mod tests {
1864
1878
act. set ( 6 u, true ) ;
1865
1879
act. set ( 9 u, true ) ;
1866
1880
assert ! ( ( act. eq_vec( & [ true , false , false , true , false , false , true , false , false , true ] ) ) ) ;
1881
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1867
1882
}
1868
1883
1869
1884
#[ test]
@@ -1876,13 +1891,15 @@ mod tests {
1876
1891
& [ false , false , false , false , false , false , false , false , false , false , false ,
1877
1892
false , false , false , false , false , false , false , false , false , false , false ,
1878
1893
false , false , false , false , false , false , false , false , false ] ) ) ;
1894
+ assert ! ( act. none( ) && !act. all( ) ) ;
1879
1895
// all 1
1880
1896
1881
1897
act = Bitv :: from_elem ( 31 u, true ) ;
1882
1898
assert ! ( act. eq_vec(
1883
1899
& [ true , true , true , true , true , true , true , true , true , true , true , true , true ,
1884
1900
true , true , true , true , true , true , true , true , true , true , true , true , true ,
1885
1901
true , true , true , true , true ] ) ) ;
1902
+ assert ! ( !act. none( ) && act. all( ) ) ;
1886
1903
// mixed
1887
1904
1888
1905
act = Bitv :: from_elem ( 31 u, false ) ;
@@ -1898,6 +1915,7 @@ mod tests {
1898
1915
& [ true , true , true , true , true , true , true , true , false , false , false , false , false ,
1899
1916
false , false , false , false , false , false , false , false , false , false , false ,
1900
1917
false , false , false , false , false , false , false ] ) ) ;
1918
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1901
1919
// mixed
1902
1920
1903
1921
act = Bitv :: from_elem ( 31 u, false ) ;
@@ -1913,6 +1931,7 @@ mod tests {
1913
1931
& [ false , false , false , false , false , false , false , false , false , false , false ,
1914
1932
false , false , false , false , false , true , true , true , true , true , true , true , true ,
1915
1933
false , false , false , false , false , false , false ] ) ) ;
1934
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1916
1935
// mixed
1917
1936
1918
1937
act = Bitv :: from_elem ( 31 u, false ) ;
@@ -1927,6 +1946,7 @@ mod tests {
1927
1946
& [ false , false , false , false , false , false , false , false , false , false , false ,
1928
1947
false , false , false , false , false , false , false , false , false , false , false ,
1929
1948
false , false , true , true , true , true , true , true , true ] ) ) ;
1949
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1930
1950
// mixed
1931
1951
1932
1952
act = Bitv :: from_elem ( 31 u, false ) ;
@@ -1937,6 +1957,7 @@ mod tests {
1937
1957
& [ false , false , false , true , false , false , false , false , false , false , false , false ,
1938
1958
false , false , false , false , false , true , false , false , false , false , false , false ,
1939
1959
false , false , false , false , false , false , true ] ) ) ;
1960
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1940
1961
}
1941
1962
1942
1963
#[ test]
@@ -1949,13 +1970,15 @@ mod tests {
1949
1970
& [ false , false , false , false , false , false , false , false , false , false , false ,
1950
1971
false , false , false , false , false , false , false , false , false , false , false ,
1951
1972
false , false , false , false , false , false , false , false , false , false ] ) ) ;
1973
+ assert ! ( act. none( ) && !act. all( ) ) ;
1952
1974
// all 1
1953
1975
1954
1976
act = Bitv :: from_elem ( 32 u, true ) ;
1955
1977
assert ! ( act. eq_vec(
1956
1978
& [ true , true , true , true , true , true , true , true , true , true , true , true , true ,
1957
1979
true , true , true , true , true , true , true , true , true , true , true , true , true ,
1958
1980
true , true , true , true , true , true ] ) ) ;
1981
+ assert ! ( !act. none( ) && act. all( ) ) ;
1959
1982
// mixed
1960
1983
1961
1984
act = Bitv :: from_elem ( 32 u, false ) ;
@@ -1971,6 +1994,7 @@ mod tests {
1971
1994
& [ true , true , true , true , true , true , true , true , false , false , false , false , false ,
1972
1995
false , false , false , false , false , false , false , false , false , false , false ,
1973
1996
false , false , false , false , false , false , false , false ] ) ) ;
1997
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1974
1998
// mixed
1975
1999
1976
2000
act = Bitv :: from_elem ( 32 u, false ) ;
@@ -1986,6 +2010,7 @@ mod tests {
1986
2010
& [ false , false , false , false , false , false , false , false , false , false , false ,
1987
2011
false , false , false , false , false , true , true , true , true , true , true , true , true ,
1988
2012
false , false , false , false , false , false , false , false ] ) ) ;
2013
+ assert ! ( !act. none( ) && !act. all( ) ) ;
1989
2014
// mixed
1990
2015
1991
2016
act = Bitv :: from_elem ( 32 u, false ) ;
@@ -2001,6 +2026,7 @@ mod tests {
2001
2026
& [ false , false , false , false , false , false , false , false , false , false , false ,
2002
2027
false , false , false , false , false , false , false , false , false , false , false ,
2003
2028
false , false , true , true , true , true , true , true , true , true ] ) ) ;
2029
+ assert ! ( !act. none( ) && !act. all( ) ) ;
2004
2030
// mixed
2005
2031
2006
2032
act = Bitv :: from_elem ( 32 u, false ) ;
@@ -2012,6 +2038,7 @@ mod tests {
2012
2038
& [ false , false , false , true , false , false , false , false , false , false , false , false ,
2013
2039
false , false , false , false , false , true , false , false , false , false , false , false ,
2014
2040
false , false , false , false , false , false , true , true ] ) ) ;
2041
+ assert ! ( !act. none( ) && !act. all( ) ) ;
2015
2042
}
2016
2043
2017
2044
#[ test]
@@ -2024,13 +2051,15 @@ mod tests {
2024
2051
& [ false , false , false , false , false , false , false , false , false , false , false ,
2025
2052
false , false , false , false , false , false , false , false , false , false , false ,
2026
2053
false , false , false , false , false , false , false , false , false , false , false ] ) ) ;
2054
+ assert ! ( act. none( ) && !act. all( ) ) ;
2027
2055
// all 1
2028
2056
2029
2057
act = Bitv :: from_elem ( 33 u, true ) ;
2030
2058
assert ! ( act. eq_vec(
2031
2059
& [ true , true , true , true , true , true , true , true , true , true , true , true , true ,
2032
2060
true , true , true , true , true , true , true , true , true , true , true , true , true ,
2033
2061
true , true , true , true , true , true , true ] ) ) ;
2062
+ assert ! ( !act. none( ) && act. all( ) ) ;
2034
2063
// mixed
2035
2064
2036
2065
act = Bitv :: from_elem ( 33 u, false ) ;
@@ -2046,6 +2075,7 @@ mod tests {
2046
2075
& [ true , true , true , true , true , true , true , true , false , false , false , false , false ,
2047
2076
false , false , false , false , false , false , false , false , false , false , false ,
2048
2077
false , false , false , false , false , false , false , false , false ] ) ) ;
2078
+ assert ! ( !act. none( ) && !act. all( ) ) ;
2049
2079
// mixed
2050
2080
2051
2081
act = Bitv :: from_elem ( 33 u, false ) ;
@@ -2061,6 +2091,7 @@ mod tests {
2061
2091
& [ false , false , false , false , false , false , false , false , false , false , false ,
2062
2092
false , false , false , false , false , true , true , true , true , true , true , true , true ,
2063
2093
false , false , false , false , false , false , false , false , false ] ) ) ;
2094
+ assert ! ( !act. none( ) && !act. all( ) ) ;
2064
2095
// mixed
2065
2096
2066
2097
act = Bitv :: from_elem ( 33 u, false ) ;
@@ -2076,6 +2107,7 @@ mod tests {
2076
2107
& [ false , false , false , false , false , false , false , false , false , false , false ,
2077
2108
false , false , false , false , false , false , false , false , false , false , false ,
2078
2109
false , false , true , true , true , true , true , true , true , true , false ] ) ) ;
2110
+ assert ! ( !act. none( ) && !act. all( ) ) ;
2079
2111
// mixed
2080
2112
2081
2113
act = Bitv :: from_elem ( 33 u, false ) ;
@@ -2088,6 +2120,7 @@ mod tests {
2088
2120
& [ false , false , false , true , false , false , false , false , false , false , false , false ,
2089
2121
false , false , false , false , false , true , false , false , false , false , false , false ,
2090
2122
false , false , false , false , false , false , true , true , true ] ) ) ;
2123
+ assert ! ( !act. none( ) && !act. all( ) ) ;
2091
2124
}
2092
2125
2093
2126
#[ test]
@@ -2234,15 +2267,17 @@ mod tests {
2234
2267
#[ test]
2235
2268
fn test_small_clear ( ) {
2236
2269
let mut b = Bitv :: from_elem ( 14 , true ) ;
2270
+ assert ! ( !b. none( ) && b. all( ) ) ;
2237
2271
b. clear ( ) ;
2238
- assert ! ( b. none( ) ) ;
2272
+ assert ! ( b. none( ) && !b . all ( ) ) ;
2239
2273
}
2240
2274
2241
2275
#[ test]
2242
2276
fn test_big_clear ( ) {
2243
2277
let mut b = Bitv :: from_elem ( 140 , true ) ;
2278
+ assert ! ( !b. none( ) && b. all( ) ) ;
2244
2279
b. clear ( ) ;
2245
- assert ! ( b. none( ) ) ;
2280
+ assert ! ( b. none( ) && !b . all ( ) ) ;
2246
2281
}
2247
2282
2248
2283
#[ test]
0 commit comments