summaryrefslogtreecommitdiff
path: root/boost/context/detail/invoke.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/context/detail/invoke.hpp')
-rw-r--r--boost/context/detail/invoke.hpp58
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
}}}