Skip to content

Commit

Permalink
Auto merge of #44278 - Binero:master, r=BurntSushi
Browse files Browse the repository at this point in the history
Allow replacing HashMap entries

This is an obvious API hole. At the moment the only way to retrieve an entry from a `HashMap` is to get an entry to it, remove it, and then insert a new entry. This PR allows entries to be replaced.
  • Loading branch information
bors committed Sep 28, 2017
2 parents 688a858 + d3de465 commit 3c96d40
Showing 1 changed file with 30 additions and 0 deletions.
30 changes: 30 additions & 0 deletions src/libstd/collections/hash/map.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2191,6 +2191,36 @@ impl<'a, K, V> OccupiedEntry<'a, K, V> {
fn take_key(&mut self) -> Option<K> {
self.key.take()
}

/// Replaces the entry, returning the old key and value.
///
/// # Examples
///
/// ```
/// #![feature(map_entry_replace)]
/// use std::collections::HashMap;
/// use std::collections::hash_map::Entry;
///
/// let mut map: HashMap<String, u32> = HashMap::new();
/// map.insert("poneyland".to_string(), 15);
///
/// if let Entry::Occupied(entry) = map.entry("poneyland".to_string()) {
/// let (old_key, old_value): (String, u32) = entry.replace(16);
/// assert_eq!(old_key, "poneyland");
/// assert_eq!(old_value, 15);
/// }
///
/// assert_eq!(map.get("poneyland"), Some(&16));
/// ```
#[unstable(feature = "map_entry_replace", issue = "44286")]
pub fn replace(mut self, value: V) -> (K, V) {
let (old_key, old_value) = self.elem.read_mut();

let old_key = mem::replace(old_key, self.key.unwrap());
let old_value = mem::replace(old_value, value);

(old_key, old_value)
}
}

impl<'a, K: 'a, V: 'a> VacantEntry<'a, K, V> {
Expand Down

0 comments on commit 3c96d40

Please sign in to comment.