Auto merge of #44344 - jonhoo:entry_or_default, r=BurntSushi
Add or_default to Entry APIs As argued for in #44324, this PR adds a new `or_default` method to the various `Entry` APIs (currently just for `BTreeMap` and `HashMap`) when `V: Default`. This method is effectively a shorthand for `or_insert_with(Default::default)`.
This commit is contained in:
commit
817e1b81e2
@ -0,0 +1,13 @@
|
||||
# `entry_or_default`
|
||||
|
||||
The tracking issue for this feature is: [#44324]
|
||||
|
||||
[#44324]: https://github.com/rust-lang/rust/issues/44324
|
||||
|
||||
------------------------
|
||||
|
||||
The `entry_or_default` feature adds a new method to `hash_map::Entry`
|
||||
and `btree_map::Entry`, `or_default`, when `V: Default`. This method is
|
||||
semantically identical to `or_insert_with(Default::default)`, and will
|
||||
insert the default value for the type if no entry exists for the current
|
||||
key.
|
@ -2104,6 +2104,33 @@ impl<'a, K: Ord, V> Entry<'a, K, V> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, K: Ord, V: Default> Entry<'a, K, V> {
|
||||
#[unstable(feature = "entry_or_default", issue = "44324")]
|
||||
/// Ensures a value is in the entry by inserting the default value if empty,
|
||||
/// and returns a mutable reference to the value in the entry.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(entry_or_default)]
|
||||
/// # fn main() {
|
||||
/// use std::collections::BTreeMap;
|
||||
///
|
||||
/// let mut map: BTreeMap<&str, Option<usize>> = BTreeMap::new();
|
||||
/// map.entry("poneyland").or_default();
|
||||
///
|
||||
/// assert_eq!(map["poneyland"], None);
|
||||
/// # }
|
||||
/// ```
|
||||
pub fn or_default(self) -> &'a mut V {
|
||||
match self {
|
||||
Occupied(entry) => entry.into_mut(),
|
||||
Vacant(entry) => entry.insert(Default::default()),
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
impl<'a, K: Ord, V> VacantEntry<'a, K, V> {
|
||||
/// Gets a reference to the key that would be used when inserting a value
|
||||
/// through the VacantEntry.
|
||||
|
@ -2001,6 +2001,33 @@ impl<'a, K, V> Entry<'a, K, V> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, K, V: Default> Entry<'a, K, V> {
|
||||
#[unstable(feature = "entry_or_default", issue = "44324")]
|
||||
/// Ensures a value is in the entry by inserting the default value if empty,
|
||||
/// and returns a mutable reference to the value in the entry.
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(entry_or_default)]
|
||||
/// # fn main() {
|
||||
/// use std::collections::HashMap;
|
||||
///
|
||||
/// let mut map: HashMap<&str, Option<u32>> = HashMap::new();
|
||||
/// map.entry("poneyland").or_default();
|
||||
///
|
||||
/// assert_eq!(map["poneyland"], None);
|
||||
/// # }
|
||||
/// ```
|
||||
pub fn or_default(self) -> &'a mut V {
|
||||
match self {
|
||||
Occupied(entry) => entry.into_mut(),
|
||||
Vacant(entry) => entry.insert(Default::default()),
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
impl<'a, K, V> OccupiedEntry<'a, K, V> {
|
||||
/// Gets a reference to the key in the entry.
|
||||
///
|
||||
|
Loading…
x
Reference in New Issue
Block a user