Skip to content

Commit 4f6661a

Browse files
committed
Fix and test implementation of BTreeMap's first_entry, last_entry, pop_first, pop_last
1 parent b685985 commit 4f6661a

File tree

3 files changed

+35
-21
lines changed

3 files changed

+35
-21
lines changed

src/liballoc/collections/btree/map.rs

+14-10
Original file line numberDiff line numberDiff line change
@@ -675,13 +675,15 @@ impl<K: Ord, V> BTreeMap<K, V> {
675675
T: Ord,
676676
K: Borrow<T>,
677677
{
678-
match self.length {
679-
0 => None,
680-
_ => Some(OccupiedEntry {
681-
handle: self.root.as_mut().first_kv(),
678+
let front = self.root.as_mut().first_leaf_edge();
679+
if let Ok(kv) = front.right_kv() {
680+
Some(OccupiedEntry {
681+
handle: kv.forget_node_type(),
682682
length: &mut self.length,
683683
_marker: PhantomData,
684-
}),
684+
})
685+
} else {
686+
None
685687
}
686688
}
687689

@@ -736,13 +738,15 @@ impl<K: Ord, V> BTreeMap<K, V> {
736738
T: Ord,
737739
K: Borrow<T>,
738740
{
739-
match self.length {
740-
0 => None,
741-
_ => Some(OccupiedEntry {
742-
handle: self.root.as_mut().last_kv(),
741+
let back = self.root.as_mut().last_leaf_edge();
742+
if let Ok(kv) = back.left_kv() {
743+
Some(OccupiedEntry {
744+
handle: kv.forget_node_type(),
743745
length: &mut self.length,
744746
_marker: PhantomData,
745-
}),
747+
})
748+
} else {
749+
None
746750
}
747751
}
748752

src/liballoc/tests/btree/map.rs

+5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ fn test_basic_large() {
2323
assert_eq!(map.len(), i + 1);
2424
}
2525

26+
assert_eq!(map.first_key_value(), Some((&0, &0)));
27+
assert_eq!(map.last_key_value(), Some((&(size - 1), &(10 * (size - 1)))));
28+
assert_eq!(map.first_entry().unwrap().key(), &0);
29+
assert_eq!(map.last_entry().unwrap().key(), &(size - 1));
30+
2631
for i in 0..size {
2732
assert_eq!(map.get(&i).unwrap(), &(i * 10));
2833
}

src/liballoc/tests/btree/set.rs

+16-11
Original file line numberDiff line numberDiff line change
@@ -487,21 +487,26 @@ fn test_first_last() {
487487
a.insert(2);
488488
assert_eq!(a.first(), Some(&1));
489489
assert_eq!(a.last(), Some(&2));
490-
a.insert(3);
490+
for i in 3..=12 {
491+
a.insert(i);
492+
}
491493
assert_eq!(a.first(), Some(&1));
492-
assert_eq!(a.last(), Some(&3));
493-
494-
assert_eq!(a.len(), 3);
494+
assert_eq!(a.last(), Some(&12));
495495
assert_eq!(a.pop_first(), Some(1));
496-
assert_eq!(a.len(), 2);
497-
assert_eq!(a.pop_last(), Some(3));
498-
assert_eq!(a.len(), 1);
496+
assert_eq!(a.pop_last(), Some(12));
499497
assert_eq!(a.pop_first(), Some(2));
500-
assert_eq!(a.len(), 0);
501-
assert_eq!(a.pop_last(), None);
502-
assert_eq!(a.len(), 0);
498+
assert_eq!(a.pop_last(), Some(11));
499+
assert_eq!(a.pop_first(), Some(3));
500+
assert_eq!(a.pop_last(), Some(10));
501+
assert_eq!(a.pop_first(), Some(4));
502+
assert_eq!(a.pop_first(), Some(5));
503+
assert_eq!(a.pop_first(), Some(6));
504+
assert_eq!(a.pop_first(), Some(7));
505+
assert_eq!(a.pop_first(), Some(8));
506+
assert_eq!(a.clone().pop_last(), Some(9));
507+
assert_eq!(a.pop_first(), Some(9));
503508
assert_eq!(a.pop_first(), None);
504-
assert_eq!(a.len(), 0);
509+
assert_eq!(a.pop_last(), None);
505510
}
506511

507512
fn rand_data(len: usize) -> Vec<u32> {

0 commit comments

Comments
 (0)