123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- // Copyright Oliver Kowalke 2013.
- // Distributed under the Boost Software License, Version 1.0.
- // (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_FIBERS_ASYNC_HPP
- #define BOOST_FIBERS_ASYNC_HPP
- #include <algorithm>
- #include <memory>
- #include <type_traits>
- #include <utility>
- #include <boost/config.hpp>
- #include <boost/fiber/future/future.hpp>
- #include <boost/fiber/future/packaged_task.hpp>
- #include <boost/fiber/policy.hpp>
- namespace boost {
- namespace fibers {
- #if defined(BOOST_MSVC) && (_MSC_VER >= 1911 && _MSVC_LANG >= 201703)
- template <typename>
- struct result_of;
- template <typename F, typename... Args>
- struct result_of<F(Args...)> : std::invoke_result<F, Args...> {};
- #else
- using std::result_of;
- #endif
- template< typename Fn, typename ... Args >
- future<
- typename 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 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::forward< Fn >( fn) };
- 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 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 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::forward< Fn >( fn) };
- 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 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 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::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 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 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;
- }
- }}
- #endif // BOOST_FIBERS_ASYNC_HPP
|