From 0a879c10632248363232bc5cc1c71104ae274da0 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Tue, 15 Nov 2022 09:53:18 -0800 Subject: [PATCH] Implement transparent insert_or_assign() --- .../boost/unordered/unordered_flat_map.hpp | 26 +++++++++++++++++-- include/boost/unordered/unordered_map.hpp | 22 ++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/include/boost/unordered/unordered_flat_map.hpp b/include/boost/unordered/unordered_flat_map.hpp index 4c9a845b..16312a9e 100644 --- a/include/boost/unordered/unordered_flat_map.hpp +++ b/include/boost/unordered/unordered_flat_map.hpp @@ -289,14 +289,26 @@ namespace boost { template std::pair insert_or_assign(key_type&& key, M&& obj) { - auto ibp = - table_.try_emplace(std::move(key), std::forward(obj)); + auto ibp = table_.try_emplace(std::move(key), std::forward(obj)); if (ibp.second) { return ibp; } ibp.first->second = std::forward(obj); return ibp; } + + template + typename std::enable_if< + boost::unordered::detail::are_transparent::value, + std::pair >::type + insert_or_assign(K&& k, M&& obj) + { + auto ibp = table_.try_emplace(std::forward(k), std::forward(obj)); + if (ibp.second) { + return ibp; + } + ibp.first->second = std::forward(obj); + return ibp; } template @@ -312,6 +324,16 @@ namespace boost { .first; } + template + typename std::enable_if< + boost::unordered::detail::are_transparent::value, + iterator>::type + insert_or_assign(const_iterator, K&& k, M&& obj) + { + return this->insert_or_assign(std::forward(k), std::forward(obj)) + .first; + } + template BOOST_FORCEINLINE std::pair emplace(Args&&... args) { diff --git a/include/boost/unordered/unordered_map.hpp b/include/boost/unordered/unordered_map.hpp index 3e07ed5e..6d81a3f8 100644 --- a/include/boost/unordered/unordered_map.hpp +++ b/include/boost/unordered/unordered_map.hpp @@ -801,6 +801,16 @@ namespace boost { boost::move(k), boost::forward(obj)); } + template + typename boost::enable_if_c< + detail::are_transparent::value, + std::pair >::type + insert_or_assign(BOOST_FWD_REF(Key) k, BOOST_FWD_REF(M) obj) + { + return table_.insert_or_assign_unique( + boost::forward(k), boost::forward(obj)); + } + template iterator insert_or_assign( const_iterator, key_type const& k, BOOST_FWD_REF(M) obj) @@ -817,6 +827,18 @@ namespace boost { .first; } + template + typename boost::enable_if_c< + detail::are_transparent::value, iterator>::type + insert_or_assign( + const_iterator, BOOST_FWD_REF(Key) k, BOOST_FWD_REF(M) obj) + { + return table_ + .insert_or_assign_unique( + boost::forward(k), boost::forward(obj)) + .first; + } + iterator erase(iterator); iterator erase(const_iterator); size_type erase(const key_type&);