From ba799baf85d5686d51c734e5c4fa4341425960b5 Mon Sep 17 00:00:00 2001 From: Filipe Rodrigues Date: Mon, 19 Apr 2021 23:06:40 +0100 Subject: [PATCH] Removed usages of removed `Option::expect_none` api. Added more sanity checks to `btree_set_modify`. --- dcb-exe/src/data/table/node.rs | 17 ++++++++++++++--- dcb-exe/src/lib.rs | 1 - 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/dcb-exe/src/data/table/node.rs b/dcb-exe/src/data/table/node.rs index b98e023..deb5449 100644 --- a/dcb-exe/src/data/table/node.rs +++ b/dcb-exe/src/data/table/node.rs @@ -224,10 +224,21 @@ fn range_intersect(lhs: Range, rhs: Range) -> bool { /// Removes, modifies and re-inserts a value back into a set /// -/// Panics if `element` doesn't exist. -fn btree_set_modify + std::fmt::Debug, Q: Ord, U>(set: &mut BTreeSet, element: &Q, f: impl FnOnce(&mut T) -> U) -> U { +/// It is a logical error to modify an element's order. +/// This function *might* panic if the order is changed +fn btree_set_modify, Q: Ord, U>(set: &mut BTreeSet, element: &Q, f: impl FnOnce(&mut T) -> U) -> U { + // Take the element from the set let mut node = set.take(element).expect("Element didn't exist"); + + // Run the function on it and then reinsert it. let res = f(&mut node); - set.replace(node).expect_none("Just removed it"); + + // Then re-insert it + match set.replace(node) { + Some(_) => panic!("Order of element changed during mutation"), + // Sanity check to make sure the element hasn't changed order + None => assert!(set.contains(element), "Order of element changed during mutation"), + } + res } diff --git a/dcb-exe/src/lib.rs b/dcb-exe/src/lib.rs index 5021b8f..ec2da1e 100644 --- a/dcb-exe/src/lib.rs +++ b/dcb-exe/src/lib.rs @@ -17,7 +17,6 @@ array_chunks, ordering_helpers, const_btree_new, - option_expect_none, )] // Lints #![warn(clippy::restriction, clippy::pedantic, clippy::nursery)]