Skip to content

Commit 24329d7

Browse files
tbu-Gankra
authored andcommitted
Change Extend and FromIterator functionality of BitvSet
Also fix up some tests from last commit.
1 parent e84a383 commit 24329d7

File tree

1 file changed

+29
-17
lines changed

1 file changed

+29
-17
lines changed

src/libcollections/bit.rs

+29-17
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@ type Blocks<'a> = Cloned<Items<'a, u32>>;
9898
type MutBlocks<'a> = MutItems<'a, u32>;
9999
type MatchWords<'a> = Chain<Enumerate<Blocks<'a>>, Skip<Take<Enumerate<Repeat<u32>>>>>;
100100

101+
fn reverse_bits(byte: u8) -> u8 {
102+
let mut result = 0;
103+
for i in range(0, u8::BITS) {
104+
result |= ((byte >> i) & 1) << (u8::BITS - 1 - i);
105+
}
106+
result
107+
}
108+
101109
// Take two BitV's, and return iterators of their words, where the shorter one
102110
// has been padded with 0's
103111
fn match_words <'a,'b>(a: &'a Bitv, b: &'b Bitv) -> (MatchWords<'a>, MatchWords<'b>) {
@@ -303,19 +311,21 @@ impl Bitv {
303311
let complete_words = bytes.len() / 4;
304312
let extra_bytes = bytes.len() % 4;
305313

314+
bitv.nbits = len;
315+
306316
for i in range(0, complete_words) {
307317
bitv.storage.push(
308-
(bytes[i * 4 + 0] as u32 << 0) |
309-
(bytes[i * 4 + 1] as u32 << 8) |
310-
(bytes[i * 4 + 2] as u32 << 16) |
311-
(bytes[i * 4 + 3] as u32 << 24)
318+
(reverse_bits(bytes[i * 4 + 0]) as u32 << 0) |
319+
(reverse_bits(bytes[i * 4 + 1]) as u32 << 8) |
320+
(reverse_bits(bytes[i * 4 + 2]) as u32 << 16) |
321+
(reverse_bits(bytes[i * 4 + 3]) as u32 << 24)
312322
);
313323
}
314324

315325
if extra_bytes > 0 {
316326
let mut last_word = 0u32;
317327
for (i, &byte) in bytes[complete_words*4..].iter().enumerate() {
318-
last_word |= byte as u32 << (i * 8);
328+
last_word |= reverse_bits(byte) as u32 << (i * 8);
319329
}
320330
bitv.storage.push(last_word);
321331
}
@@ -1102,18 +1112,20 @@ impl Default for BitvSet {
11021112
fn default() -> BitvSet { BitvSet::new() }
11031113
}
11041114

1105-
impl FromIterator<bool> for BitvSet {
1106-
fn from_iter<I:Iterator<bool>>(iterator: I) -> BitvSet {
1115+
impl FromIterator<uint> for BitvSet {
1116+
fn from_iter<I:Iterator<uint>>(iterator: I) -> BitvSet {
11071117
let mut ret = BitvSet::new();
11081118
ret.extend(iterator);
11091119
ret
11101120
}
11111121
}
11121122

1113-
impl Extend<bool> for BitvSet {
1123+
impl Extend<uint> for BitvSet {
11141124
#[inline]
1115-
fn extend<I: Iterator<bool>>(&mut self, iterator: I) {
1116-
self.bitv.extend(iterator);
1125+
fn extend<I: Iterator<uint>>(&mut self, mut iterator: I) {
1126+
for i in iterator {
1127+
self.insert(i);
1128+
}
11171129
}
11181130
}
11191131

@@ -2592,9 +2604,9 @@ mod bitv_set_test {
25922604
}
25932605

25942606
#[test]
2595-
fn test_bitv_set_from_bools() {
2596-
let bools = vec![true, false, true, true];
2597-
let a: BitvSet = bools.iter().map(|n| *n).collect();
2607+
fn test_bitv_set_from_uints() {
2608+
let uints = vec![0, 2, 2, 3];
2609+
let a: BitvSet = uints.into_iter().collect();
25982610
let mut b = BitvSet::new();
25992611
b.insert(0);
26002612
b.insert(2);
@@ -2604,13 +2616,13 @@ mod bitv_set_test {
26042616

26052617
#[test]
26062618
fn test_bitv_set_iterator() {
2607-
let bools = [true, false, true, true];
2608-
let bitv: BitvSet = bools.iter().map(|n| *n).collect();
2619+
let uints = vec![0, 2, 2, 3];
2620+
let bitv: BitvSet = uints.into_iter().collect();
26092621

26102622
let idxs: Vec<uint> = bitv.iter().collect();
2611-
assert_eq!(idxs, vec!(0, 2, 3));
2623+
assert_eq!(idxs, vec![0, 2, 3]);
26122624

2613-
let long: BitvSet = range(0u, 10000).map(|n| n % 2 == 0).collect();
2625+
let long: BitvSet = range(0u, 10000).filter(|&n| n % 2 == 0).collect();
26142626
let real = range_step(0, 10000, 2).collect::<Vec<uint>>();
26152627

26162628
let idxs: Vec<uint> = long.iter().collect();

0 commit comments

Comments
 (0)