]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/asio/any_io_executor.hpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / boost / asio / any_io_executor.hpp
1 //
2 // any_io_executor.hpp
3 // ~~~~~~~~~~~~~~~~~~~
4 //
5 // Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com)
6 //
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 //
10
11 #ifndef BOOST_ASIO_ANY_IO_EXECUTOR_HPP
12 #define BOOST_ASIO_ANY_IO_EXECUTOR_HPP
13
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
15 # pragma once
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
17
18 #include <boost/asio/detail/config.hpp>
19 #if defined(BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
20 # include <boost/asio/executor.hpp>
21 #else // defined(BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
22 # include <boost/asio/execution.hpp>
23 # include <boost/asio/execution_context.hpp>
24 #endif // defined(BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
25
26 #include <boost/asio/detail/push_options.hpp>
27
28 namespace boost {
29 namespace asio {
30
31 #if defined(BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
32
33 typedef executor any_io_executor;
34
35 #else // defined(BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
36
37 /// Polymorphic executor type for use with I/O objects.
38 /**
39 * The @c any_io_executor type is a polymorphic executor that supports the set
40 * of properties required by I/O objects. It is defined as the
41 * execution::any_executor class template parameterised as follows:
42 * @code execution::any_executor<
43 * execution::context_as_t<execution_context&>,
44 * execution::blocking_t::never_t,
45 * execution::prefer_only<execution::blocking_t::possibly_t>,
46 * execution::prefer_only<execution::outstanding_work_t::tracked_t>,
47 * execution::prefer_only<execution::outstanding_work_t::untracked_t>,
48 * execution::prefer_only<execution::relationship_t::fork_t>,
49 * execution::prefer_only<execution::relationship_t::continuation_t>
50 * > @endcode
51 */
52 class any_io_executor :
53 #if defined(GENERATING_DOCUMENTATION)
54 public execution::any_executor<...>
55 #else // defined(GENERATING_DOCUMENTATION)
56 public execution::any_executor<
57 execution::context_as_t<execution_context&>,
58 execution::blocking_t::never_t,
59 execution::prefer_only<execution::blocking_t::possibly_t>,
60 execution::prefer_only<execution::outstanding_work_t::tracked_t>,
61 execution::prefer_only<execution::outstanding_work_t::untracked_t>,
62 execution::prefer_only<execution::relationship_t::fork_t>,
63 execution::prefer_only<execution::relationship_t::continuation_t>
64 >
65 #endif // defined(GENERATING_DOCUMENTATION)
66 {
67 public:
68 #if !defined(GENERATING_DOCUMENTATION)
69 typedef execution::any_executor<
70 execution::context_as_t<execution_context&>,
71 execution::blocking_t::never_t,
72 execution::prefer_only<execution::blocking_t::possibly_t>,
73 execution::prefer_only<execution::outstanding_work_t::tracked_t>,
74 execution::prefer_only<execution::outstanding_work_t::untracked_t>,
75 execution::prefer_only<execution::relationship_t::fork_t>,
76 execution::prefer_only<execution::relationship_t::continuation_t>
77 > base_type;
78
79 typedef void supportable_properties_type(
80 execution::context_as_t<execution_context&>,
81 execution::blocking_t::never_t,
82 execution::prefer_only<execution::blocking_t::possibly_t>,
83 execution::prefer_only<execution::outstanding_work_t::tracked_t>,
84 execution::prefer_only<execution::outstanding_work_t::untracked_t>,
85 execution::prefer_only<execution::relationship_t::fork_t>,
86 execution::prefer_only<execution::relationship_t::continuation_t>
87 );
88 #endif // !defined(GENERATING_DOCUMENTATION)
89
90 /// Default constructor.
91 BOOST_ASIO_DECL any_io_executor() BOOST_ASIO_NOEXCEPT;
92
93 /// Construct in an empty state. Equivalent effects to default constructor.
94 BOOST_ASIO_DECL any_io_executor(nullptr_t) BOOST_ASIO_NOEXCEPT;
95
96 /// Copy constructor.
97 BOOST_ASIO_DECL any_io_executor(const any_io_executor& e) BOOST_ASIO_NOEXCEPT;
98
99 #if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
100 /// Move constructor.
101 BOOST_ASIO_DECL any_io_executor(any_io_executor&& e) BOOST_ASIO_NOEXCEPT;
102 #endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
103
104 /// Construct to point to the same target as another any_executor.
105 #if defined(GENERATING_DOCUMENTATION)
106 template <class... OtherSupportableProperties>
107 any_io_executor(execution::any_executor<OtherSupportableProperties...> e);
108 #else // defined(GENERATING_DOCUMENTATION)
109 template <typename OtherAnyExecutor>
110 any_io_executor(OtherAnyExecutor e,
111 typename constraint<
112 conditional<
113 !is_same<OtherAnyExecutor, any_io_executor>::value
114 && is_base_of<execution::detail::any_executor_base,
115 OtherAnyExecutor>::value,
116 typename execution::detail::supportable_properties<
117 0, supportable_properties_type>::template
118 is_valid_target<OtherAnyExecutor>,
119 false_type
120 >::type::value
121 >::type = 0)
122 : base_type(BOOST_ASIO_MOVE_CAST(OtherAnyExecutor)(e))
123 {
124 }
125 #endif // defined(GENERATING_DOCUMENTATION)
126
127 /// Construct a polymorphic wrapper for the specified executor.
128 #if defined(GENERATING_DOCUMENTATION)
129 template <BOOST_ASIO_EXECUTION_EXECUTOR Executor>
130 any_io_executor(Executor e);
131 #else // defined(GENERATING_DOCUMENTATION)
132 template <BOOST_ASIO_EXECUTION_EXECUTOR Executor>
133 any_io_executor(Executor e,
134 typename constraint<
135 conditional<
136 !is_same<Executor, any_io_executor>::value
137 && !is_base_of<execution::detail::any_executor_base,
138 Executor>::value,
139 execution::detail::is_valid_target_executor<
140 Executor, supportable_properties_type>,
141 false_type
142 >::type::value
143 >::type = 0)
144 : base_type(BOOST_ASIO_MOVE_CAST(Executor)(e))
145 {
146 }
147 #endif // defined(GENERATING_DOCUMENTATION)
148
149 /// Assignment operator.
150 BOOST_ASIO_DECL any_io_executor& operator=(
151 const any_io_executor& e) BOOST_ASIO_NOEXCEPT;
152
153 #if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
154 /// Move assignment operator.
155 BOOST_ASIO_DECL any_io_executor& operator=(
156 any_io_executor&& e) BOOST_ASIO_NOEXCEPT;
157 #endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
158
159 /// Assignment operator that sets the polymorphic wrapper to the empty state.
160 BOOST_ASIO_DECL any_io_executor& operator=(nullptr_t);
161
162 /// Destructor.
163 BOOST_ASIO_DECL ~any_io_executor();
164
165 /// Swap targets with another polymorphic wrapper.
166 BOOST_ASIO_DECL void swap(any_io_executor& other) BOOST_ASIO_NOEXCEPT;
167
168 /// Obtain a polymorphic wrapper with the specified property.
169 /**
170 * Do not call this function directly. It is intended for use with the
171 * boost::asio::require and boost::asio::prefer customisation points.
172 *
173 * For example:
174 * @code any_io_executor ex = ...;
175 * auto ex2 = boost::asio::require(ex, execution::blocking.possibly); @endcode
176 */
177 template <typename Property>
178 any_io_executor require(const Property& p,
179 typename constraint<
180 traits::require_member<const base_type&, const Property&>::is_valid
181 >::type = 0) const
182 {
183 return static_cast<const base_type&>(*this).require(p);
184 }
185
186 /// Obtain a polymorphic wrapper with the specified property.
187 /**
188 * Do not call this function directly. It is intended for use with the
189 * boost::asio::prefer customisation point.
190 *
191 * For example:
192 * @code any_io_executor ex = ...;
193 * auto ex2 = boost::asio::prefer(ex, execution::blocking.possibly); @endcode
194 */
195 template <typename Property>
196 any_io_executor prefer(const Property& p,
197 typename constraint<
198 traits::prefer_member<const base_type&, const Property&>::is_valid
199 >::type = 0) const
200 {
201 return static_cast<const base_type&>(*this).prefer(p);
202 }
203 };
204
205 #if !defined(GENERATING_DOCUMENTATION)
206
207 template <>
208 BOOST_ASIO_DECL any_io_executor any_io_executor::require(
209 const execution::blocking_t::never_t&, int) const;
210
211 template <>
212 BOOST_ASIO_DECL any_io_executor any_io_executor::prefer(
213 const execution::blocking_t::possibly_t&, int) const;
214
215 template <>
216 BOOST_ASIO_DECL any_io_executor any_io_executor::prefer(
217 const execution::outstanding_work_t::tracked_t&, int) const;
218
219 template <>
220 BOOST_ASIO_DECL any_io_executor any_io_executor::prefer(
221 const execution::outstanding_work_t::untracked_t&, int) const;
222
223 template <>
224 BOOST_ASIO_DECL any_io_executor any_io_executor::prefer(
225 const execution::relationship_t::fork_t&, int) const;
226
227 template <>
228 BOOST_ASIO_DECL any_io_executor any_io_executor::prefer(
229 const execution::relationship_t::continuation_t&, int) const;
230
231 namespace traits {
232
233 #if !defined(BOOST_ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
234
235 template <>
236 struct equality_comparable<any_io_executor>
237 {
238 static const bool is_valid = true;
239 static const bool is_noexcept = true;
240 };
241
242 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT)
243
244 #if !defined(BOOST_ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
245
246 template <typename F>
247 struct execute_member<any_io_executor, F>
248 {
249 static const bool is_valid = true;
250 static const bool is_noexcept = false;
251 typedef void result_type;
252 };
253
254 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT)
255
256 #if !defined(BOOST_ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
257
258 template <typename Prop>
259 struct query_member<any_io_executor, Prop> :
260 query_member<any_io_executor::base_type, Prop>
261 {
262 };
263
264 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT)
265
266 #if !defined(BOOST_ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
267
268 template <typename Prop>
269 struct require_member<any_io_executor, Prop> :
270 require_member<any_io_executor::base_type, Prop>
271 {
272 typedef any_io_executor result_type;
273 };
274
275 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT)
276
277 #if !defined(BOOST_ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
278
279 template <typename Prop>
280 struct prefer_member<any_io_executor, Prop> :
281 prefer_member<any_io_executor::base_type, Prop>
282 {
283 typedef any_io_executor result_type;
284 };
285
286 #endif // !defined(BOOST_ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT)
287
288 } // namespace traits
289
290 #endif // !defined(GENERATING_DOCUMENTATION)
291
292 #endif // defined(BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
293
294 } // namespace asio
295 } // namespace boost
296
297 #include <boost/asio/detail/pop_options.hpp>
298
299 #if defined(BOOST_ASIO_HEADER_ONLY) \
300 && !defined(BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
301 # include <boost/asio/impl/any_io_executor.ipp>
302 #endif // defined(BOOST_ASIO_HEADER_ONLY)
303 // && !defined(BOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT)
304
305 #endif // BOOST_ASIO_ANY_IO_EXECUTOR_HPP