Index: util/stdlib/map_insert.h |
diff --git a/util/stdlib/map_insert.h b/util/stdlib/map_insert.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..956271b32add5ae053f8f23a6d9704badf7061d9 |
--- /dev/null |
+++ b/util/stdlib/map_insert.h |
@@ -0,0 +1,56 @@ |
+// Copyright 2015 The Crashpad Authors. All rights reserved. |
+// |
+// Licensed under the Apache License, Version 2.0 (the "License"); |
+// you may not use this file except in compliance with the License. |
+// You may obtain a copy of the License at |
+// |
+// http://www.apache.org/licenses/LICENSE-2.0 |
+// |
+// Unless required by applicable law or agreed to in writing, software |
+// distributed under the License is distributed on an "AS IS" BASIS, |
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+// See the License for the specific language governing permissions and |
+// limitations under the License. |
+ |
+#ifndef CRASHPAD_UTIL_STDLIB_MAP_INSERT_H_ |
+#define CRASHPAD_UTIL_STDLIB_MAP_INSERT_H_ |
+ |
+#include <map> |
+#include <utility> |
+ |
+namespace crashpad { |
+ |
+//! \brief Inserts a mapping from \a key to \a value into \a map, or replaces |
+//! an existing mapping so that \a key maps to \value. |
+//! |
+//! This behaves similarly to `std::map<>::insert_or_assign()` proposed for |
+//! C++17, except that the \a old_value parameter is added. |
+//! |
+//! \param[inout] map The map to operate on. |
+//! \param[in] key The key that should be mapped to \a value. |
+//! \param[in] value The value that \a key should map to. |
+//! \param[out] old_value If \a key was previously present in \a map, this will |
+//! be set to its previous value. This parameter is optional and may be |
+//! `nullptr` if this information is not required. |
+//! |
+//! \return `false` if \a key was previously present in \a map. If \a old_value |
+//! is not `nullptr`, it will be set to the previous value. `true` if \a |
+//! key was not present in the map and was inserted. |
+template <typename T> |
+bool MapInsertOrReplace(T* map, |
+ const typename T::key_type& key, |
+ const typename T::mapped_type& value, |
+ typename T::mapped_type* old_value) { |
+ const auto result = map->insert(std::make_pair(key, value)); |
+ if (!result.second) { |
+ if (old_value) { |
+ *old_value = result.first->second; |
+ } |
+ result.first->second = value; |
+ } |
+ return result.second; |
+} |
+ |
+} // namespace crashpad |
+ |
+#endif // CRASHPAD_UTIL_STDLIB_MAP_INSERT_H_ |