5 // Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com)
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)
11 #ifndef BOOST_ASIO_ASYNC_RESULT_HPP
12 #define BOOST_ASIO_ASYNC_RESULT_HPP
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
18 #include <boost/asio/detail/config.hpp>
19 #include <boost/asio/detail/type_traits.hpp>
20 #include <boost/asio/detail/variadic_templates.hpp>
22 #include <boost/asio/detail/push_options.hpp>
27 #if defined(BOOST_ASIO_HAS_CONCEPTS) \
28 && defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES) \
29 && defined(BOOST_ASIO_HAS_DECLTYPE)
34 struct is_completion_signature : false_type
38 template <typename R, typename... Args>
39 struct is_completion_signature<R(Args...)> : true_type
43 #if defined(BOOST_ASIO_HAS_REF_QUALIFIED_FUNCTIONS)
45 template <typename R, typename... Args>
46 struct is_completion_signature<R(Args...) &> : true_type
50 template <typename R, typename... Args>
51 struct is_completion_signature<R(Args...) &&> : true_type
55 # if defined(BOOST_ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
57 template <typename R, typename... Args>
58 struct is_completion_signature<R(Args...) noexcept> : true_type
62 template <typename R, typename... Args>
63 struct is_completion_signature<R(Args...) & noexcept> : true_type
67 template <typename R, typename... Args>
68 struct is_completion_signature<R(Args...) && noexcept> : true_type
72 # endif // defined(BOOST_ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
73 #endif // defined(BOOST_ASIO_HAS_REF_QUALIFIED_FUNCTIONS)
75 template <typename... T>
76 struct are_completion_signatures : false_type
80 template <typename T0>
81 struct are_completion_signatures<T0>
82 : is_completion_signature<T0>
86 template <typename T0, typename... TN>
87 struct are_completion_signatures<T0, TN...>
88 : integral_constant<bool, (
89 is_completion_signature<T0>::value
90 && are_completion_signatures<TN...>::value)>
94 template <typename T, typename... Args>
95 BOOST_ASIO_CONCEPT callable_with = requires(T&& t, Args&&... args)
97 static_cast<T&&>(t)(static_cast<Args&&>(args)...);
100 template <typename T, typename... Signatures>
101 struct is_completion_handler_for : false_type
105 template <typename T, typename R, typename... Args>
106 struct is_completion_handler_for<T, R(Args...)>
107 : integral_constant<bool, (callable_with<T, Args...>)>
111 #if defined(BOOST_ASIO_HAS_REF_QUALIFIED_FUNCTIONS)
113 template <typename T, typename R, typename... Args>
114 struct is_completion_handler_for<T, R(Args...) &>
115 : integral_constant<bool, (callable_with<T&, Args...>)>
119 template <typename T, typename R, typename... Args>
120 struct is_completion_handler_for<T, R(Args...) &&>
121 : integral_constant<bool, (callable_with<T&&, Args...>)>
125 # if defined(BOOST_ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
127 template <typename T, typename R, typename... Args>
128 struct is_completion_handler_for<T, R(Args...) noexcept>
129 : integral_constant<bool, (callable_with<T, Args...>)>
133 template <typename T, typename R, typename... Args>
134 struct is_completion_handler_for<T, R(Args...) & noexcept>
135 : integral_constant<bool, (callable_with<T&, Args...>)>
139 template <typename T, typename R, typename... Args>
140 struct is_completion_handler_for<T, R(Args...) && noexcept>
141 : integral_constant<bool, (callable_with<T&&, Args...>)>
145 # endif // defined(BOOST_ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
146 #endif // defined(BOOST_ASIO_HAS_REF_QUALIFIED_FUNCTIONS)
148 template <typename T, typename Signature0, typename... SignatureN>
149 struct is_completion_handler_for<T, Signature0, SignatureN...>
150 : integral_constant<bool, (
151 is_completion_handler_for<T, Signature0>::value
152 && is_completion_handler_for<T, SignatureN...>::value)>
156 } // namespace detail
158 template <typename T>
159 BOOST_ASIO_CONCEPT completion_signature =
160 detail::is_completion_signature<T>::value;
162 #define BOOST_ASIO_COMPLETION_SIGNATURE \
163 ::boost::asio::completion_signature
165 template <typename T, typename... Signatures>
166 BOOST_ASIO_CONCEPT completion_handler_for =
167 detail::are_completion_signatures<Signatures...>::value
168 && detail::is_completion_handler_for<T, Signatures...>::value;
170 #define BOOST_ASIO_COMPLETION_HANDLER_FOR(sig) \
171 ::boost::asio::completion_handler_for<sig>
172 #define BOOST_ASIO_COMPLETION_HANDLER_FOR2(sig0, sig1) \
173 ::boost::asio::completion_handler_for<sig0, sig1>
174 #define BOOST_ASIO_COMPLETION_HANDLER_FOR3(sig0, sig1, sig2) \
175 ::boost::asio::completion_handler_for<sig0, sig1, sig2>
177 #else // defined(BOOST_ASIO_HAS_CONCEPTS)
178 // && defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
179 // && defined(BOOST_ASIO_HAS_DECLTYPE)
181 #define BOOST_ASIO_COMPLETION_SIGNATURE typename
182 #define BOOST_ASIO_COMPLETION_HANDLER_FOR(sig) typename
183 #define BOOST_ASIO_COMPLETION_HANDLER_FOR2(sig0, sig1) typename
184 #define BOOST_ASIO_COMPLETION_HANDLER_FOR3(sig0, sig1, sig2) typename
186 #endif // defined(BOOST_ASIO_HAS_CONCEPTS)
187 // && defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
188 // && defined(BOOST_ASIO_HAS_DECLTYPE)
192 template <typename T>
193 struct is_simple_completion_signature : false_type
197 template <typename T>
198 struct simple_completion_signature;
200 #if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
202 template <typename R, typename... Args>
203 struct is_simple_completion_signature<R(Args...)> : true_type
207 template <typename... Signatures>
208 struct are_simple_completion_signatures : false_type
212 template <typename Sig0>
213 struct are_simple_completion_signatures<Sig0>
214 : is_simple_completion_signature<Sig0>
218 template <typename Sig0, typename... SigN>
219 struct are_simple_completion_signatures<Sig0, SigN...>
220 : integral_constant<bool, (
221 is_simple_completion_signature<Sig0>::value
222 && are_simple_completion_signatures<SigN...>::value)>
226 template <typename R, typename... Args>
227 struct simple_completion_signature<R(Args...)>
229 typedef R type(Args...);
232 #if defined(BOOST_ASIO_HAS_REF_QUALIFIED_FUNCTIONS)
234 template <typename R, typename... Args>
235 struct simple_completion_signature<R(Args...) &>
237 typedef R type(Args...);
240 template <typename R, typename... Args>
241 struct simple_completion_signature<R(Args...) &&>
243 typedef R type(Args...);
246 # if defined(BOOST_ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
248 template <typename R, typename... Args>
249 struct simple_completion_signature<R(Args...) noexcept>
251 typedef R type(Args...);
254 template <typename R, typename... Args>
255 struct simple_completion_signature<R(Args...) & noexcept>
257 typedef R type(Args...);
260 template <typename R, typename... Args>
261 struct simple_completion_signature<R(Args...) && noexcept>
263 typedef R type(Args...);
266 # endif // defined(BOOST_ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
267 #endif // defined(BOOST_ASIO_HAS_REF_QUALIFIED_FUNCTIONS)
269 #else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
271 template <typename R>
272 struct is_simple_completion_signature<R()> : true_type
276 #define BOOST_ASIO_PRIVATE_SIMPLE_SIG_DEF(n) \
277 template <typename R, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
278 struct is_simple_completion_signature<R(BOOST_ASIO_VARIADIC_TARGS(n))> \
283 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_SIMPLE_SIG_DEF)
284 #undef BOOST_ASIO_PRIVATE_SIMPLE_SIG_DEF
286 template <typename Sig0 = void, typename Sig1 = void,
287 typename Sig2 = void, typename = void>
288 struct are_simple_completion_signatures : false_type
292 template <typename Sig0>
293 struct are_simple_completion_signatures<Sig0>
294 : is_simple_completion_signature<Sig0>
298 template <typename Sig0, typename Sig1>
299 struct are_simple_completion_signatures<Sig0, Sig1>
300 : integral_constant<bool,
301 (is_simple_completion_signature<Sig0>::value
302 && is_simple_completion_signature<Sig1>::value)>
306 template <typename Sig0, typename Sig1, typename Sig2>
307 struct are_simple_completion_signatures<Sig0, Sig1, Sig2>
308 : integral_constant<bool,
309 (is_simple_completion_signature<Sig0>::value
310 && is_simple_completion_signature<Sig1>::value
311 && is_simple_completion_signature<Sig2>::value)>
316 struct simple_completion_signature<void>
321 template <typename R>
322 struct simple_completion_signature<R()>
327 #define BOOST_ASIO_PRIVATE_SIMPLE_SIG_DEF(n) \
328 template <typename R, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
329 struct simple_completion_signature<R(BOOST_ASIO_VARIADIC_TARGS(n))> \
331 typedef R type(BOOST_ASIO_VARIADIC_TARGS(n)); \
334 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_SIMPLE_SIG_DEF)
335 #undef BOOST_ASIO_PRIVATE_SIMPLE_SIG_DEF
337 #if defined(BOOST_ASIO_HAS_REF_QUALIFIED_FUNCTIONS)
339 template <typename R>
340 struct simple_completion_signature<R() &>
345 template <typename R>
346 struct simple_completion_signature<R() &&>
351 #define BOOST_ASIO_PRIVATE_SIMPLE_SIG_DEF(n) \
352 template <typename R, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
353 struct simple_completion_signature< \
354 R(BOOST_ASIO_VARIADIC_TARGS(n)) &> \
356 typedef R type(BOOST_ASIO_VARIADIC_TARGS(n)); \
359 template <typename R, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
360 struct simple_completion_signature< \
361 R(BOOST_ASIO_VARIADIC_TARGS(n)) &&> \
363 typedef R type(BOOST_ASIO_VARIADIC_TARGS(n)); \
366 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_SIMPLE_SIG_DEF)
367 #undef BOOST_ASIO_PRIVATE_SIMPLE_SIG_DEF
369 # if defined(BOOST_ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
371 template <typename R>
372 struct simple_completion_signature<R() noexcept>
377 template <typename R>
378 struct simple_completion_signature<R() & noexcept>
383 template <typename R>
384 struct simple_completion_signature<R() && noexcept>
389 #define BOOST_ASIO_PRIVATE_SIMPLE_SIG_DEF(n) \
390 template <typename R, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
391 struct simple_completion_signature< \
392 R(BOOST_ASIO_VARIADIC_TARGS(n)) noexcept> \
394 typedef R type(BOOST_ASIO_VARIADIC_TARGS(n)); \
397 template <typename R, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
398 struct simple_completion_signature< \
399 R(BOOST_ASIO_VARIADIC_TARGS(n)) & noexcept> \
401 typedef R type(BOOST_ASIO_VARIADIC_TARGS(n)); \
404 template <typename R, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
405 struct simple_completion_signature< \
406 R(BOOST_ASIO_VARIADIC_TARGS(n)) && noexcept> \
408 typedef R type(BOOST_ASIO_VARIADIC_TARGS(n)); \
411 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_SIMPLE_SIG_DEF)
412 #undef BOOST_ASIO_PRIVATE_SIMPLE_SIG_DEF
414 # endif // defined(BOOST_ASIO_HAS_NOEXCEPT_FUNCTION_TYPE)
415 #endif // defined(BOOST_ASIO_HAS_REF_QUALIFIED_FUNCTIONS)
417 #endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
419 #if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES) \
420 || defined(GENERATING_DOCUMENTATION)
422 # define BOOST_ASIO_COMPLETION_SIGNATURES_TPARAMS \
423 BOOST_ASIO_COMPLETION_SIGNATURE... Signatures
425 # define BOOST_ASIO_COMPLETION_SIGNATURES_TSPECPARAMS \
426 BOOST_ASIO_COMPLETION_SIGNATURE... Signatures
428 # define BOOST_ASIO_COMPLETION_SIGNATURES_TARGS Signatures...
430 # define BOOST_ASIO_COMPLETION_SIGNATURES_TSIMPLEARGS \
431 typename boost::asio::detail::simple_completion_signature< \
434 #else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
435 // || defined(GENERATING_DOCUMENTATION)
437 # define BOOST_ASIO_COMPLETION_SIGNATURES_TPARAMS \
438 typename Sig0 = void, \
439 typename Sig1 = void, \
442 # define BOOST_ASIO_COMPLETION_SIGNATURES_TSPECPARAMS \
447 # define BOOST_ASIO_COMPLETION_SIGNATURES_TARGS Sig0, Sig1, Sig2
449 # define BOOST_ASIO_COMPLETION_SIGNATURES_TSIMPLEARGS \
450 typename ::boost::asio::detail::simple_completion_signature<Sig0>::type, \
451 typename ::boost::asio::detail::simple_completion_signature<Sig1>::type, \
452 typename ::boost::asio::detail::simple_completion_signature<Sig2>::type
454 #endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
455 // || defined(GENERATING_DOCUMENTATION)
457 template <typename CompletionToken, BOOST_ASIO_COMPLETION_SIGNATURES_TPARAMS>
458 class completion_handler_async_result
461 typedef CompletionToken completion_handler_type;
462 typedef void return_type;
464 explicit completion_handler_async_result(completion_handler_type&)
472 #if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
474 template <typename Initiation,
475 BOOST_ASIO_COMPLETION_HANDLER_FOR(Signatures...) RawCompletionToken,
477 static return_type initiate(
478 BOOST_ASIO_MOVE_ARG(Initiation) initiation,
479 BOOST_ASIO_MOVE_ARG(RawCompletionToken) token,
480 BOOST_ASIO_MOVE_ARG(Args)... args)
482 BOOST_ASIO_MOVE_CAST(Initiation)(initiation)(
483 BOOST_ASIO_MOVE_CAST(RawCompletionToken)(token),
484 BOOST_ASIO_MOVE_CAST(Args)(args)...);
487 #else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
489 template <typename Initiation, typename RawCompletionToken>
490 static return_type initiate(
491 BOOST_ASIO_MOVE_ARG(Initiation) initiation,
492 BOOST_ASIO_MOVE_ARG(RawCompletionToken) token)
494 BOOST_ASIO_MOVE_CAST(Initiation)(initiation)(
495 BOOST_ASIO_MOVE_CAST(RawCompletionToken)(token));
498 #define BOOST_ASIO_PRIVATE_INITIATE_DEF(n) \
499 template <typename Initiation, \
500 typename RawCompletionToken, \
501 BOOST_ASIO_VARIADIC_TPARAMS(n)> \
502 static return_type initiate( \
503 BOOST_ASIO_MOVE_ARG(Initiation) initiation, \
504 BOOST_ASIO_MOVE_ARG(RawCompletionToken) token, \
505 BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
507 BOOST_ASIO_MOVE_CAST(Initiation)(initiation)( \
508 BOOST_ASIO_MOVE_CAST(RawCompletionToken)(token), \
509 BOOST_ASIO_VARIADIC_MOVE_ARGS(n)); \
512 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_INITIATE_DEF)
513 #undef BOOST_ASIO_PRIVATE_INITIATE_DEF
515 #endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
518 completion_handler_async_result(
519 const completion_handler_async_result&) BOOST_ASIO_DELETED;
520 completion_handler_async_result& operator=(
521 const completion_handler_async_result&) BOOST_ASIO_DELETED;
524 } // namespace detail
526 #if defined(GENERATING_DOCUMENTATION)
528 /// An interface for customising the behaviour of an initiating function.
530 * The async_result traits class is used for determining:
532 * @li the concrete completion handler type to be called at the end of the
533 * asynchronous operation;
535 * @li the initiating function return type; and
537 * @li how the return value of the initiating function is obtained.
539 * The trait allows the handler and return types to be determined at the point
540 * where the specific completion handler signature is known.
542 * This template may be specialised for user-defined completion token types.
543 * The primary template assumes that the CompletionToken is the completion
546 template <typename CompletionToken, BOOST_ASIO_COMPLETION_SIGNATURES_TPARAMS>
550 /// The concrete completion handler type for the specific signature.
551 typedef CompletionToken completion_handler_type;
553 /// The return type of the initiating function.
554 typedef void return_type;
556 /// Construct an async result from a given handler.
558 * When using a specalised async_result, the constructor has an opportunity
559 * to initialise some state associated with the completion handler, which is
560 * then returned from the initiating function.
562 explicit async_result(completion_handler_type& h);
564 /// Obtain the value to be returned from the initiating function.
567 /// Initiate the asynchronous operation that will produce the result, and
568 /// obtain the value to be returned from the initiating function.
569 template <typename Initiation, typename RawCompletionToken, typename... Args>
570 static return_type initiate(
571 BOOST_ASIO_MOVE_ARG(Initiation) initiation,
572 BOOST_ASIO_MOVE_ARG(RawCompletionToken) token,
573 BOOST_ASIO_MOVE_ARG(Args)... args);
576 async_result(const async_result&) BOOST_ASIO_DELETED;
577 async_result& operator=(const async_result&) BOOST_ASIO_DELETED;
580 #else // defined(GENERATING_DOCUMENTATION)
582 #if defined(BOOST_ASIO_HAS_REF_QUALIFIED_FUNCTIONS)
584 template <typename CompletionToken, BOOST_ASIO_COMPLETION_SIGNATURES_TPARAMS>
587 detail::are_simple_completion_signatures<
588 BOOST_ASIO_COMPLETION_SIGNATURES_TARGS>::value,
589 detail::completion_handler_async_result<
590 CompletionToken, BOOST_ASIO_COMPLETION_SIGNATURES_TARGS>,
591 async_result<CompletionToken,
592 BOOST_ASIO_COMPLETION_SIGNATURES_TSIMPLEARGS>
596 typedef typename conditional<
597 detail::are_simple_completion_signatures<
598 BOOST_ASIO_COMPLETION_SIGNATURES_TARGS>::value,
599 detail::completion_handler_async_result<
600 CompletionToken, BOOST_ASIO_COMPLETION_SIGNATURES_TARGS>,
601 async_result<CompletionToken,
602 BOOST_ASIO_COMPLETION_SIGNATURES_TSIMPLEARGS>
605 using base_type::base_type;
608 async_result(const async_result&) BOOST_ASIO_DELETED;
609 async_result& operator=(const async_result&) BOOST_ASIO_DELETED;
612 #else // defined(BOOST_ASIO_HAS_REF_QUALIFIED_FUNCTIONS)
614 template <typename CompletionToken, BOOST_ASIO_COMPLETION_SIGNATURES_TPARAMS>
616 public detail::completion_handler_async_result<
617 CompletionToken, BOOST_ASIO_COMPLETION_SIGNATURES_TARGS>
620 explicit async_result(CompletionToken& h)
621 : detail::completion_handler_async_result<
622 CompletionToken, BOOST_ASIO_COMPLETION_SIGNATURES_TARGS>(h)
627 async_result(const async_result&) BOOST_ASIO_DELETED;
628 async_result& operator=(const async_result&) BOOST_ASIO_DELETED;
631 #endif // defined(BOOST_ASIO_HAS_REF_QUALIFIED_FUNCTIONS)
633 template <BOOST_ASIO_COMPLETION_SIGNATURES_TSPECPARAMS>
634 class async_result<void, BOOST_ASIO_COMPLETION_SIGNATURES_TARGS>
639 #endif // defined(GENERATING_DOCUMENTATION)
641 /// Helper template to deduce the handler type from a CompletionToken, capture
642 /// a local copy of the handler, and then create an async_result for the
644 template <typename CompletionToken, BOOST_ASIO_COMPLETION_SIGNATURES_TPARAMS>
645 struct async_completion
647 /// The real handler type to be used for the asynchronous operation.
648 typedef typename boost::asio::async_result<
649 typename decay<CompletionToken>::type,
650 BOOST_ASIO_COMPLETION_SIGNATURES_TARGS>::completion_handler_type
651 completion_handler_type;
653 #if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
656 * The constructor creates the concrete completion handler and makes the link
657 * between the handler and the asynchronous result.
659 explicit async_completion(CompletionToken& token)
660 : completion_handler(static_cast<typename conditional<
661 is_same<CompletionToken, completion_handler_type>::value,
662 completion_handler_type&, CompletionToken&&>::type>(token)),
663 result(completion_handler)
666 #else // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
667 explicit async_completion(typename decay<CompletionToken>::type& token)
668 : completion_handler(token),
669 result(completion_handler)
673 explicit async_completion(const typename decay<CompletionToken>::type& token)
674 : completion_handler(token),
675 result(completion_handler)
678 #endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
680 /// A copy of, or reference to, a real handler object.
681 #if defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
682 typename conditional<
683 is_same<CompletionToken, completion_handler_type>::value,
684 completion_handler_type&, completion_handler_type>::type completion_handler;
685 #else // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
686 completion_handler_type completion_handler;
687 #endif // defined(BOOST_ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION)
689 /// The result of the asynchronous operation's initiating function.
690 async_result<typename decay<CompletionToken>::type,
691 BOOST_ASIO_COMPLETION_SIGNATURES_TARGS> result;
696 template <typename CompletionToken, BOOST_ASIO_COMPLETION_SIGNATURES_TPARAMS>
697 struct async_result_helper
698 : async_result<typename decay<CompletionToken>::type,
699 BOOST_ASIO_COMPLETION_SIGNATURES_TARGS>
703 struct async_result_memfns_base
708 template <typename T>
709 struct async_result_memfns_derived
710 : T, async_result_memfns_base
714 template <typename T, T>
715 struct async_result_memfns_check
720 char (&async_result_initiate_memfn_helper(...))[2];
722 template <typename T>
723 char async_result_initiate_memfn_helper(
724 async_result_memfns_check<
725 void (async_result_memfns_base::*)(),
726 &async_result_memfns_derived<T>::initiate>*);
728 template <typename CompletionToken, BOOST_ASIO_COMPLETION_SIGNATURES_TPARAMS>
729 struct async_result_has_initiate_memfn
730 : integral_constant<bool, sizeof(async_result_initiate_memfn_helper<
731 async_result<typename decay<CompletionToken>::type,
732 BOOST_ASIO_COMPLETION_SIGNATURES_TARGS>
737 } // namespace detail
739 #if defined(GENERATING_DOCUMENTATION)
740 # define BOOST_ASIO_INITFN_RESULT_TYPE(ct, sig) \
742 # define BOOST_ASIO_INITFN_RESULT_TYPE2(ct, sig0, sig1) \
744 # define BOOST_ASIO_INITFN_RESULT_TYPE3(ct, sig0, sig1, sig2) \
746 #elif defined(_MSC_VER) && (_MSC_VER < 1500)
747 # define BOOST_ASIO_INITFN_RESULT_TYPE(ct, sig) \
748 typename ::boost::asio::detail::async_result_helper< \
749 ct, sig>::return_type
750 # define BOOST_ASIO_INITFN_RESULT_TYPE2(ct, sig0, sig1) \
751 typename ::boost::asio::detail::async_result_helper< \
752 ct, sig0, sig1>::return_type
753 # define BOOST_ASIO_INITFN_RESULT_TYPE3(ct, sig0, sig1, sig2) \
754 typename ::boost::asio::detail::async_result_helper< \
755 ct, sig0, sig1, sig2>::return_type
756 #define BOOST_ASIO_HANDLER_TYPE(ct, sig) \
757 typename ::boost::asio::detail::async_result_helper< \
758 ct, sig>::completion_handler_type
759 #define BOOST_ASIO_HANDLER_TYPE2(ct, sig0, sig1) \
760 typename ::boost::asio::detail::async_result_helper< \
761 ct, sig0, sig1>::completion_handler_type
762 #define BOOST_ASIO_HANDLER_TYPE3(ct, sig0, sig1, sig2) \
763 typename ::boost::asio::detail::async_result_helper< \
764 ct, sig0, sig1, sig2>::completion_handler_type
766 # define BOOST_ASIO_INITFN_RESULT_TYPE(ct, sig) \
767 typename ::boost::asio::async_result< \
768 typename ::boost::asio::decay<ct>::type, sig>::return_type
769 # define BOOST_ASIO_INITFN_RESULT_TYPE2(ct, sig0, sig1) \
770 typename ::boost::asio::async_result< \
771 typename ::boost::asio::decay<ct>::type, sig0, sig1>::return_type
772 # define BOOST_ASIO_INITFN_RESULT_TYPE3(ct, sig0, sig1, sig2) \
773 typename ::boost::asio::async_result< \
774 typename ::boost::asio::decay<ct>::type, sig0, sig1, sig2>::return_type
775 #define BOOST_ASIO_HANDLER_TYPE(ct, sig) \
776 typename ::boost::asio::async_result< \
777 typename ::boost::asio::decay<ct>::type, sig>::completion_handler_type
778 #define BOOST_ASIO_HANDLER_TYPE2(ct, sig0, sig1) \
779 typename ::boost::asio::async_result< \
780 typename ::boost::asio::decay<ct>::type, \
781 sig0, sig1>::completion_handler_type
782 #define BOOST_ASIO_HANDLER_TYPE3(ct, sig0, sig1, sig2) \
783 typename ::boost::asio::async_result< \
784 typename ::boost::asio::decay<ct>::type, \
785 sig0, sig1, sig2>::completion_handler_type
788 #if defined(GENERATING_DOCUMENTATION)
789 # define BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ct, sig) \
791 # define BOOST_ASIO_INITFN_AUTO_RESULT_TYPE2(ct, sig0, sig1) \
793 # define BOOST_ASIO_INITFN_AUTO_RESULT_TYPE3(ct, sig0, sig1, sig2) \
795 #elif defined(BOOST_ASIO_HAS_RETURN_TYPE_DEDUCTION)
796 # define BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ct, sig) \
798 # define BOOST_ASIO_INITFN_AUTO_RESULT_TYPE2(ct, sig0, sig1) \
800 # define BOOST_ASIO_INITFN_AUTO_RESULT_TYPE3(ct, sig0, sig1, sig2) \
803 # define BOOST_ASIO_INITFN_AUTO_RESULT_TYPE(ct, sig) \
804 BOOST_ASIO_INITFN_RESULT_TYPE(ct, sig)
805 # define BOOST_ASIO_INITFN_AUTO_RESULT_TYPE2(ct, sig0, sig1) \
806 BOOST_ASIO_INITFN_RESULT_TYPE2(ct, sig0, sig1)
807 # define BOOST_ASIO_INITFN_AUTO_RESULT_TYPE3(ct, sig0, sig1, sig2) \
808 BOOST_ASIO_INITFN_RESULT_TYPE3(ct, sig0, sig1, sig2)
811 #if defined(GENERATING_DOCUMENTATION)
812 # define BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE(ct, sig, expr) \
814 # define BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE2(ct, sig0, sig1, expr) \
816 # define BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE3(ct, sig0, sig1, sig2, expr) \
818 #elif defined(BOOST_ASIO_HAS_DECLTYPE)
819 # define BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE(ct, sig, expr) \
821 # define BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE2(ct, sig0, sig1, expr) \
823 # define BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE3(ct, sig0, sig1, sig2, expr) \
826 # define BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE(ct, sig, expr) \
827 BOOST_ASIO_INITFN_RESULT_TYPE(ct, sig)
828 # define BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE2(ct, sig0, sig1, expr) \
829 BOOST_ASIO_INITFN_RESULT_TYPE2(ct, sig0, sig1)
830 # define BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE3(ct, sig0, sig1, sig2, expr) \
831 BOOST_ASIO_INITFN_RESULT_TYPE3(ct, sig0, sig1, sig2)
834 #if defined(GENERATING_DOCUMENTATION)
836 template <typename CompletionToken,
837 completion_signature... Signatures,
838 typename Initiation, typename... Args>
839 void_or_deduced async_initiate(
840 BOOST_ASIO_MOVE_ARG(Initiation) initiation,
841 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken),
842 BOOST_ASIO_MOVE_ARG(Args)... args);
844 #elif defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
846 template <typename CompletionToken,
847 BOOST_ASIO_COMPLETION_SIGNATURE... Signatures,
848 typename Initiation, typename... Args>
849 inline typename constraint<
850 detail::async_result_has_initiate_memfn<
851 CompletionToken, Signatures...>::value,
852 BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE(CompletionToken, Signatures...,
853 (async_result<typename decay<CompletionToken>::type,
854 Signatures...>::initiate(declval<BOOST_ASIO_MOVE_ARG(Initiation)>(),
855 declval<BOOST_ASIO_MOVE_ARG(CompletionToken)>(),
856 declval<BOOST_ASIO_MOVE_ARG(Args)>()...)))>::type
857 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
858 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token,
859 BOOST_ASIO_MOVE_ARG(Args)... args)
861 return async_result<typename decay<CompletionToken>::type,
862 Signatures...>::initiate(BOOST_ASIO_MOVE_CAST(Initiation)(initiation),
863 BOOST_ASIO_MOVE_CAST(CompletionToken)(token),
864 BOOST_ASIO_MOVE_CAST(Args)(args)...);
867 template <typename CompletionToken,
868 BOOST_ASIO_COMPLETION_SIGNATURE... Signatures,
869 typename Initiation, typename... Args>
870 inline typename constraint<
871 !detail::async_result_has_initiate_memfn<
872 CompletionToken, Signatures...>::value,
873 BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Signatures...)>::type
874 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
875 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token,
876 BOOST_ASIO_MOVE_ARG(Args)... args)
878 async_completion<CompletionToken, Signatures...> completion(token);
880 BOOST_ASIO_MOVE_CAST(Initiation)(initiation)(
881 BOOST_ASIO_MOVE_CAST(BOOST_ASIO_HANDLER_TYPE(CompletionToken,
882 Signatures...))(completion.completion_handler),
883 BOOST_ASIO_MOVE_CAST(Args)(args)...);
885 return completion.result.get();
888 #else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
890 template <typename CompletionToken,
891 BOOST_ASIO_COMPLETION_SIGNATURE Sig0,
893 inline typename constraint<
894 detail::async_result_has_initiate_memfn<
895 CompletionToken, Sig0>::value,
896 BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE(CompletionToken, Sig0,
897 (async_result<typename decay<CompletionToken>::type,
898 Sig0>::initiate(declval<BOOST_ASIO_MOVE_ARG(Initiation)>(),
899 declval<BOOST_ASIO_MOVE_ARG(CompletionToken)>())))>::type
900 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
901 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token)
903 return async_result<typename decay<CompletionToken>::type,
904 Sig0>::initiate(BOOST_ASIO_MOVE_CAST(Initiation)(initiation),
905 BOOST_ASIO_MOVE_CAST(CompletionToken)(token));
908 template <typename CompletionToken,
909 BOOST_ASIO_COMPLETION_SIGNATURE Sig0,
910 BOOST_ASIO_COMPLETION_SIGNATURE Sig1,
912 inline typename constraint<
913 detail::async_result_has_initiate_memfn<
914 CompletionToken, Sig0, Sig1>::value,
915 BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE2(CompletionToken, Sig0, Sig1,
916 (async_result<typename decay<CompletionToken>::type,
917 Sig0, Sig1>::initiate(declval<BOOST_ASIO_MOVE_ARG(Initiation)>(),
918 declval<BOOST_ASIO_MOVE_ARG(CompletionToken)>())))>::type
919 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
920 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token)
922 return async_result<typename decay<CompletionToken>::type,
923 Sig0, Sig1>::initiate(BOOST_ASIO_MOVE_CAST(Initiation)(initiation),
924 BOOST_ASIO_MOVE_CAST(CompletionToken)(token));
927 template <typename CompletionToken,
928 BOOST_ASIO_COMPLETION_SIGNATURE Sig0,
929 BOOST_ASIO_COMPLETION_SIGNATURE Sig1,
930 BOOST_ASIO_COMPLETION_SIGNATURE Sig2,
932 inline typename constraint<
933 detail::async_result_has_initiate_memfn<
934 CompletionToken, Sig0, Sig1, Sig2>::value,
935 BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE3(CompletionToken, Sig0, Sig1, Sig2,
936 (async_result<typename decay<CompletionToken>::type,
937 Sig0, Sig1, Sig2>::initiate(declval<BOOST_ASIO_MOVE_ARG(Initiation)>(),
938 declval<BOOST_ASIO_MOVE_ARG(CompletionToken)>())))>::type
939 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
940 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token)
942 return async_result<typename decay<CompletionToken>::type,
943 Sig0, Sig1, Sig2>::initiate(BOOST_ASIO_MOVE_CAST(Initiation)(initiation),
944 BOOST_ASIO_MOVE_CAST(CompletionToken)(token));
947 template <typename CompletionToken,
948 BOOST_ASIO_COMPLETION_SIGNATURE Sig0,
950 inline typename constraint<
951 !detail::async_result_has_initiate_memfn<
952 CompletionToken, Sig0>::value,
953 BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Sig0)>::type
954 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
955 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token)
957 async_completion<CompletionToken, Sig0> completion(token);
959 BOOST_ASIO_MOVE_CAST(Initiation)(initiation)(
960 BOOST_ASIO_MOVE_CAST(BOOST_ASIO_HANDLER_TYPE(CompletionToken,
961 Sig0))(completion.completion_handler));
963 return completion.result.get();
966 template <typename CompletionToken,
967 BOOST_ASIO_COMPLETION_SIGNATURE Sig0,
968 BOOST_ASIO_COMPLETION_SIGNATURE Sig1,
970 inline typename constraint<
971 !detail::async_result_has_initiate_memfn<
972 CompletionToken, Sig0, Sig1>::value,
973 BOOST_ASIO_INITFN_RESULT_TYPE2(CompletionToken, Sig0, Sig1)>::type
974 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
975 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token)
977 async_completion<CompletionToken, Sig0, Sig1> completion(token);
979 BOOST_ASIO_MOVE_CAST(Initiation)(initiation)(
980 BOOST_ASIO_MOVE_CAST(BOOST_ASIO_HANDLER_TYPE2(CompletionToken,
981 Sig0, Sig1))(completion.completion_handler));
983 return completion.result.get();
986 template <typename CompletionToken,
987 BOOST_ASIO_COMPLETION_SIGNATURE Sig0,
988 BOOST_ASIO_COMPLETION_SIGNATURE Sig1,
989 BOOST_ASIO_COMPLETION_SIGNATURE Sig2,
991 inline typename constraint<
992 !detail::async_result_has_initiate_memfn<
993 CompletionToken, Sig0, Sig1, Sig2>::value,
994 BOOST_ASIO_INITFN_RESULT_TYPE3(CompletionToken, Sig0, Sig1, Sig2)>::type
995 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
996 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token)
998 async_completion<CompletionToken, Sig0, Sig1, Sig2> completion(token);
1000 BOOST_ASIO_MOVE_CAST(Initiation)(initiation)(
1001 BOOST_ASIO_MOVE_CAST(BOOST_ASIO_HANDLER_TYPE3(CompletionToken,
1002 Sig0, Sig1, Sig2))(completion.completion_handler));
1004 return completion.result.get();
1007 #define BOOST_ASIO_PRIVATE_INITIATE_DEF(n) \
1008 template <typename CompletionToken, \
1009 BOOST_ASIO_COMPLETION_SIGNATURE Sig0, \
1010 typename Initiation, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
1011 inline typename constraint< \
1012 detail::async_result_has_initiate_memfn< \
1013 CompletionToken, Sig0>::value, \
1014 BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE( \
1015 CompletionToken, Sig0, \
1016 (async_result<typename decay<CompletionToken>::type, \
1018 declval<BOOST_ASIO_MOVE_ARG(Initiation)>(), \
1019 declval<BOOST_ASIO_MOVE_ARG(CompletionToken)>(), \
1020 BOOST_ASIO_VARIADIC_MOVE_DECLVAL(n))))>::type \
1021 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation, \
1022 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token, \
1023 BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
1025 return async_result<typename decay<CompletionToken>::type, \
1027 BOOST_ASIO_MOVE_CAST(Initiation)(initiation), \
1028 BOOST_ASIO_MOVE_CAST(CompletionToken)(token), \
1029 BOOST_ASIO_VARIADIC_MOVE_ARGS(n)); \
1032 template <typename CompletionToken, \
1033 BOOST_ASIO_COMPLETION_SIGNATURE Sig0, \
1034 BOOST_ASIO_COMPLETION_SIGNATURE Sig1, \
1035 typename Initiation, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
1036 inline typename constraint< \
1037 detail::async_result_has_initiate_memfn< \
1038 CompletionToken, Sig0, Sig1>::value, \
1039 BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE2( \
1040 CompletionToken, Sig0, Sig1, \
1041 (async_result<typename decay<CompletionToken>::type, \
1042 Sig0, Sig1>::initiate( \
1043 declval<BOOST_ASIO_MOVE_ARG(Initiation)>(), \
1044 declval<BOOST_ASIO_MOVE_ARG(CompletionToken)>(), \
1045 BOOST_ASIO_VARIADIC_MOVE_DECLVAL(n))))>::type \
1046 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation, \
1047 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token, \
1048 BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
1050 return async_result<typename decay<CompletionToken>::type, \
1051 Sig0, Sig1>::initiate( \
1052 BOOST_ASIO_MOVE_CAST(Initiation)(initiation), \
1053 BOOST_ASIO_MOVE_CAST(CompletionToken)(token), \
1054 BOOST_ASIO_VARIADIC_MOVE_ARGS(n)); \
1057 template <typename CompletionToken, \
1058 BOOST_ASIO_COMPLETION_SIGNATURE Sig0, \
1059 BOOST_ASIO_COMPLETION_SIGNATURE Sig1, \
1060 BOOST_ASIO_COMPLETION_SIGNATURE Sig2, \
1061 typename Initiation, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
1062 inline typename constraint< \
1063 detail::async_result_has_initiate_memfn< \
1064 CompletionToken, Sig0, Sig1, Sig2>::value, \
1065 BOOST_ASIO_INITFN_DEDUCED_RESULT_TYPE3( \
1066 CompletionToken, Sig0, Sig1, Sig2, \
1067 (async_result<typename decay<CompletionToken>::type, \
1068 Sig0, Sig1, Sig2>::initiate( \
1069 declval<BOOST_ASIO_MOVE_ARG(Initiation)>(), \
1070 declval<BOOST_ASIO_MOVE_ARG(CompletionToken)>(), \
1071 BOOST_ASIO_VARIADIC_MOVE_DECLVAL(n))))>::type \
1072 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation, \
1073 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token, \
1074 BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
1076 return async_result<typename decay<CompletionToken>::type, \
1077 Sig0, Sig1, Sig2>::initiate( \
1078 BOOST_ASIO_MOVE_CAST(Initiation)(initiation), \
1079 BOOST_ASIO_MOVE_CAST(CompletionToken)(token), \
1080 BOOST_ASIO_VARIADIC_MOVE_ARGS(n)); \
1083 template <typename CompletionToken, \
1084 BOOST_ASIO_COMPLETION_SIGNATURE Sig0, \
1085 typename Initiation, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
1086 inline typename constraint< \
1087 !detail::async_result_has_initiate_memfn< \
1088 CompletionToken, Sig0>::value, \
1089 BOOST_ASIO_INITFN_RESULT_TYPE(CompletionToken, Sig0)>::type \
1090 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation, \
1091 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token, \
1092 BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
1094 async_completion<CompletionToken, \
1095 Sig0> completion(token); \
1097 BOOST_ASIO_MOVE_CAST(Initiation)(initiation)( \
1098 BOOST_ASIO_MOVE_CAST(BOOST_ASIO_HANDLER_TYPE(CompletionToken, \
1099 Sig0))(completion.completion_handler), \
1100 BOOST_ASIO_VARIADIC_MOVE_ARGS(n)); \
1102 return completion.result.get(); \
1105 template <typename CompletionToken, \
1106 BOOST_ASIO_COMPLETION_SIGNATURE Sig0, \
1107 BOOST_ASIO_COMPLETION_SIGNATURE Sig1, \
1108 typename Initiation, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
1109 inline typename constraint< \
1110 !detail::async_result_has_initiate_memfn< \
1111 CompletionToken, Sig0, Sig1>::value, \
1112 BOOST_ASIO_INITFN_RESULT_TYPE2(CompletionToken, Sig0, Sig1)>::type \
1113 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation, \
1114 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token, \
1115 BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
1117 async_completion<CompletionToken, \
1118 Sig0, Sig1> completion(token); \
1120 BOOST_ASIO_MOVE_CAST(Initiation)(initiation)( \
1121 BOOST_ASIO_MOVE_CAST(BOOST_ASIO_HANDLER_TYPE2(CompletionToken, \
1122 Sig0, Sig1))(completion.completion_handler), \
1123 BOOST_ASIO_VARIADIC_MOVE_ARGS(n)); \
1125 return completion.result.get(); \
1128 template <typename CompletionToken, \
1129 BOOST_ASIO_COMPLETION_SIGNATURE Sig0, \
1130 BOOST_ASIO_COMPLETION_SIGNATURE Sig1, \
1131 BOOST_ASIO_COMPLETION_SIGNATURE Sig2, \
1132 typename Initiation, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
1133 inline typename constraint< \
1134 !detail::async_result_has_initiate_memfn< \
1135 CompletionToken, Sig0, Sig1, Sig2>::value, \
1136 BOOST_ASIO_INITFN_RESULT_TYPE3(CompletionToken, Sig0, Sig1, Sig2)>::type \
1137 async_initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation, \
1138 BOOST_ASIO_NONDEDUCED_MOVE_ARG(CompletionToken) token, \
1139 BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
1141 async_completion<CompletionToken, \
1142 Sig0, Sig1, Sig2> completion(token); \
1144 BOOST_ASIO_MOVE_CAST(Initiation)(initiation)( \
1145 BOOST_ASIO_MOVE_CAST(BOOST_ASIO_HANDLER_TYPE3(CompletionToken, \
1146 Sig0, Sig1, Sig2))(completion.completion_handler), \
1147 BOOST_ASIO_VARIADIC_MOVE_ARGS(n)); \
1149 return completion.result.get(); \
1152 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_INITIATE_DEF)
1153 #undef BOOST_ASIO_PRIVATE_INITIATE_DEF
1155 #endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
1157 #if defined(BOOST_ASIO_HAS_CONCEPTS) \
1158 && defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES) \
1159 && defined(BOOST_ASIO_HAS_DECLTYPE)
1163 template <typename... Signatures>
1164 struct initiation_archetype
1166 template <completion_handler_for<Signatures...> CompletionHandler>
1167 void operator()(CompletionHandler&&) const
1172 } // namespace detail
1174 template <typename T, typename... Signatures>
1175 BOOST_ASIO_CONCEPT completion_token_for =
1176 detail::are_completion_signatures<Signatures...>::value
1180 async_initiate<T, Signatures...>(
1181 detail::initiation_archetype<Signatures...>{}, t);
1184 #define BOOST_ASIO_COMPLETION_TOKEN_FOR(sig) \
1185 ::boost::asio::completion_token_for<sig>
1186 #define BOOST_ASIO_COMPLETION_TOKEN_FOR2(sig0, sig1) \
1187 ::boost::asio::completion_token_for<sig0, sig1>
1188 #define BOOST_ASIO_COMPLETION_TOKEN_FOR3(sig0, sig1, sig2) \
1189 ::boost::asio::completion_token_for<sig0, sig1, sig2>
1191 #else // defined(BOOST_ASIO_HAS_CONCEPTS)
1192 // && defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
1193 // && defined(BOOST_ASIO_HAS_DECLTYPE)
1195 #define BOOST_ASIO_COMPLETION_TOKEN_FOR(sig) typename
1196 #define BOOST_ASIO_COMPLETION_TOKEN_FOR2(sig0, sig1) typename
1197 #define BOOST_ASIO_COMPLETION_TOKEN_FOR3(sig0, sig1, sig2) typename
1199 #endif // defined(BOOST_ASIO_HAS_CONCEPTS)
1200 // && defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
1201 // && defined(BOOST_ASIO_HAS_DECLTYPE)
1205 template <typename T, typename = void>
1206 struct default_completion_token_impl
1211 template <typename T>
1212 struct default_completion_token_impl<T,
1213 typename void_type<typename T::default_completion_token_type>::type>
1215 typedef typename T::default_completion_token_type type;
1218 } // namespace detail
1220 #if defined(GENERATING_DOCUMENTATION)
1222 /// Traits type used to determine the default completion token type associated
1223 /// with a type (such as an executor).
1225 * A program may specialise this traits type if the @c T template parameter in
1226 * the specialisation is a user-defined type.
1228 * Specialisations of this trait may provide a nested typedef @c type, which is
1229 * a default-constructible completion token type.
1231 template <typename T>
1232 struct default_completion_token
1234 /// If @c T has a nested type @c default_completion_token_type,
1235 /// <tt>T::default_completion_token_type</tt>. Otherwise the typedef @c type
1237 typedef see_below type;
1240 template <typename T>
1241 struct default_completion_token
1242 : detail::default_completion_token_impl<T>
1247 #if defined(BOOST_ASIO_HAS_ALIAS_TEMPLATES)
1249 template <typename T>
1250 using default_completion_token_t = typename default_completion_token<T>::type;
1252 #endif // defined(BOOST_ASIO_HAS_ALIAS_TEMPLATES)
1254 #if defined(BOOST_ASIO_HAS_DEFAULT_FUNCTION_TEMPLATE_ARGUMENTS)
1256 #define BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(e) \
1257 = typename ::boost::asio::default_completion_token<e>::type
1258 #define BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(e) \
1259 = typename ::boost::asio::default_completion_token<e>::type()
1261 #else // defined(BOOST_ASIO_HAS_DEFAULT_FUNCTION_TEMPLATE_ARGUMENTS)
1263 #define BOOST_ASIO_DEFAULT_COMPLETION_TOKEN_TYPE(e)
1264 #define BOOST_ASIO_DEFAULT_COMPLETION_TOKEN(e)
1266 #endif // defined(BOOST_ASIO_HAS_DEFAULT_FUNCTION_TEMPLATE_ARGUMENTS)
1269 } // namespace boost
1271 #include <boost/asio/detail/pop_options.hpp>
1273 #endif // BOOST_ASIO_ASYNC_RESULT_HPP