Skip to content

Commit 6fe16b7

Browse files
committed
Merge pull request #1 from cuviper/bitv
Correct bitv build failures and a bug in all()
2 parents 1b43b25 + 0f70e1a commit 6fe16b7

File tree

1 file changed

+51
-15
lines changed

1 file changed

+51
-15
lines changed

src/libcollections/bit.rs

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ use std::hash;
8787

8888
use vec::Vec;
8989

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>;
9292
type MatchWords<'a> = Chain<Enumerate<Blocks<'a>>, Skip<Take<Enumerate<Repeat<u32>>>>>;
9393

9494
// 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 {
174174

175175
}
176176

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+
177183
impl Bitv {
178184
/// Applies the given operation to the blocks of self and other, and sets self to
179185
/// be the result.
@@ -199,7 +205,7 @@ impl Bitv {
199205
/// Iterator over mutable refs to the underlying blocks of data.
200206
fn blocks_mut(&mut self) -> MutBlocks {
201207
let blocks = blocks_for_bits(self.len());
202-
self.storage[..blocks].iter_mut()
208+
self.storage.slice_to_mut(blocks).iter_mut()
203209
}
204210

205211
/// Iterator over the underlying blocks of data
@@ -336,7 +342,7 @@ impl Bitv {
336342
assert!(i < self.nbits);
337343
let w = i / u32::BITS;
338344
let b = i % u32::BITS;
339-
self.storage.get(w).map(|block|
345+
self.storage.get(w).map(|&block|
340346
(block & (1 << b)) != 0
341347
)
342348
}
@@ -526,7 +532,7 @@ impl Bitv {
526532
last_word = elem;
527533
tmp == !0u32
528534
// 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))
530536
}
531537

532538
/// Returns an iterator over the elements of the vector in order.
@@ -788,15 +794,15 @@ impl Bitv {
788794
let new_nblocks = blocks_for_bits(new_nbits);
789795
let full_value = if value { !0 } else { 0 };
790796

791-
// Correct the old tail word
797+
// Correct the old tail word, setting or clearing formerly unused bits
792798
let old_last_word = blocks_for_bits(self.nbits) - 1;
793799
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);
796801
if value {
797-
self.storage[old_last_word] |= mask;
802+
self.storage[old_last_word] |= !mask;
798803
} 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;
800806
}
801807
}
802808

@@ -835,10 +841,11 @@ impl Bitv {
835841
if self.is_empty() {
836842
None
837843
} else {
838-
let ret = self[self.nbits - 1];
844+
let i = self.nbits - 1;
845+
let ret = self[i];
839846
// 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;
842849
Some(ret)
843850
}
844851
}
@@ -1794,14 +1801,17 @@ mod bitv_test {
17941801
let act = Bitv::new();
17951802
let exp = Vec::from_elem(0u, false);
17961803
assert!(act.eq_vec(exp.as_slice()));
1804+
assert!(act.none() && act.all());
17971805
}
17981806

17991807
#[test]
18001808
fn test_1_element() {
18011809
let mut act = Bitv::from_elem(1u, false);
18021810
assert!(act.eq_vec(&[false]));
1811+
assert!(act.none() && !act.all());
18031812
act = Bitv::from_elem(1u, true);
18041813
assert!(act.eq_vec(&[true]));
1814+
assert!(!act.none() && act.all());
18051815
}
18061816

18071817
#[test]
@@ -1810,6 +1820,7 @@ mod bitv_test {
18101820
b.set(0, true);
18111821
b.set(1, false);
18121822
assert_eq!(b.to_string().as_slice(), "10");
1823+
assert!(!b.none() && !b.all());
18131824
}
18141825

18151826
#[test]
@@ -1820,10 +1831,12 @@ mod bitv_test {
18201831
act = Bitv::from_elem(10u, false);
18211832
assert!((act.eq_vec(
18221833
&[false, false, false, false, false, false, false, false, false, false])));
1834+
assert!(act.none() && !act.all());
18231835
// all 1
18241836

18251837
act = Bitv::from_elem(10u, true);
18261838
assert!((act.eq_vec(&[true, true, true, true, true, true, true, true, true, true])));
1839+
assert!(!act.none() && act.all());
18271840
// mixed
18281841

18291842
act = Bitv::from_elem(10u, false);
@@ -1833,6 +1846,7 @@ mod bitv_test {
18331846
act.set(3u, true);
18341847
act.set(4u, true);
18351848
assert!((act.eq_vec(&[true, true, true, true, true, false, false, false, false, false])));
1849+
assert!(!act.none() && !act.all());
18361850
// mixed
18371851

18381852
act = Bitv::from_elem(10u, false);
@@ -1842,6 +1856,7 @@ mod bitv_test {
18421856
act.set(8u, true);
18431857
act.set(9u, true);
18441858
assert!((act.eq_vec(&[false, false, false, false, false, true, true, true, true, true])));
1859+
assert!(!act.none() && !act.all());
18451860
// mixed
18461861

18471862
act = Bitv::from_elem(10u, false);
@@ -1850,6 +1865,7 @@ mod bitv_test {
18501865
act.set(6u, true);
18511866
act.set(9u, true);
18521867
assert!((act.eq_vec(&[true, false, false, true, false, false, true, false, false, true])));
1868+
assert!(!act.none() && !act.all());
18531869
}
18541870

18551871
#[test]
@@ -1862,13 +1878,15 @@ mod bitv_test {
18621878
&[false, false, false, false, false, false, false, false, false, false, false,
18631879
false, false, false, false, false, false, false, false, false, false, false,
18641880
false, false, false, false, false, false, false, false, false]));
1881+
assert!(act.none() && !act.all());
18651882
// all 1
18661883

18671884
act = Bitv::from_elem(31u, true);
18681885
assert!(act.eq_vec(
18691886
&[true, true, true, true, true, true, true, true, true, true, true, true, true,
18701887
true, true, true, true, true, true, true, true, true, true, true, true, true,
18711888
true, true, true, true, true]));
1889+
assert!(!act.none() && act.all());
18721890
// mixed
18731891

18741892
act = Bitv::from_elem(31u, false);
@@ -1884,6 +1902,7 @@ mod bitv_test {
18841902
&[true, true, true, true, true, true, true, true, false, false, false, false, false,
18851903
false, false, false, false, false, false, false, false, false, false, false,
18861904
false, false, false, false, false, false, false]));
1905+
assert!(!act.none() && !act.all());
18871906
// mixed
18881907

18891908
act = Bitv::from_elem(31u, false);
@@ -1899,6 +1918,7 @@ mod bitv_test {
18991918
&[false, false, false, false, false, false, false, false, false, false, false,
19001919
false, false, false, false, false, true, true, true, true, true, true, true, true,
19011920
false, false, false, false, false, false, false]));
1921+
assert!(!act.none() && !act.all());
19021922
// mixed
19031923

19041924
act = Bitv::from_elem(31u, false);
@@ -1913,6 +1933,7 @@ mod bitv_test {
19131933
&[false, false, false, false, false, false, false, false, false, false, false,
19141934
false, false, false, false, false, false, false, false, false, false, false,
19151935
false, false, true, true, true, true, true, true, true]));
1936+
assert!(!act.none() && !act.all());
19161937
// mixed
19171938

