From 5654305a7ba419e4a7c0334fc77d0ef41a1ca2ac Mon Sep 17 00:00:00 2001 From: Billy Rieger Date: Sun, 19 Jan 2020 21:44:46 -0500 Subject: [PATCH] Add BTreeMap::remove_entry Mainly for API parity with HashMap. - Add BTreeMap::remove_entry - Rewrite BTreeMap::remove to use remove_entry - Use btreemap_remove_entry feature in doc comment --- src/liballoc/collections/btree/map.rs | 31 ++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/src/liballoc/collections/btree/map.rs b/src/liballoc/collections/btree/map.rs index 302c2bcd5e4a3..551a406f8d237 100644 --- a/src/liballoc/collections/btree/map.rs +++ b/src/liballoc/collections/btree/map.rs @@ -806,13 +806,42 @@ impl BTreeMap { /// ``` #[stable(feature = "rust1", since = "1.0.0")] pub fn remove(&mut self, key: &Q) -> Option + where + K: Borrow, + Q: Ord, + { + self.remove_entry(key).map(|(_, v)| v) + } + + /// Removes a key from the map, returning the stored key and value if the key + /// was previously in the map. + /// + /// The key may be any borrowed form of the map's key type, but the ordering + /// on the borrowed form *must* match the ordering on the key type. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// #![feature(btreemap_remove_entry)] + /// use std::collections::BTreeMap; + /// + /// let mut map = BTreeMap::new(); + /// map.insert(1, "a"); + /// assert_eq!(map.remove_entry(&1), Some((1, "a"))); + /// assert_eq!(map.remove_entry(&1), None); + /// ``` + #[unstable(feature = "btreemap_remove_entry", issue = "66714")] + pub fn remove_entry(&mut self, key: &Q) -> Option<(K, V)> where K: Borrow, Q: Ord, { match search::search_tree(self.root.as_mut(), key) { Found(handle) => Some( - OccupiedEntry { handle, length: &mut self.length, _marker: PhantomData }.remove(), + OccupiedEntry { handle, length: &mut self.length, _marker: PhantomData } + .remove_entry(), ), GoDown(_) => None, }