Rollup merge of #68378 - billyrieger:btreemap-remove-entry, r=KodrAus

Add BTreeMap::remove_entry

Implements https://github.com/rust-lang/rust/issues/66714.
This commit is contained in:
Yuki Okushi 2020-01-29 09:34:45 +09:00 committed by GitHub
commit af0c280be6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -806,13 +806,42 @@ impl<K: Ord, V> BTreeMap<K, V> {
/// ```
#[stable(feature = "rust1", since = "1.0.0")]
pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V>
where
K: Borrow<Q>,
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<Q: ?Sized>(&mut self, key: &Q) -> Option<(K, V)>
where
K: Borrow<Q>,
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,
}