Add or_default to Entry APIs

This commit is contained in:
Jon Gjengset 2017-09-05 12:34:05 -04:00
parent 2f1ef9ef11
commit 35c7943fd2
No known key found for this signature in database
GPG key ID: D64AC9D67176DC71
3 changed files with 71 additions and 0 deletions

View file

@ -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.

View file

@ -2104,6 +2104,35 @@ 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, String> = BTreeMap::new();
/// let s = "hoho".to_string();
///
/// 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.

View file

@ -2001,6 +2001,35 @@ 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<usize>> = HashMap::new();
/// let s = "hoho".to_string();
///
/// 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.
///