rootstracker.remove returns previous state (#16831)

This commit is contained in:
Jeff Washington (jwash)
2021-04-27 09:15:44 -05:00
committed by GitHub
parent 3fdbaefaa6
commit 47ca7063f2

View File

@ -246,7 +246,7 @@ impl RollingBitField {
} }
} }
pub fn remove(&mut self, key: &u64) { pub fn remove(&mut self, key: &u64) -> bool {
self.check_range(*key); self.check_range(*key);
let address = self.get_address(key); let address = self.get_address(key);
let value = self.bits.get(address); let value = self.bits.get(address);
@ -255,6 +255,7 @@ impl RollingBitField {
self.bits.set(address, false); self.bits.set(address, false);
self.purge(key); self.purge(key);
} }
value
} }
// after removing 'key' where 'key' = min, make min the correct new min value // after removing 'key' where 'key' = min, make min the correct new min value
@ -1557,8 +1558,7 @@ pub mod tests {
let start = 0; let start = 0;
let (mut bitfield, _hash) = setup_wide(width, start); let (mut bitfield, _hash) = setup_wide(width, start);
let slot = width; let slot = width;
// not set anyway, so no need to assert assert!(!bitfield.remove(&slot));
bitfield.remove(&slot);
} }
#[test] #[test]
@ -1568,7 +1568,7 @@ pub mod tests {
let start = 100; let start = 100;
let (mut bitfield, _hash) = setup_wide(width, start); let (mut bitfield, _hash) = setup_wide(width, start);
let slot = start + 1 - width; let slot = start + 1 - width;
bitfield.remove(&slot); assert!(!bitfield.remove(&slot));
} }
fn compare(hashset: &HashSet<u64>, bitfield: &RollingBitField) { fn compare(hashset: &HashSet<u64>, bitfield: &RollingBitField) {
@ -1635,19 +1635,21 @@ pub mod tests {
assert_eq!(bitfield.contains(&slot), hash.contains(&slot)); assert_eq!(bitfield.contains(&slot), hash.contains(&slot));
} }
let all = bitfield.get_all();
if width > 0 { if width > 0 {
hash.remove(&slot); hash.remove(&slot);
bitfield.remove(&slot); assert!(bitfield.remove(&slot));
assert!(!bitfield.remove(&slot));
} }
compare(&hash, &bitfield); compare(&hash, &bitfield);
let all = bitfield.get_all();
// remove the rest, including a call that removes slot again // remove the rest, including a call that removes slot again
for item in all.iter() { for item in all.iter() {
hash.remove(&item); assert!(hash.remove(&item));
bitfield.remove(&item); assert!(!hash.remove(&item));
assert!(bitfield.remove(&item));
assert!(!bitfield.remove(&item));
compare(&hash, &bitfield); compare(&hash, &bitfield);
} }
@ -1724,11 +1726,12 @@ pub mod tests {
bitfield_insert_and_test(&mut bitfield, 3); bitfield_insert_and_test(&mut bitfield, 3);
bitfield.insert(3); // redundant insert bitfield.insert(3); // redundant insert
assert_eq!(bitfield.get_all(), vec![0, 2, 3]); assert_eq!(bitfield.get_all(), vec![0, 2, 3]);
bitfield.remove(&0); assert!(bitfield.remove(&0));
assert!(!bitfield.remove(&0));
assert_eq!(bitfield.min, 2); assert_eq!(bitfield.min, 2);
assert_eq!(bitfield.max, 4); assert_eq!(bitfield.max, 4);
assert_eq!(bitfield.len(), 2); assert_eq!(bitfield.len(), 2);
bitfield.remove(&0); // redundant remove assert!(!bitfield.remove(&0)); // redundant remove
assert_eq!(bitfield.len(), 2); assert_eq!(bitfield.len(), 2);
assert_eq!(bitfield.get_all(), vec![2, 3]); assert_eq!(bitfield.get_all(), vec![2, 3]);
bitfield.insert(4); // wrapped around value - same bit as '0' bitfield.insert(4); // wrapped around value - same bit as '0'
@ -1736,27 +1739,27 @@ pub mod tests {
assert_eq!(bitfield.max, 5); assert_eq!(bitfield.max, 5);
assert_eq!(bitfield.len(), 3); assert_eq!(bitfield.len(), 3);
assert_eq!(bitfield.get_all(), vec![2, 3, 4]); assert_eq!(bitfield.get_all(), vec![2, 3, 4]);
bitfield.remove(&2); assert!(bitfield.remove(&2));
assert_eq!(bitfield.min, 3); assert_eq!(bitfield.min, 3);
assert_eq!(bitfield.max, 5); assert_eq!(bitfield.max, 5);
assert_eq!(bitfield.len(), 2); assert_eq!(bitfield.len(), 2);
assert_eq!(bitfield.get_all(), vec![3, 4]); assert_eq!(bitfield.get_all(), vec![3, 4]);
bitfield.remove(&3); assert!(bitfield.remove(&3));
assert_eq!(bitfield.min, 4); assert_eq!(bitfield.min, 4);
assert_eq!(bitfield.max, 5); assert_eq!(bitfield.max, 5);
assert_eq!(bitfield.len(), 1); assert_eq!(bitfield.len(), 1);
assert_eq!(bitfield.get_all(), vec![4]); assert_eq!(bitfield.get_all(), vec![4]);
bitfield.remove(&4); assert!(bitfield.remove(&4));
assert_eq!(bitfield.len(), 0); assert_eq!(bitfield.len(), 0);
assert!(bitfield.is_empty()); assert!(bitfield.is_empty());
assert!(bitfield.get_all().is_empty()); assert!(bitfield.get_all().is_empty());
bitfield_insert_and_test(&mut bitfield, 8); bitfield_insert_and_test(&mut bitfield, 8);
bitfield.remove(&8); assert!(bitfield.remove(&8));
assert_eq!(bitfield.len(), 0); assert_eq!(bitfield.len(), 0);
assert!(bitfield.is_empty()); assert!(bitfield.is_empty());
assert!(bitfield.get_all().is_empty()); assert!(bitfield.get_all().is_empty());
bitfield_insert_and_test(&mut bitfield, 9); bitfield_insert_and_test(&mut bitfield, 9);
bitfield.remove(&9); assert!(bitfield.remove(&9));
assert_eq!(bitfield.len(), 0); assert_eq!(bitfield.len(), 0);
assert!(bitfield.is_empty()); assert!(bitfield.is_empty());
assert!(bitfield.get_all().is_empty()); assert!(bitfield.get_all().is_empty());