diff --git a/src/lib.rs b/src/lib.rs index 9031eb6..3f19045 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -253,16 +253,14 @@ impl<'a> ops::Sub<&'a BitSet> for &'a BitSet { fn sub(self, rhs: &'a BitSet) -> BitSet { let mut set = self.clone(); - set.nbits = 0; - for (key, value) in &rhs.blocks { let block = set.blocks.entry(*key).or_insert(0); *block &= !value; - - set.nbits += block.count_ones() as usize; } + set.nbits = set.blocks.values().map(|block| block.count_ones()).sum::() as usize; + set } } @@ -583,6 +581,21 @@ mod tests { i += 1; } 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]