about summary refs log tree commit diff
path: root/compiler/rustc_data_structures/src
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_data_structures/src')
-rw-r--r--compiler/rustc_data_structures/src/vec_map.rs14
1 files changed, 14 insertions, 0 deletions
diff --git a/compiler/rustc_data_structures/src/vec_map.rs b/compiler/rustc_data_structures/src/vec_map.rs
index 86be0bd8775..f1493e5bdad 100644
--- a/compiler/rustc_data_structures/src/vec_map.rs
+++ b/compiler/rustc_data_structures/src/vec_map.rs
@@ -53,6 +53,20 @@ where
         self.0.iter_mut().find(|(key, _)| k == key.borrow()).map(|elem| &mut elem.1)
     }
 
+    /// Gets a mutable reference to the value in the entry, or insert a new one.
+    pub fn get_mut_or_insert_default(&mut self, k: K) -> &mut V
+    where
+        K: Eq,
+        V: Default,
+    {
+        let pos = self.0.iter().position(|(key, _)| &k == key).unwrap_or_else(|| {
+            let pos = self.0.len();
+            self.0.push((k, V::default()));
+            pos
+        });
+        &mut self.0[pos].1
+    }
+
     /// Returns the any value corresponding to the supplied predicate filter.
     ///
     /// The supplied predicate will be applied to each (key, value) pair and it will return a