diff options
Diffstat (limited to 'boost/fiber/future/async.hpp')
-rw-r--r-- | boost/fiber/future/async.hpp | 78 |
1 files changed, 50 insertions, 28 deletions
diff --git a/boost/fiber/future/async.hpp b/boost/fiber/future/async.hpp index d969d19ce3..e68b2c28fa 100644 --- a/boost/fiber/future/async.hpp +++ b/boost/fiber/future/async.hpp @@ -23,63 +23,85 @@ namespace fibers { template< typename Fn, typename ... Args > future< - typename std::result_of< - typename std::enable_if< - ! detail::is_launch_policy< typename std::decay< Fn >::type >::value, - typename std::decay< Fn >::type - >::type( typename std::decay< Args >::type ... ) - >::type + typename std::result_of< + typename std::enable_if< + ! detail::is_launch_policy< typename std::decay< Fn >::type >::value, + typename std::decay< Fn >::type + >::type( typename std::decay< Args >::type ... ) + >::type > async( Fn && fn, Args && ... args) { typedef typename std::result_of< typename std::decay< Fn >::type( typename std::decay< Args >::type ... ) - >::type result_t; + >::type result_type; - packaged_task< result_t( typename std::decay< Args >::type ... ) > pt{ + packaged_task< result_type( typename std::decay< Args >::type ... ) > pt{ std::forward< Fn >( fn) }; - future< result_t > f{ pt.get_future() }; + future< result_type > f{ pt.get_future() }; fiber{ std::move( pt), std::forward< Args >( args) ... }.detach(); return f; } template< typename Policy, typename Fn, typename ... Args > future< - typename std::result_of< - typename std::enable_if< - detail::is_launch_policy< Policy >::value, - typename std::decay< Fn >::type - >::type( typename std::decay< Args >::type ...) - >::type + typename std::result_of< + typename std::enable_if< + detail::is_launch_policy< Policy >::value, + typename std::decay< Fn >::type + >::type( typename std::decay< Args >::type ...) + >::type > async( Policy policy, Fn && fn, Args && ... args) { typedef typename std::result_of< typename std::decay< Fn >::type( typename std::decay< Args >::type ... ) - >::type result_t; + >::type result_type; - packaged_task< result_t( typename std::decay< Args >::type ... ) > pt{ + packaged_task< result_type( typename std::decay< Args >::type ... ) > pt{ std::forward< Fn >( fn) }; - future< result_t > f{ pt.get_future() }; + future< result_type > f{ pt.get_future() }; fiber{ policy, std::move( pt), std::forward< Args >( args) ... }.detach(); return f; } template< typename Policy, typename StackAllocator, typename Fn, typename ... Args > future< - typename std::result_of< - typename std::enable_if< - detail::is_launch_policy< Policy >::value, - typename std::decay< Fn >::type - >::type( typename std::decay< Args >::type ... ) - >::type + typename std::result_of< + typename std::enable_if< + detail::is_launch_policy< Policy >::value, + typename std::decay< Fn >::type + >::type( typename std::decay< Args >::type ... ) + >::type > async( Policy policy, std::allocator_arg_t, StackAllocator salloc, Fn && fn, Args && ... args) { typedef typename std::result_of< typename std::decay< Fn >::type( typename std::decay< Args >::type ... ) - >::type result_t; + >::type result_type; - packaged_task< result_t( typename std::decay< Args >::type ... ) > pt{ - std::allocator_arg, salloc, std::forward< Fn >( fn) }; - future< result_t > f{ pt.get_future() }; + packaged_task< result_type( typename std::decay< Args >::type ... ) > pt{ + std::forward< Fn >( fn) }; + future< result_type > f{ pt.get_future() }; + fiber{ policy, std::allocator_arg, salloc, + std::move( pt), std::forward< Args >( args) ... }.detach(); + return f; +} + +template< typename Policy, typename StackAllocator, typename Allocator, typename Fn, typename ... Args > +future< + typename std::result_of< + typename std::enable_if< + detail::is_launch_policy< Policy >::value, + typename std::decay< Fn >::type + >::type( typename std::decay< Args >::type ... ) + >::type +> +async( Policy policy, std::allocator_arg_t, StackAllocator salloc, Allocator alloc, Fn && fn, Args && ... args) { + typedef typename std::result_of< + typename std::decay< Fn >::type( typename std::decay< Args >::type ... ) + >::type result_type; + + packaged_task< result_type( typename std::decay< Args >::type ... ) > pt{ + std::allocator_arg, alloc, std::forward< Fn >( fn) }; + future< result_type > f{ pt.get_future() }; fiber{ policy, std::allocator_arg, salloc, std::move( pt), std::forward< Args >( args) ... }.detach(); return f; |