From 00c6a93a560d99c8405453b37fb814603a1e8187 Mon Sep 17 00:00:00 2001 From: joaquintides Date: Mon, 10 Apr 2023 11:03:11 +0200 Subject: [PATCH] restored invocability static asserts --- .../boost/unordered/concurrent_flat_map.hpp | 48 ++++++++++++++----- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/include/boost/unordered/concurrent_flat_map.hpp b/include/boost/unordered/concurrent_flat_map.hpp index 043c34f3..10bfbba5 100644 --- a/include/boost/unordered/concurrent_flat_map.hpp +++ b/include/boost/unordered/concurrent_flat_map.hpp @@ -18,26 +18,48 @@ #include #include -#include #include #include +#include +#include #include #include +#include #include #define BOOST_UNORDERED_STATIC_ASSERT_INVOCABLE(F) \ - static_assert(boost::callable_traits::is_invocable::value, \ + static_assert(boost::unordered::detail::is_invocable::value, \ "The provided Callable must be invocable with `value_type&`"); #define BOOST_UNORDERED_STATIC_ASSERT_CONST_INVOCABLE(F) \ static_assert( \ - boost::callable_traits::is_invocable::value, \ + boost::unordered::detail::is_invocable::value, \ "The provided Callable must be invocable with `value_type const&`"); +#define BOOST_UNORDERED_COMMA , + +#define BOOST_UNORDERED_LAST_ARG(Arg, Args) \ +mp11::mp_back> + +#define BOOST_UNORDERED_STATIC_ASSERT_LAST_ARG_INVOCABLE(Arg, Args) \ +BOOST_UNORDERED_STATIC_ASSERT_INVOCABLE(BOOST_UNORDERED_LAST_ARG(Arg, Args)) + +#define BOOST_UNORDERED_STATIC_ASSERT_LAST_ARG_CONST_INVOCABLE(Arg, Args) \ +BOOST_UNORDERED_STATIC_ASSERT_CONST_INVOCABLE( \ + BOOST_UNORDERED_LAST_ARG(Arg, Args)) + namespace boost { namespace unordered { namespace detail { + template + struct is_invocable: + std::is_constructible< + std::function, + std::reference_wrapper::type> + > + {}; + template struct concurrent_map_types { using key_type = Key; @@ -364,7 +386,7 @@ namespace boost { template bool emplace_or_visit(Arg&& arg, Args&&... args) { - //BOOST_UNORDERED_STATIC_ASSERT_INVOCABLE(F) + BOOST_UNORDERED_STATIC_ASSERT_LAST_ARG_INVOCABLE(Arg, Args...) return table_.emplace_or_visit( std::forward(arg), std::forward(args)...); } @@ -372,7 +394,7 @@ namespace boost { template bool emplace_or_cvisit(Arg&& arg, Args&&... args) { - //BOOST_UNORDERED_STATIC_ASSERT_CONST_INVOCABLE(F) + BOOST_UNORDERED_STATIC_ASSERT_LAST_ARG_CONST_INVOCABLE(Arg, Args...) return table_.emplace_or_cvisit( std::forward(arg), std::forward(args)...); } @@ -400,7 +422,7 @@ namespace boost { template bool try_emplace_or_visit(key_type const& k, Arg&& arg, Args&&... args) { - //BOOST_UNORDERED_STATIC_ASSERT_INVOCABLE(F) + BOOST_UNORDERED_STATIC_ASSERT_LAST_ARG_INVOCABLE(Arg, Args...) return table_.try_emplace_or_visit( k, std::forward(arg), std::forward(args)...); } @@ -408,7 +430,7 @@ namespace boost { template bool try_emplace_or_cvisit(key_type const& k, Arg&& arg, Args&&... args) { - //BOOST_UNORDERED_STATIC_ASSERT_CONST_INVOCABLE(F) + BOOST_UNORDERED_STATIC_ASSERT_LAST_ARG_CONST_INVOCABLE(Arg, Args...) return table_.try_emplace_or_cvisit( k, std::forward(arg), std::forward(args)...); } @@ -416,7 +438,7 @@ namespace boost { template bool try_emplace_or_visit(key_type&& k, Arg&& arg, Args&&... args) { - //BOOST_UNORDERED_STATIC_ASSERT_INVOCABLE(F) + BOOST_UNORDERED_STATIC_ASSERT_LAST_ARG_INVOCABLE(Arg, Args...) return table_.try_emplace_or_visit( std::move(k), std::forward(arg), std::forward(args)...); } @@ -424,7 +446,7 @@ namespace boost { template bool try_emplace_or_cvisit(key_type&& k, Arg&& arg, Args&&... args) { - //BOOST_UNORDERED_STATIC_ASSERT_CONST_INVOCABLE(F) + BOOST_UNORDERED_STATIC_ASSERT_LAST_ARG_CONST_INVOCABLE(Arg, Args...) return table_.try_emplace_or_cvisit( std::move(k), std::forward(arg), std::forward(args)...); } @@ -432,7 +454,7 @@ namespace boost { template bool try_emplace_or_visit(K&& k, Arg&& arg, Args&&... args) { - //BOOST_UNORDERED_STATIC_ASSERT_INVOCABLE(F) + BOOST_UNORDERED_STATIC_ASSERT_LAST_ARG_INVOCABLE(Arg, Args...) return table_.try_emplace_or_visit( std::forward(k), std::forward(arg), std::forward(args)...); } @@ -440,7 +462,7 @@ namespace boost { template bool try_emplace_or_cvisit(K&& k, Arg&& arg, Args&&... args) { - //BOOST_UNORDERED_STATIC_ASSERT_CONST_INVOCABLE(F) + BOOST_UNORDERED_STATIC_ASSERT_LAST_ARG_CONST_INVOCABLE(Arg, Args...) return table_.try_emplace_or_cvisit( std::forward(k), std::forward(arg), std::forward(args)...); } @@ -492,5 +514,9 @@ namespace boost { #undef BOOST_UNORDERED_STATIC_ASSERT_INVOCABLE #undef BOOST_UNORDERED_STATIC_ASSERT_CONST_INVOCABLE +#undef BOOST_UNORDERED_COMMA +#undef BOOST_UNORDERED_LAST_ARG +#undef BOOST_UNORDERED_STATIC_ASSERT_LAST_ARG_INVOCABLE +#undef BOOST_UNORDERED_STATIC_ASSERT_LAST_ARG_CONST_INVOCABLE #endif // BOOST_UNORDERED_CONCURRENT_FLAT_MAP_HPP