From 7844a056506acf16a6486e7c9af79c5896519aed Mon Sep 17 00:00:00 2001 From: mat Date: Mon, 7 Nov 2022 20:57:32 -0600 Subject: [PATCH] fix edge case with clearing bitsets --- azalea-core/src/bitset.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/azalea-core/src/bitset.rs b/azalea-core/src/bitset.rs index 270ea837..297c0631 100644 --- a/azalea-core/src/bitset.rs +++ b/azalea-core/src/bitset.rs @@ -51,8 +51,12 @@ impl BitSet { end_word_index = self.data.len() - 1; } - let first_word_mask = u64::MAX << from_index; - let last_word_mask = u64::MAX >> (64 - (to_index % 64)); + let first_word_mask = u64::MAX.wrapping_shl( + from_index + .try_into() + .expect("from_index shouldn't be larger than u32"), + ); + let last_word_mask = u64::MAX.wrapping_shr((64 - (to_index % 64)) as u32); if start_word_index == end_word_index { // Case 1: One word self.data[start_word_index] &= !(first_word_mask & last_word_mask); @@ -136,4 +140,22 @@ mod tests { assert_eq!(bitset.index(65), true); assert_eq!(bitset.index(66), true); } + + #[test] + fn test_clear_2() { + let mut bitset = BitSet::new(128); + bitset.set(64); + bitset.set(65); + bitset.set(66); + bitset.set(67); + bitset.set(68); + + bitset.clear(65, 67); + + assert_eq!(bitset.index(64), true); + assert_eq!(bitset.index(65), false); + assert_eq!(bitset.index(66), false); + assert_eq!(bitset.index(67), true); + assert_eq!(bitset.index(68), true); + } }