about summary refs log tree commit diff
path: root/src/liballoc/collections
diff options
context:
space:
mode:
authorDylan DPC <dylan.dpc@gmail.com>2020-02-09 00:53:52 +0100
committerGitHub <noreply@github.com>2020-02-09 00:53:52 +0100
commitcb87c958ef147f144d4b973e04e26a6bf9ddde9d (patch)
tree4d1d53e5a31385b1f079e090a2ba4a5cc50d24cf /src/liballoc/collections
parentd17bc9f0615b08cb708178a1eec93896457b9d42 (diff)
parentfa9bfebfc9256369c03cbe8bba2e737de3cb38fc (diff)
downloadrust-cb87c958ef147f144d4b973e04e26a6bf9ddde9d.tar.gz
rust-cb87c958ef147f144d4b973e04e26a6bf9ddde9d.zip
Rollup merge of #68834 - ssomers:btree_first_last_fix68829, r=KodrAus
Fix and test implementation of BTreeMap's first/last_entry, pop_first/last

Properly implement and test `first_entry` & `last_entry` to fix problem report #68829
Diffstat (limited to 'src/liballoc/collections')
-rw-r--r--src/liballoc/collections/btree/map.rs24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/liballoc/collections/btree/map.rs b/src/liballoc/collections/btree/map.rs
index 0b3f603686d..5b4b1c93347 100644
--- a/src/liballoc/collections/btree/map.rs
+++ b/src/liballoc/collections/btree/map.rs
@@ -675,13 +675,15 @@ impl<K: Ord, V> BTreeMap<K, V> {
         T: Ord,
         K: Borrow<T>,
     {
-        match self.length {
-            0 => None,
-            _ => Some(OccupiedEntry {
-                handle: self.root.as_mut().first_kv(),
+        let front = self.root.as_mut().first_leaf_edge();
+        if let Ok(kv) = front.right_kv() {
+            Some(OccupiedEntry {
+                handle: kv.forget_node_type(),
                 length: &mut self.length,
                 _marker: PhantomData,
-            }),
+            })
+        } else {
+            None
         }
     }
 
@@ -736,13 +738,15 @@ impl<K: Ord, V> BTreeMap<K, V> {
         T: Ord,
         K: Borrow<T>,
     {
-        match self.length {
-            0 => None,
-            _ => Some(OccupiedEntry {
-                handle: self.root.as_mut().last_kv(),
+        let back = self.root.as_mut().last_leaf_edge();
+        if let Ok(kv) = back.left_kv() {
+            Some(OccupiedEntry {
+                handle: kv.forget_node_type(),
                 length: &mut self.length,
                 _marker: PhantomData,
-            }),
+            })
+        } else {
+            None
         }
     }