From 44c50cd2eaa1f85caab0737323020053b1412ee3 Mon Sep 17 00:00:00 2001 From: Christian Mazakas Date: Thu, 1 Jun 2023 14:19:14 -0700 Subject: [PATCH] Resolve potential ambiguities during insertion by introducing a member function template --- .../boost/unordered/concurrent_flat_map.hpp | 57 ++++--------------- test/cfoa/insert_tests.cpp | 12 ++++ 2 files changed, 24 insertions(+), 45 deletions(-) diff --git a/include/boost/unordered/concurrent_flat_map.hpp b/include/boost/unordered/concurrent_flat_map.hpp index d3a0c565..585b4a87 100644 --- a/include/boost/unordered/concurrent_flat_map.hpp +++ b/include/boost/unordered/concurrent_flat_map.hpp @@ -409,19 +409,13 @@ namespace boost { /// Modifiers /// - BOOST_FORCEINLINE bool insert(value_type const& obj) + template + BOOST_FORCEINLINE auto insert(Ty&& value) + -> decltype(table_.insert(std::forward(value))) { - return table_.insert(obj); - } - BOOST_FORCEINLINE bool insert(value_type&& obj) - { - return table_.insert(std::move(obj)); + return table_.insert(std::forward(value)); } - BOOST_FORCEINLINE bool insert(init_type const& obj) - { - return table_.insert(obj); - } BOOST_FORCEINLINE bool insert(init_type&& obj) { return table_.insert(std::move(obj)); @@ -464,25 +458,11 @@ namespace boost { [&](value_type& m) { m.second = std::forward(obj); }); } - template - BOOST_FORCEINLINE bool insert_or_visit(value_type const& obj, F f) + template + BOOST_FORCEINLINE auto insert_or_visit(Ty&& value, F f) + -> decltype(table_.insert_or_visit(std::forward(value), f)) { - BOOST_UNORDERED_STATIC_ASSERT_INVOCABLE(F) - return table_.insert_or_visit(obj, f); - } - - template - BOOST_FORCEINLINE bool insert_or_visit(value_type&& obj, F f) - { - BOOST_UNORDERED_STATIC_ASSERT_INVOCABLE(F) - return table_.insert_or_visit(std::move(obj), f); - } - - template - BOOST_FORCEINLINE bool insert_or_visit(init_type const& obj, F f) - { - BOOST_UNORDERED_STATIC_ASSERT_INVOCABLE(F) - return table_.insert_or_visit(obj, f); + return table_.insert_or_visit(std::forward(value), f); } template @@ -508,25 +488,12 @@ namespace boost { this->insert_or_visit(ilist.begin(), ilist.end(), f); } - template - BOOST_FORCEINLINE bool insert_or_cvisit(value_type const& obj, F f) + template + BOOST_FORCEINLINE auto insert_or_cvisit(Ty&& value, F f) + -> decltype(table_.insert_or_cvisit(std::forward(value), f)) { BOOST_UNORDERED_STATIC_ASSERT_CONST_INVOCABLE(F) - return table_.insert_or_cvisit(obj, f); - } - - template - BOOST_FORCEINLINE bool insert_or_cvisit(value_type&& obj, F f) - { - BOOST_UNORDERED_STATIC_ASSERT_CONST_INVOCABLE(F) - return table_.insert_or_cvisit(std::move(obj), f); - } - - template - BOOST_FORCEINLINE bool insert_or_cvisit(init_type const& obj, F f) - { - BOOST_UNORDERED_STATIC_ASSERT_CONST_INVOCABLE(F) - return table_.insert_or_cvisit(obj, f); + return table_.insert_or_cvisit(std::forward(value), f); } template diff --git a/test/cfoa/insert_tests.cpp b/test/cfoa/insert_tests.cpp index 8566d43d..6aaaf497 100644 --- a/test/cfoa/insert_tests.cpp +++ b/test/cfoa/insert_tests.cpp @@ -540,6 +540,18 @@ namespace { } } + UNORDERED_AUTO_TEST (insert_sfinae_test) { + // mostly a compile-time tests to ensure that there's no ambiguity when a + // user does this + using value_type = + typename boost::unordered::concurrent_flat_map::value_type; + boost::unordered::concurrent_flat_map x; + x.insert({1, 2}); + + x.insert_or_visit({2, 3}, [](value_type&) {}); + x.insert_or_cvisit({3, 4}, [](value_type const&) {}); + } + boost::unordered::concurrent_flat_map* map; boost::unordered::concurrent_flat_map* trans_map;