diff options
Diffstat (limited to 'boost/context/detail/invoke.hpp')
-rw-r--r-- | boost/context/detail/invoke.hpp | 58 |
1 files changed, 13 insertions, 45 deletions
diff --git a/boost/context/detail/invoke.hpp b/boost/context/detail/invoke.hpp index f63d22c3ff..5ec54800e3 100644 --- a/boost/context/detail/invoke.hpp +++ b/boost/context/detail/invoke.hpp @@ -13,6 +13,8 @@ #include <boost/config.hpp> +#include <boost/context/detail/config.hpp> + #ifdef BOOST_HAS_ABI_HEADERS # include BOOST_ABI_PREFIX #endif @@ -21,61 +23,27 @@ namespace boost { namespace context { namespace detail { -# if _MSC_VER > 1800 +#if _MSC_VER > 1800 using std::invoke; -# else -template< typename Fn, typename ... Args > -typename std::enable_if< - ( ! std::is_member_pointer< Fn >::value && - ! std::is_function< Fn >::value && - ! std::is_function< typename std::remove_pointer< Fn >::type >::value - ), - typename std::result_of< Fn( Args ... ) >::type ->::type -invoke( Fn & fn, Args && ... args) { - return fn( std::forward< Args >( args) ... ); -} - +#else template< typename Fn, typename ... Args > typename std::enable_if< - ( std::is_member_pointer< Fn >::value && - ! std::is_function< Fn >::value && - ! std::is_function< typename std::remove_pointer< Fn >::type >::value - ), - typename std::result_of< Fn( Args ... ) >::type + std::is_member_pointer< typename std::decay< Fn >::type >::value, + typename std::result_of< Fn &&( Args && ... ) >::type >::type -invoke( Fn & fn, Args && ... args) { - return std::mem_fn( fn)( std::forward< Args >( args) ... ); +invoke( Fn && fn, Args && ... args) { + return std::mem_fn( fn)( std::forward< Args >( args) ... ); } template< typename Fn, typename ... Args > typename std::enable_if< - ( std::is_pointer< Fn >::value && - std::is_function< typename std::remove_pointer< Fn >::type >::value - ), - typename std::result_of< Fn( Args ... ) >::type + ! std::is_member_pointer< typename std::decay< Fn >::type >::value, + typename std::result_of< Fn &&( Args && ... ) >::type >::type -invoke( Fn fn, Args && ... args) { - return fn( std::forward< Args >( args) ... ); -} -# endif - -template< typename Fn, typename Tpl, std::size_t... I > -decltype( auto) do_invoke( Fn && fn, Tpl && tpl, std::index_sequence< I ... >) { - return invoke( fn, - // std::tuple_element<> does not perfect forwarding - std::forward< decltype( std::get< I >( std::declval< typename std::decay< Tpl >::type >() ) ) >( - std::get< I >( std::forward< typename std::decay< Tpl >::type >( tpl) ) ) ... ); -} - - -template< typename Fn, typename Tpl > -decltype( auto) do_invoke( Fn && fn, Tpl && tpl) { - constexpr auto Size = std::tuple_size< typename std::decay< Tpl >::type >::value; - return do_invoke( std::forward< Fn >( fn), - std::forward< Tpl >( tpl), - std::make_index_sequence< Size >{}); +invoke( Fn && fn, Args && ... args) { + return std::forward< Fn >( fn)( std::forward< Args >( args) ... ); } +#endif }}} |