]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/fiber/future/async.hpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / fiber / future / async.hpp
CommitLineData
b32b8144
FG
1
2// Copyright Oliver Kowalke 2013.
3// Distributed under the Boost Software License, Version 1.0.
4// (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt)
6
7#ifndef BOOST_FIBERS_ASYNC_HPP
8#define BOOST_FIBERS_ASYNC_HPP
9
10#include <algorithm>
11#include <memory>
12#include <type_traits>
13#include <utility>
14
15#include <boost/config.hpp>
16
17#include <boost/fiber/future/future.hpp>
18#include <boost/fiber/future/packaged_task.hpp>
19#include <boost/fiber/policy.hpp>
20
21namespace boost {
22namespace fibers {
23
20effc67
TL
24#if defined(BOOST_MSVC) && (_MSC_VER >= 1911 && _MSVC_LANG >= 201703)
25template <typename>
26struct result_of;
27template <typename F, typename... Args>
28struct result_of<F(Args...)> : std::invoke_result<F, Args...> {};
29#else
30using std::result_of;
31#endif
32
33
b32b8144
FG
34template< typename Fn, typename ... Args >
35future<
20effc67 36 typename result_of<
b32b8144
FG
37 typename std::enable_if<
38 ! detail::is_launch_policy< typename std::decay< Fn >::type >::value,
39 typename std::decay< Fn >::type
40 >::type( typename std::decay< Args >::type ... )
41 >::type
42>
43async( Fn && fn, Args ... args) {
20effc67 44 typedef typename result_of<
b32b8144
FG
45 typename std::decay< Fn >::type( typename std::decay< Args >::type ... )
46 >::type result_type;
47
48 packaged_task< result_type( typename std::decay< Args >::type ... ) > pt{
49 std::forward< Fn >( fn) };
50 future< result_type > f{ pt.get_future() };
51 fiber{ std::move( pt), std::forward< Args >( args) ... }.detach();
52 return f;
53}
54
55template< typename Policy, typename Fn, typename ... Args >
56future<
20effc67 57 typename result_of<
b32b8144
FG
58 typename std::enable_if<
59 detail::is_launch_policy< Policy >::value,
60 typename std::decay< Fn >::type
61 >::type( typename std::decay< Args >::type ...)
62 >::type
63>
64async( Policy policy, Fn && fn, Args ... args) {
20effc67 65 typedef typename result_of<
b32b8144
FG
66 typename std::decay< Fn >::type( typename std::decay< Args >::type ... )
67 >::type result_type;
68
69 packaged_task< result_type( typename std::decay< Args >::type ... ) > pt{
70 std::forward< Fn >( fn) };
71 future< result_type > f{ pt.get_future() };
72 fiber{ policy, std::move( pt), std::forward< Args >( args) ... }.detach();
73 return f;
74}
75
76template< typename Policy, typename StackAllocator, typename Fn, typename ... Args >
77future<
20effc67 78 typename result_of<
b32b8144
FG
79 typename std::enable_if<
80 detail::is_launch_policy< Policy >::value,
81 typename std::decay< Fn >::type
82 >::type( typename std::decay< Args >::type ... )
83 >::type
84>
85async( Policy policy, std::allocator_arg_t, StackAllocator salloc, Fn && fn, Args ... args) {
20effc67 86 typedef typename result_of<
b32b8144
FG
87 typename std::decay< Fn >::type( typename std::decay< Args >::type ... )
88 >::type result_type;
89
90 packaged_task< result_type( typename std::decay< Args >::type ... ) > pt{
91 std::forward< Fn >( fn) };
92 future< result_type > f{ pt.get_future() };
93 fiber{ policy, std::allocator_arg, salloc,
94 std::move( pt), std::forward< Args >( args) ... }.detach();
95 return f;
96}
97
98template< typename Policy, typename StackAllocator, typename Allocator, typename Fn, typename ... Args >
99future<
20effc67 100 typename result_of<
b32b8144
FG
101 typename std::enable_if<
102 detail::is_launch_policy< Policy >::value,
103 typename std::decay< Fn >::type
104 >::type( typename std::decay< Args >::type ... )
105 >::type
106>
107async( Policy policy, std::allocator_arg_t, StackAllocator salloc, Allocator alloc, Fn && fn, Args ... args) {
20effc67 108 typedef typename result_of<
b32b8144
FG
109 typename std::decay< Fn >::type( typename std::decay< Args >::type ... )
110 >::type result_type;
111
112 packaged_task< result_type( typename std::decay< Args >::type ... ) > pt{
113 std::allocator_arg, alloc, std::forward< Fn >( fn) };
114 future< result_type > f{ pt.get_future() };
115 fiber{ policy, std::allocator_arg, salloc,
116 std::move( pt), std::forward< Args >( args) ... }.detach();
117 return f;
118}
119
120}}
121
122#endif // BOOST_FIBERS_ASYNC_HPP