Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(379)

Unified Diff: util/stdlib/map_insert.h

Issue 1044273002: Improve map insertions (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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_

Powered by Google App Engine
This is Rietveld 408576698