Rollup merge of #120505 - Amanieu:fix-btreemap-cursor-remove, r=m-ou-se
Fix BTreeMap's Cursor::remove_{next,prev} These would incorrectly leave `current` as `None` after a failed attempt to remove an element (due to the cursor already being at the start/end).
This commit is contained in:
commit
472c820eb3
@ -3247,9 +3247,15 @@ pub fn insert_before(&mut self, key: K, value: V) -> Result<(), UnorderedKeyErro
|
||||
#[unstable(feature = "btree_cursors", issue = "107540")]
|
||||
pub fn remove_next(&mut self) -> Option<(K, V)> {
|
||||
let current = self.current.take()?;
|
||||
if current.reborrow().next_kv().is_err() {
|
||||
self.current = Some(current);
|
||||
return None;
|
||||
}
|
||||
let mut emptied_internal_root = false;
|
||||
let (kv, pos) = current
|
||||
.next_kv()
|
||||
// This should be unwrap(), but that doesn't work because NodeRef
|
||||
// doesn't implement Debug. The condition is checked above.
|
||||
.ok()?
|
||||
.remove_kv_tracking(|| emptied_internal_root = true, self.alloc.clone());
|
||||
self.current = Some(pos);
|
||||
@ -3270,9 +3276,15 @@ pub fn remove_next(&mut self) -> Option<(K, V)> {
|
||||
#[unstable(feature = "btree_cursors", issue = "107540")]
|
||||
pub fn remove_prev(&mut self) -> Option<(K, V)> {
|
||||
let current = self.current.take()?;
|
||||
if current.reborrow().next_back_kv().is_err() {
|
||||
self.current = Some(current);
|
||||
return None;
|
||||
}
|
||||
let mut emptied_internal_root = false;
|
||||
let (kv, pos) = current
|
||||
.next_back_kv()
|
||||
// This should be unwrap(), but that doesn't work because NodeRef
|
||||
// doesn't implement Debug. The condition is checked above.
|
||||
.ok()?
|
||||
.remove_kv_tracking(|| emptied_internal_root = true, self.alloc.clone());
|
||||
self.current = Some(pos);
|
||||
|
Loading…
Reference in New Issue
Block a user