19181939
act = Bitv::from_elem(31u, false);
@@ -1923,6 +1944,7 @@ mod bitv_test {
19231944
&[false, false, false, true, false, false, false, false, false, false, false, false,
19241945
false, false, false, false, false, true, false, false, false, false, false, false,
19251946
false, false, false, false, false, false, true]));
1947+
assert!(!act.none() && !act.all());
19261948
}
19271949

19281950
#[test]
@@ -1935,13 +1957,15 @@ mod bitv_test {
19351957
&[false, false, false, false, false, false, false, false, false, false, false,
19361958
false, false, false, false, false, false, false, false, false, false, false,
19371959
false, false, false, false, false, false, false, false, false, false]));
1960+
assert!(act.none() && !act.all());
19381961
// all 1
19391962

19401963
act = Bitv::from_elem(32u, true);
19411964
assert!(act.eq_vec(
19421965
&[true, true, true, true, true, true, true, true, true, true, true, true, true,
19431966
true, true, true, true, true, true, true, true, true, true, true, true, true,
19441967
true, true, true, true, true, true]));
1968+
assert!(!act.none() && act.all());
19451969
// mixed
19461970

19471971
act = Bitv::from_elem(32u, false);
@@ -1957,6 +1981,7 @@ mod bitv_test {
19571981
&[true, true, true, true, true, true, true, true, false, false, false, false, false,
19581982
false, false, false, false, false, false, false, false, false, false, false,
19591983
false, false, false, false, false, false, false, false]));
1984+
assert!(!act.none() && !act.all());
19601985
// mixed
19611986

