about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJon Gjengset <jon@thesquareplanet.com>2017-09-05 12:34:05 -0400
committerJon Gjengset <jon@thesquareplanet.com>2017-09-05 13:11:38 -0400
commit35c7943fd2d2a65b63712d95d62c8837633218b4 (patch)
treee6071ea3dc7c8d821093ae7999b2c08417e9e1b3 /src
parent2f1ef9ef1181298d46e79d5dde6bafeb6483926f (diff)
downloadrust-35c7943fd2d2a65b63712d95d62c8837633218b4.tar.gz
rust-35c7943fd2d2a65b63712d95d62c8837633218b4.zip
Add or_default to Entry APIs
Diffstat (limited to 'src')
-rw-r--r--src/doc/unstable-book/src/library-features/entry_or_default.md13
-rw-r--r--src/liballoc/btree/map.rs29
-rw-r--r--src/libstd/collections/hash/map.rs29
3 files changed, 71 insertions, 0 deletions
diff --git a/src/doc/unstable-book/src/library-features/entry_or_default.md b/src/doc/unstable-book/src/library-features/entry_or_default.md
new file mode 100644
index 00000000000..f8c8a2a7a71
--- /dev/null
+++ b/src/doc/unstable-book/src/library-features/entry_or_default.md
@@ -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.
diff --git a/src/liballoc/btree/map.rs b/src/liballoc/btree/map.rs
index f733c3332e2..0adfaf3be8f 100644
--- a/src/liballoc/btree/map.rs
+++ b/src/liballoc/btree/map.rs
@@ -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.
diff --git a/src/libstd/collections/hash/map.rs b/src/libstd/collections/hash/map.rs
index 16b0c709986..36399067a12 100644
--- a/src/libstd/collections/hash/map.rs
+++ b/src/libstd/collections/hash/map.rs
@@ -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.
     ///