btree_map: Cursor{,Mut}::peek_prev must agree

Our `Cursor::peek_prev` and `CursorMut::peek_prev` must agree
on how to behave when they are called on the "null element".
This commit is contained in:
Jubilee Young 2023-05-04 23:45:48 -07:00
parent 74c4821045
commit 00cb59b53b
2 changed files with 21 additions and 2 deletions

View File

@ -3079,8 +3079,8 @@ pub fn peek_prev(&mut self) -> Option<(&K, &mut V)> {
unsafe { self.root.reborrow() }
.as_mut()?
.borrow_mut()
.first_leaf_edge()
.next_kv()
.last_leaf_edge()
.next_back_kv()
.ok()?
.into_kv_valmut()
}

View File

@ -8,6 +8,7 @@
use crate::testing::ord_chaos::{Cyclic3, Governed, Governor};
use crate::testing::rng::DeterministicRng;
use crate::vec::Vec;
use core::assert_matches::assert_matches;
use std::cmp::Ordering;
use std::iter;
use std::mem;
@ -2448,3 +2449,21 @@ fn test_cursor_mut_insert_after_4() {
let mut cur = map.upper_bound_mut(Bound::Included(&2));
cur.insert_after(4, 'd');
}
#[test]
fn cursor_peek_prev_agrees_with_cursor_mut() {
let mut map = BTreeMap::from([(1, 1), (2, 2), (3, 3)]);
let cursor = map.lower_bound(Bound::Excluded(&3));
assert!(cursor.key().is_none());
let prev = cursor.peek_prev();
assert_matches!(prev, Some((&3, _)));
// Shadow names so the two parts of this test match.
let mut cursor = map.lower_bound_mut(Bound::Excluded(&3));
assert!(cursor.key().is_none());
let prev = cursor.peek_prev();
assert_matches!(prev, Some((&3, _)));
}