19621987
act = Bitv::from_elem(32u, false);
@@ -1972,6 +1997,7 @@ mod bitv_test {
19721997
&[false, false, false, false, false, false, false, false, false, false, false,
19731998
false, false, false, false, false, true, true, true, true, true, true, true, true,
19741999
false, false, false, false, false, false, false, false]));
2000+
assert!(!act.none() && !act.all());
19752001
// mixed
19762002

19772003
act = Bitv::from_elem(32u, false);
@@ -1987,6 +2013,7 @@ mod bitv_test {
19872013
&[false, false, false, false, false, false, false, false, false, false, false,
19882014
false, false, false, false, false, false, false, false, false, false, false,
19892015
false, false, true, true, true, true, true, true, true, true]));
2016+
assert!(!act.none() && !act.all());
19902017
// mixed
19912018

19922019
act = Bitv::from_elem(32u, false);
@@ -1998,6 +2025,7 @@ mod bitv_test {
19982025
&[false, false, false, true, false, false, false, false, false, false, false, false,
19992026
false, false, false, false, false, true, false, false, false, false, false, false,
20002027
false, false, false, false, false, false, true, true]));
2028+
assert!(!act.none() && !act.all());
20012029
}
20022030

20032031
#[test]
@@ -2010,13 +2038,15 @@ mod bitv_test {
20102038
&[false, false, false, false, false, false, false, false, false, false, false,
20112039
false, false, false, false, false, false, false, false, false, false, false,
20122040
false, false, false, false, false, false, false, false, false, false, false]));
2041+
assert!(act.none() && !act.all());
20132042
// all 1
20142043

20152044
act = Bitv::from_elem(33u, true);
20162045
assert!(act.eq_vec(
20172046
&[true, true, true, true, true, true, true, true, true, true, true, true, true,
20182047
true, true, true, true, true, true, true, true, true, true, true, true, true,
20192048
true, true, true, true, true, true, true]));
2049+
assert!(!act.none() && act.all());
20202050
// mixed
20212051

20222052
act = Bitv::from_elem(33u, false);
@@ -2032,6 +2062,7 @@ mod bitv_test {
20322062
&[true, true, true, true, true, true, true, true, false, false, false, false, false,
20332063
false, false, false, false, false, false, false, false, false, false, false,
20342064
false, false, false, false, false, false, false, false, false]));
2065+
assert!(!act.none() && !act.all());
20352066
// mixed
20362067

20372068
act = Bitv::from_elem(33u, false);
@@ -2047,6 +2078,7 @@ mod bitv_test {
20472078
&[false, false, false, false, false, false, false, false, false, false, false,
20482079
false, false, false, false, false, true, true, true, true, true, true, true, true,
20492080
false, false, false, false, false, false, false, false, false]));
2081+
assert!(!act.none() && !act.all());
20502082
// mixed
20512083

20522084
act = Bitv::from_elem(33u, false);
@@ -2062,6 +2094,7 @@ mod bitv_test {
20622094
&[false, false, false, false, false, false, false, false, false, false, false,
20632095
false, false, false, false, false, false, false, false, false, false, false,
20642096
false, false, true, true, true, true, true, true, true, true, false]));
2097+
assert!(!act.none() && !act.all());
20652098
// mixed
20662099

20672100
act = Bitv::from_elem(33u, false);
@@ -2074,6 +2107,7 @@ mod bitv_test {
20742107
&[false, false, false, true, false, false, false, false, false, false, false, false,
20752108
false, false, false, false, false, true, false, false, false, false, false, false,
20762109
false, false, false, false, false, false, true, true, true]));
2110+
assert!(!act.none() && !act.all());
20772111
}
20782112

20792113
#[test]
@@ -2191,15 +2225,17 @@ mod bitv_test {
21912225
#[test]
21922226
fn test_small_clear() {
21932227
let mut b = Bitv::from_elem(14, true);
2228+
assert!(!b.none() && b.all());
21942229
b.clear();
2195-
assert!(b.none());
2230+
assert!(b.none() && !b.all());
21962231
}
21972232

21982233
#[test]
21992234
fn test_big_clear() {
22002235
let mut b = Bitv::from_elem(140, true);
2236+
assert!(!b.none() && b.all());
22012237
b.clear();
2202-
assert!(b.none());
2238+
assert!(b.none() && !b.all());
22032239
}
22042240

22052241
#[test]

0 commit comments

Comments
 (0)