From 1a600eb768779cd3e2e46a3f40ff4795557c050e Mon Sep 17 00:00:00 2001 From: Stein Somers Date: Mon, 3 Aug 2020 15:28:56 +0200 Subject: [PATCH] Easy way to respect BTreeMap's minimum node length --- library/alloc/src/collections/btree/node.rs | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/library/alloc/src/collections/btree/node.rs b/library/alloc/src/collections/btree/node.rs index 6a4c495ea1464..375c8ea8ee7ab 100644 --- a/library/alloc/src/collections/btree/node.rs +++ b/library/alloc/src/collections/btree/node.rs @@ -861,17 +861,14 @@ impl<'a, K, V> Handle, K, V, marker::Leaf>, marker::Edge let kv = unsafe { Handle::new_kv(self.node, self.idx) }; (InsertResult::Fit(kv), ptr) } else { - let middle = unsafe { Handle::new_kv(self.node, B) }; + let middle = unsafe { Handle::new_kv(self.node, B - 1) }; let (mut left, k, v, mut right) = middle.split(); - let ptr = if self.idx <= B { + let ptr = if self.idx < B { unsafe { Handle::new_edge(left.reborrow_mut(), self.idx).insert_fit(key, val) } } else { unsafe { - Handle::new_edge( - right.as_mut().cast_unchecked::(), - self.idx - (B + 1), - ) - .insert_fit(key, val) + Handle::new_edge(right.as_mut().cast_unchecked::(), self.idx - B) + .insert_fit(key, val) } }; (InsertResult::Split(SplitResult { left: left.forget_type(), k, v, right }), ptr) @@ -934,9 +931,9 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: let kv = unsafe { Handle::new_kv(self.node, self.idx) }; InsertResult::Fit(kv) } else { - let middle = unsafe { Handle::new_kv(self.node, B) }; + let middle = unsafe { Handle::new_kv(self.node, B - 1) }; let (mut left, k, v, mut right) = middle.split(); - if self.idx <= B { + if self.idx < B { unsafe { Handle::new_edge(left.reborrow_mut(), self.idx).insert_fit(key, val, edge); } @@ -944,7 +941,7 @@ impl<'a, K, V> Handle, K, V, marker::Internal>, marker:: unsafe { Handle::new_edge( right.as_mut().cast_unchecked::(), - self.idx - (B + 1), + self.idx - B, ) .insert_fit(key, val, edge); }