Auto merge of #45152 - Binero:master, r=dtolnay
Addressed issues raised in #44286. (`OccupiedEntry::replace_entry`) This commit renames the `replace` function to `replace_entry`, and creates a seperate `replace_key` function for `OccupiedEntry`. The original `replace` function did not solve the use-case where the key needed to be replaced, but not the value. Documentation and naming has also been updated to better reflect what the original replace function does.
This commit is contained in:
commit
45caff88d1
@ -2239,28 +2239,29 @@ impl<'a, K, V> OccupiedEntry<'a, K, V> {
|
||||
self.key.take()
|
||||
}
|
||||
|
||||
/// Replaces the entry, returning the old key and value.
|
||||
/// Replaces the entry, returning the old key and value. The new key in the hash map will be
|
||||
/// the key used to create this entry.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(map_entry_replace)]
|
||||
/// use std::collections::HashMap;
|
||||
/// use std::collections::hash_map::Entry;
|
||||
/// use std::collections::hash_map::{Entry, HashMap};
|
||||
/// use std::rc::Rc;
|
||||
///
|
||||
/// let mut map: HashMap<String, u32> = HashMap::new();
|
||||
/// map.insert("poneyland".to_string(), 15);
|
||||
/// let mut map: HashMap<Rc<String>, u32> = HashMap::new();
|
||||
/// map.insert(Rc::new("Stringthing".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);
|
||||
/// let my_key = Rc::new("Stringthing".to_string());
|
||||
///
|
||||
/// if let Entry::Occupied(entry) = map.entry(my_key) {
|
||||
/// // Also replace the key with a handle to our other key.
|
||||
/// let (old_key, old_value): (Rc<String>, u32) = entry.replace_entry(16);
|
||||
/// }
|
||||
///
|
||||
/// assert_eq!(map.get("poneyland"), Some(&16));
|
||||
/// ```
|
||||
#[unstable(feature = "map_entry_replace", issue = "44286")]
|
||||
pub fn replace(mut self, value: V) -> (K, V) {
|
||||
pub fn replace_entry(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());
|
||||
@ -2268,6 +2269,37 @@ impl<'a, K, V> OccupiedEntry<'a, K, V> {
|
||||
|
||||
(old_key, old_value)
|
||||
}
|
||||
|
||||
/// Replaces the key in the hash map with the key used to create this entry.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(map_entry_replace)]
|
||||
/// use std::collections::hash_map::{Entry, HashMap};
|
||||
/// use std::rc::Rc;
|
||||
///
|
||||
/// let mut map: HashMap<Rc<String>, u32> = HashMap::new();
|
||||
/// let mut known_strings: Vec<Rc<String>> = Vec::new();
|
||||
///
|
||||
/// // Initialise known strings, run program, etc.
|
||||
///
|
||||
/// reclaim_memory(&mut map, &known_strings);
|
||||
///
|
||||
/// fn reclaim_memory(map: &mut HashMap<Rc<String>, u32>, known_strings: &[Rc<String>] ) {
|
||||
/// for s in known_strings {
|
||||
/// if let Entry::Occupied(entry) = map.entry(s.clone()) {
|
||||
/// // Replaces the entry's key with our version of it in `known_strings`.
|
||||
/// entry.replace_key();
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
#[unstable(feature = "map_entry_replace", issue = "44286")]
|
||||
pub fn replace_key(mut self) -> K {
|
||||
let (old_key, _) = self.elem.read_mut();
|
||||
mem::replace(old_key, self.key.unwrap())
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, K: 'a, V: 'a> VacantEntry<'a, K, V> {
|
||||
|
Loading…
Reference in New Issue
Block a user