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:
parent
74c4821045
commit
00cb59b53b
@ -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()
|
||||
}
|
||||
|
@ -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, _)));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user