Fix bug with sub.

This commit is contained in:
2018-01-19 13:44:15 +01:00
parent ff6f6a12d9
commit 9fbf57ab4c

View File

@@ -253,16 +253,14 @@ impl<'a> ops::Sub<&'a BitSet> for &'a BitSet {
fn sub(self, rhs: &'a BitSet) -> BitSet { fn sub(self, rhs: &'a BitSet) -> BitSet {
let mut set = self.clone(); let mut set = self.clone();
set.nbits = 0;
for (key, value) in &rhs.blocks { for (key, value) in &rhs.blocks {
let block = set.blocks.entry(*key).or_insert(0); let block = set.blocks.entry(*key).or_insert(0);
*block &= !value; *block &= !value;
set.nbits += block.count_ones() as usize;
} }
set.nbits = set.blocks.values().map(|block| block.count_ones()).sum::<u32>() as usize;
set set
} }
} }
@@ -583,6 +581,21 @@ mod tests {
i += 1; i += 1;
} }
assert_eq!(i, expected.len()); assert_eq!(i, expected.len());
assert_eq!(set.len(), expected.len());
let a: BitSet = vec![1, 2, 3, 4, 5, 100, 101, 1001, 1002].into_iter().collect();
let b: BitSet = vec![1, 2, 3].into_iter().collect();
let set = &a - &b;
let mut i = 0;
let expected = [4, 5, 100, 101, 1001, 1002];
for x in &set {
assert!(expected.contains(&x));
i += 1;
}
assert_eq!(i, expected.len());
assert_eq!(set.len(), expected.len());
} }
#[test] #[test]