5 // Copyright (c) 2003-2017 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_IMPL_USE_FUTURE_HPP
12 #define BOOST_ASIO_IMPL_USE_FUTURE_HPP
14 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
16 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
18 #include <boost/asio/detail/config.hpp>
21 #include <boost/asio/async_result.hpp>
22 #include <boost/asio/detail/memory.hpp>
23 #include <boost/system/error_code.hpp>
24 #include <boost/asio/packaged_task.hpp>
25 #include <boost/system/system_error.hpp>
26 #include <boost/asio/system_executor.hpp>
28 #include <boost/asio/detail/push_options.hpp>
34 #if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
36 template <typename T, typename F, typename... Args>
37 inline void promise_invoke_and_set(std::promise<T>& p,
38 F& f, BOOST_ASIO_MOVE_ARG(Args)... args)
40 #if !defined(BOOST_ASIO_NO_EXCEPTIONS)
42 #endif // !defined(BOOST_ASIO_NO_EXCEPTIONS)
44 p.set_value(f(BOOST_ASIO_MOVE_CAST(Args)(args)...));
46 #if !defined(BOOST_ASIO_NO_EXCEPTIONS)
49 p.set_exception(std::current_exception());
51 #endif // !defined(BOOST_ASIO_NO_EXCEPTIONS)
54 template <typename F, typename... Args>
55 inline void promise_invoke_and_set(std::promise<void>& p,
56 F& f, BOOST_ASIO_MOVE_ARG(Args)... args)
58 #if !defined(BOOST_ASIO_NO_EXCEPTIONS)
60 #endif // !defined(BOOST_ASIO_NO_EXCEPTIONS)
62 f(BOOST_ASIO_MOVE_CAST(Args)(args)...);
65 #if !defined(BOOST_ASIO_NO_EXCEPTIONS)
68 p.set_exception(std::current_exception());
70 #endif // !defined(BOOST_ASIO_NO_EXCEPTIONS)
73 #else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
75 template <typename T, typename F>
76 inline void promise_invoke_and_set(std::promise<T>& p, F& f)
78 #if !defined(BOOST_ASIO_NO_EXCEPTIONS)
80 #endif // !defined(BOOST_ASIO_NO_EXCEPTIONS)
84 #if !defined(BOOST_ASIO_NO_EXCEPTIONS)
87 p.set_exception(std::current_exception());
89 #endif // !defined(BOOST_ASIO_NO_EXCEPTIONS)
92 template <typename F, typename Args>
93 inline void promise_invoke_and_set(std::promise<void>& p, F& f)
95 #if !defined(BOOST_ASIO_NO_EXCEPTIONS)
97 #endif // !defined(BOOST_ASIO_NO_EXCEPTIONS)
101 #if !defined(BOOST_ASIO_NO_EXCEPTIONS)
105 p.set_exception(std::current_exception());
107 #endif // !defined(BOOST_ASIO_NO_EXCEPTIONS)
110 #if defined(BOOST_ASIO_NO_EXCEPTIONS)
112 #define BOOST_ASIO_PRIVATE_PROMISE_INVOKE_DEF(n) \
113 template <typename T, typename F, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
114 inline void promise_invoke_and_set(std::promise<T>& p, \
115 F& f, BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
117 p.set_value(f(BOOST_ASIO_VARIADIC_MOVE_ARGS(n))); \
120 template <typename F, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
121 inline void promise_invoke_and_set(std::promise<void>& p, \
122 F& f, BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
124 f(BOOST_ASIO_VARIADIC_MOVE_ARGS(n)); \
128 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_PROMISE_INVOKE_DEF)
129 #undef BOOST_ASIO_PRIVATE_PROMISE_INVOKE_DEF
131 #else // defined(BOOST_ASIO_NO_EXCEPTIONS)
133 #define BOOST_ASIO_PRIVATE_PROMISE_INVOKE_DEF(n) \
134 template <typename T, typename F, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
135 inline void promise_invoke_and_set(std::promise<T>& p, \
136 F& f, BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
140 p.set_value(f(BOOST_ASIO_VARIADIC_MOVE_ARGS(n))); \
144 p.set_exception(std::current_exception()); \
148 template <typename F, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
149 inline void promise_invoke_and_set(std::promise<void>& p, \
150 F& f, BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
154 f(BOOST_ASIO_VARIADIC_MOVE_ARGS(n)); \
159 p.set_exception(std::current_exception()); \
163 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_PROMISE_INVOKE_DEF)
164 #undef BOOST_ASIO_PRIVATE_PROMISE_INVOKE_DEF
166 #endif // defined(BOOST_ASIO_NO_EXCEPTIONS)
168 #endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
170 // A function object adapter to invoke a nullary function object and capture
171 // any exception thrown into a promise.
172 template <typename T, typename F>
173 class promise_invoker
176 promise_invoker(const shared_ptr<std::promise<T> >& p,
177 BOOST_ASIO_MOVE_ARG(F) f)
178 : p_(p), f_(BOOST_ASIO_MOVE_CAST(F)(f))
184 #if !defined(BOOST_ASIO_NO_EXCEPTIONS)
186 #endif // !defined(BOOST_ASIO_NO_EXCEPTIONS)
190 #if !defined(BOOST_ASIO_NO_EXCEPTIONS)
193 p_->set_exception(std::current_exception());
195 #endif // !defined(BOOST_ASIO_NO_EXCEPTIONS)
199 shared_ptr<std::promise<T> > p_;
200 typename decay<F>::type f_;
203 // An executor that adapts the system_executor to capture any exeption thrown
204 // by a submitted function object and save it into a promise.
205 template <typename T>
206 class promise_executor
209 explicit promise_executor(const shared_ptr<std::promise<T> >& p)
214 execution_context& context() const BOOST_ASIO_NOEXCEPT
216 return system_executor().context();
219 void on_work_started() const BOOST_ASIO_NOEXCEPT {}
220 void on_work_finished() const BOOST_ASIO_NOEXCEPT {}
222 template <typename F, typename A>
223 void dispatch(BOOST_ASIO_MOVE_ARG(F) f, const A&) const
225 promise_invoker<T, F>(p_, BOOST_ASIO_MOVE_CAST(F)(f))();
228 template <typename F, typename A>
229 void post(BOOST_ASIO_MOVE_ARG(F) f, const A& a) const
231 system_executor().post(
232 promise_invoker<T, F>(p_, BOOST_ASIO_MOVE_CAST(F)(f)), a);
235 template <typename F, typename A>
236 void defer(BOOST_ASIO_MOVE_ARG(F) f, const A& a) const
238 system_executor().defer(
239 promise_invoker<T, F>(p_, BOOST_ASIO_MOVE_CAST(F)(f)), a);
242 friend bool operator==(const promise_executor& a,
243 const promise_executor& b) BOOST_ASIO_NOEXCEPT
248 friend bool operator!=(const promise_executor& a,
249 const promise_executor& b) BOOST_ASIO_NOEXCEPT
255 shared_ptr<std::promise<T> > p_;
258 // The base class for all completion handlers that create promises.
259 template <typename T>
260 class promise_creator
263 typedef promise_executor<T> executor_type;
265 executor_type get_executor() const BOOST_ASIO_NOEXCEPT
267 return executor_type(p_);
270 typedef std::future<T> future_type;
272 future_type get_future()
274 return p_->get_future();
278 template <typename Allocator>
279 void create_promise(const Allocator& a)
281 BOOST_ASIO_REBIND_ALLOC(Allocator, char) b(a);
282 p_ = std::allocate_shared<std::promise<T>>(b, std::allocator_arg, b);
285 shared_ptr<std::promise<T> > p_;
288 // For completion signature void().
289 class promise_handler_0
290 : public promise_creator<void>
295 this->p_->set_value();
299 // For completion signature void(error_code).
300 class promise_handler_ec_0
301 : public promise_creator<void>
304 void operator()(const boost::system::error_code& ec)
308 this->p_->set_exception(
309 std::make_exception_ptr(
310 boost::system::system_error(ec)));
314 this->p_->set_value();
319 // For completion signature void(exception_ptr).
320 class promise_handler_ex_0
321 : public promise_creator<void>
324 void operator()(const std::exception_ptr& ex)
328 this->p_->set_exception(ex);
332 this->p_->set_value();
337 // For completion signature void(T).
338 template <typename T>
339 class promise_handler_1
340 : public promise_creator<T>
343 template <typename Arg>
344 void operator()(BOOST_ASIO_MOVE_ARG(Arg) arg)
346 this->p_->set_value(BOOST_ASIO_MOVE_CAST(Arg)(arg));
350 // For completion signature void(error_code, T).
351 template <typename T>
352 class promise_handler_ec_1
353 : public promise_creator<T>
356 template <typename Arg>
357 void operator()(const boost::system::error_code& ec,
358 BOOST_ASIO_MOVE_ARG(Arg) arg)
362 this->p_->set_exception(
363 std::make_exception_ptr(
364 boost::system::system_error(ec)));
367 this->p_->set_value(BOOST_ASIO_MOVE_CAST(Arg)(arg));
371 // For completion signature void(exception_ptr, T).
372 template <typename T>
373 class promise_handler_ex_1
374 : public promise_creator<T>
377 template <typename Arg>
378 void operator()(const std::exception_ptr& ex,
379 BOOST_ASIO_MOVE_ARG(Arg) arg)
382 this->p_->set_exception(ex);
384 this->p_->set_value(BOOST_ASIO_MOVE_CAST(Arg)(arg));
388 // For completion signature void(T1, ..., Tn);
389 template <typename T>
390 class promise_handler_n
391 : public promise_creator<T>
394 #if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
396 template <typename... Args>
397 void operator()(BOOST_ASIO_MOVE_ARG(Args)... args)
400 std::forward_as_tuple(
401 BOOST_ASIO_MOVE_CAST(Args)(args)...));
404 #else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
406 #define BOOST_ASIO_PRIVATE_CALL_OP_DEF(n) \
407 template <BOOST_ASIO_VARIADIC_TPARAMS(n)> \
408 void operator()(BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
410 this->p_->set_value( \
411 std::forward_as_tuple( \
412 BOOST_ASIO_VARIADIC_MOVE_ARGS(n))); \
415 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_CALL_OP_DEF)
416 #undef BOOST_ASIO_PRIVATE_CALL_OP_DEF
418 #endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
421 // For completion signature void(error_code, T1, ..., Tn);
422 template <typename T>
423 class promise_handler_ec_n
424 : public promise_creator<T>
427 #if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
429 template <typename... Args>
430 void operator()(const boost::system::error_code& ec,
431 BOOST_ASIO_MOVE_ARG(Args)... args)
435 this->p_->set_exception(
436 std::make_exception_ptr(
437 boost::system::system_error(ec)));
442 std::forward_as_tuple(
443 BOOST_ASIO_MOVE_CAST(Args)(args)...));
447 #else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
449 #define BOOST_ASIO_PRIVATE_CALL_OP_DEF(n) \
450 template <BOOST_ASIO_VARIADIC_TPARAMS(n)> \
451 void operator()(const boost::system::error_code& ec, \
452 BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
456 this->p_->set_exception( \
457 std::make_exception_ptr( \
458 boost::system::system_error(ec))); \
462 this->p_->set_value( \
463 std::forward_as_tuple( \
464 BOOST_ASIO_VARIADIC_MOVE_ARGS(n))); \
468 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_CALL_OP_DEF)
469 #undef BOOST_ASIO_PRIVATE_CALL_OP_DEF
471 #endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
474 // For completion signature void(exception_ptr, T1, ..., Tn);
475 template <typename T>
476 class promise_handler_ex_n
477 : public promise_creator<T>
480 #if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
482 template <typename... Args>
483 void operator()(const std::exception_ptr& ex,
484 BOOST_ASIO_MOVE_ARG(Args)... args)
487 this->p_->set_exception(ex);
491 std::forward_as_tuple(
492 BOOST_ASIO_MOVE_CAST(Args)(args)...));
496 #else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
498 #define BOOST_ASIO_PRIVATE_CALL_OP_DEF(n) \
499 template <BOOST_ASIO_VARIADIC_TPARAMS(n)> \
500 void operator()(const std::exception_ptr& ex, \
501 BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
504 this->p_->set_exception(ex); \
507 this->p_->set_value( \
508 std::forward_as_tuple( \
509 BOOST_ASIO_VARIADIC_MOVE_ARGS(n))); \
513 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_CALL_OP_DEF)
514 #undef BOOST_ASIO_PRIVATE_CALL_OP_DEF
516 #endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
519 // Helper template to choose the appropriate concrete promise handler
520 // implementation based on the supplied completion signature.
521 template <typename> class promise_handler_selector;
524 class promise_handler_selector<void()>
525 : public promise_handler_0 {};
528 class promise_handler_selector<void(boost::system::error_code)>
529 : public promise_handler_ec_0 {};
532 class promise_handler_selector<void(std::exception_ptr)>
533 : public promise_handler_ex_0 {};
535 template <typename Arg>
536 class promise_handler_selector<void(Arg)>
537 : public promise_handler_1<Arg> {};
539 template <typename Arg>
540 class promise_handler_selector<void(boost::system::error_code, Arg)>
541 : public promise_handler_ec_1<Arg> {};
543 template <typename Arg>
544 class promise_handler_selector<void(std::exception_ptr, Arg)>
545 : public promise_handler_ex_1<Arg> {};
547 #if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
549 template <typename... Arg>
550 class promise_handler_selector<void(Arg...)>
551 : public promise_handler_n<std::tuple<Arg...> > {};
553 template <typename... Arg>
554 class promise_handler_selector<void(boost::system::error_code, Arg...)>
555 : public promise_handler_ec_n<std::tuple<Arg...> > {};
557 template <typename... Arg>
558 class promise_handler_selector<void(std::exception_ptr, Arg...)>
559 : public promise_handler_ex_n<std::tuple<Arg...> > {};
561 #else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
563 #define BOOST_ASIO_PRIVATE_PROMISE_SELECTOR_DEF(n) \
564 template <typename Arg, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
565 class promise_handler_selector< \
566 void(Arg, BOOST_ASIO_VARIADIC_TARGS(n))> \
567 : public promise_handler_n< \
568 std::tuple<Arg, BOOST_ASIO_VARIADIC_TARGS(n)> > {}; \
570 template <typename Arg, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
571 class promise_handler_selector< \
572 void(boost::system::error_code, Arg, BOOST_ASIO_VARIADIC_TARGS(n))> \
573 : public promise_handler_ec_n< \
574 std::tuple<Arg, BOOST_ASIO_VARIADIC_TARGS(n)> > {}; \
576 template <typename Arg, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
577 class promise_handler_selector< \
578 void(std::exception_ptr, Arg, BOOST_ASIO_VARIADIC_TARGS(n))> \
579 : public promise_handler_ex_n< \
580 std::tuple<Arg, BOOST_ASIO_VARIADIC_TARGS(n)> > {}; \
582 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_PROMISE_SELECTOR_DEF)
583 #undef BOOST_ASIO_PRIVATE_PROMISE_SELECTOR_DEF
585 #endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
587 // Completion handlers produced from the use_future completion token, when not
588 // using use_future::operator().
589 template <typename Signature, typename Allocator>
590 class promise_handler
591 : public promise_handler_selector<Signature>
594 typedef Allocator allocator_type;
595 typedef void result_type;
597 promise_handler(use_future_t<Allocator> u)
598 : allocator_(u.get_allocator())
600 this->create_promise(allocator_);
603 allocator_type get_allocator() const BOOST_ASIO_NOEXCEPT
609 Allocator allocator_;
612 template <typename Function, typename Signature, typename Allocator>
613 inline void asio_handler_invoke(Function& f,
614 promise_handler<Signature, Allocator>* h)
616 typename promise_handler<Signature, Allocator>::executor_type
617 ex(h->get_executor());
618 ex.dispatch(BOOST_ASIO_MOVE_CAST(Function)(f), std::allocator<void>());
621 template <typename Function, typename Signature, typename Allocator>
622 inline void asio_handler_invoke(const Function& f,
623 promise_handler<Signature, Allocator>* h)
625 typename promise_handler<Signature, Allocator>::executor_type
626 ex(h->get_executor());
627 ex.dispatch(f, std::allocator<void>());
630 // Helper base class for async_result specialisation.
631 template <typename Signature, typename Allocator>
632 class promise_async_result
635 typedef promise_handler<Signature, Allocator> completion_handler_type;
636 typedef typename completion_handler_type::future_type return_type;
638 explicit promise_async_result(completion_handler_type& h)
639 : future_(h.get_future())
645 return BOOST_ASIO_MOVE_CAST(return_type)(future_);
652 // Return value from use_future::operator().
653 template <typename Function, typename Allocator>
657 packaged_token(Function f, const Allocator& a)
658 : function_(BOOST_ASIO_MOVE_CAST(Function)(f)),
665 Allocator allocator_;
668 // Completion handlers produced from the use_future completion token, when
669 // using use_future::operator().
670 template <typename Function, typename Allocator, typename Result>
671 class packaged_handler
672 : public promise_creator<Result>
675 typedef Allocator allocator_type;
676 typedef void result_type;
678 packaged_handler(packaged_token<Function, Allocator> t)
679 : function_(BOOST_ASIO_MOVE_CAST(Function)(t.function_)),
680 allocator_(t.allocator_)
682 this->create_promise(allocator_);
685 allocator_type get_allocator() const BOOST_ASIO_NOEXCEPT
690 #if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
692 template <typename... Args>
693 void operator()(BOOST_ASIO_MOVE_ARG(Args)... args)
695 (promise_invoke_and_set)(*this->p_,
696 function_, BOOST_ASIO_MOVE_CAST(Args)(args)...);
699 #else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
703 (promise_invoke_and_set)(*this->p_, function_);
706 #define BOOST_ASIO_PRIVATE_CALL_OP_DEF(n) \
707 template <BOOST_ASIO_VARIADIC_TPARAMS(n)> \
708 void operator()(BOOST_ASIO_VARIADIC_MOVE_PARAMS(n)) \
710 (promise_invoke_and_set)(*this->p_, \
711 function_, BOOST_ASIO_VARIADIC_MOVE_ARGS(n)); \
714 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_CALL_OP_DEF)
715 #undef BOOST_ASIO_PRIVATE_CALL_OP_DEF
717 #endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
721 Allocator allocator_;
724 template <typename Function,
725 typename Function1, typename Allocator, typename Result>
726 inline void asio_handler_invoke(Function& f,
727 packaged_handler<Function1, Allocator, Result>* h)
729 typename packaged_handler<Function1, Allocator, Result>::executor_type
730 ex(h->get_executor());
731 ex.dispatch(BOOST_ASIO_MOVE_CAST(Function)(f), std::allocator<void>());
734 template <typename Function,
735 typename Function1, typename Allocator, typename Result>
736 inline void asio_handler_invoke(const Function& f,
737 packaged_handler<Function1, Allocator, Result>* h)
739 typename packaged_handler<Function1, Allocator, Result>::executor_type
740 ex(h->get_executor());
741 ex.dispatch(f, std::allocator<void>());
744 // Helper base class for async_result specialisation.
745 template <typename Function, typename Allocator, typename Result>
746 class packaged_async_result
749 typedef packaged_handler<Function, Allocator, Result> completion_handler_type;
750 typedef typename completion_handler_type::future_type return_type;
752 explicit packaged_async_result(completion_handler_type& h)
753 : future_(h.get_future())
759 return BOOST_ASIO_MOVE_CAST(return_type)(future_);
766 } // namespace detail
768 template <typename Allocator> template <typename Function>
769 inline detail::packaged_token<typename decay<Function>::type, Allocator>
770 use_future_t<Allocator>::operator()(BOOST_ASIO_MOVE_ARG(Function) f) const
772 return detail::packaged_token<typename decay<Function>::type, Allocator>(
773 BOOST_ASIO_MOVE_CAST(Function)(f), allocator_);
776 #if !defined(GENERATING_DOCUMENTATION)
778 #if defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
780 template <typename Allocator, typename Result, typename... Args>
781 class async_result<use_future_t<Allocator>, Result(Args...)>
782 : public detail::promise_async_result<
783 void(typename decay<Args>::type...), Allocator>
786 explicit async_result(
787 typename detail::promise_async_result<void(typename decay<Args>::type...),
788 Allocator>::completion_handler_type& h)
789 : detail::promise_async_result<
790 void(typename decay<Args>::type...), Allocator>(h)
795 template <typename Function, typename Allocator,
796 typename Result, typename... Args>
797 class async_result<detail::packaged_token<Function, Allocator>, Result(Args...)>
798 : public detail::packaged_async_result<Function, Allocator,
799 typename result_of<Function(Args...)>::type>
802 explicit async_result(
803 typename detail::packaged_async_result<Function, Allocator,
804 typename result_of<Function(Args...)>::type>::completion_handler_type& h)
805 : detail::packaged_async_result<Function, Allocator,
806 typename result_of<Function(Args...)>::type>(h)
811 #else // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
813 template <typename Allocator, typename Result>
814 class async_result<use_future_t<Allocator>, Result()>
815 : public detail::promise_async_result<void(), Allocator>
818 explicit async_result(
819 typename detail::promise_async_result<
820 void(), Allocator>::completion_handler_type& h)
821 : detail::promise_async_result<void(), Allocator>(h)
826 template <typename Function, typename Allocator, typename Result>
827 class async_result<detail::packaged_token<Function, Allocator>, Result()>
828 : public detail::packaged_async_result<Function, Allocator,
829 typename result_of<Function()>::type>
832 explicit async_result(
833 typename detail::packaged_async_result<Function, Allocator,
834 typename result_of<Function()>::type>::completion_handler_type& h)
835 : detail::packaged_async_result<Function, Allocator,
836 typename result_of<Function()>::type>(h)
841 #define BOOST_ASIO_PRIVATE_ASYNC_RESULT_DEF(n) \
842 template <typename Allocator, \
843 typename Result, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
844 class async_result<use_future_t<Allocator>, \
845 Result(BOOST_ASIO_VARIADIC_TARGS(n))> \
846 : public detail::promise_async_result< \
847 void(BOOST_ASIO_VARIADIC_DECAY(n)), Allocator> \
850 explicit async_result( \
851 typename detail::promise_async_result< \
852 void(BOOST_ASIO_VARIADIC_DECAY(n)), \
853 Allocator>::completion_handler_type& h) \
854 : detail::promise_async_result< \
855 void(BOOST_ASIO_VARIADIC_DECAY(n)), Allocator>(h) \
860 template <typename Function, typename Allocator, \
861 typename Result, BOOST_ASIO_VARIADIC_TPARAMS(n)> \
862 class async_result<detail::packaged_token<Function, Allocator>, \
863 Result(BOOST_ASIO_VARIADIC_TARGS(n))> \
864 : public detail::packaged_async_result<Function, Allocator, \
865 typename result_of<Function(BOOST_ASIO_VARIADIC_TARGS(n))>::type> \
868 explicit async_result( \
869 typename detail::packaged_async_result<Function, Allocator, \
870 typename result_of<Function(BOOST_ASIO_VARIADIC_TARGS(n))>::type \
871 >::completion_handler_type& h) \
872 : detail::packaged_async_result<Function, Allocator, \
873 typename result_of<Function(BOOST_ASIO_VARIADIC_TARGS(n))>::type>(h) \
878 BOOST_ASIO_VARIADIC_GENERATE(BOOST_ASIO_PRIVATE_ASYNC_RESULT_DEF)
879 #undef BOOST_ASIO_PRIVATE_ASYNC_RESULT_DEF
881 #endif // defined(BOOST_ASIO_HAS_VARIADIC_TEMPLATES)
883 #if !defined(BOOST_ASIO_NO_DEPRECATED)
885 template <typename Allocator, typename Signature>
886 struct handler_type<use_future_t<Allocator>, Signature>
888 typedef typename async_result<use_future_t<Allocator>,
889 Signature>::completion_handler_type type;
892 template <typename Signature, typename Allocator>
893 class async_result<detail::promise_handler<Signature, Allocator> >
894 : public detail::promise_async_result<Signature, Allocator>
897 typedef typename detail::promise_async_result<
898 Signature, Allocator>::return_type type;
900 explicit async_result(
901 typename detail::promise_async_result<
902 Signature, Allocator>::completion_handler_type& h)
903 : detail::promise_async_result<Signature, Allocator>(h)
908 template <typename Function, typename Allocator, typename Signature>
909 struct handler_type<detail::packaged_token<Function, Allocator>, Signature>
911 typedef typename async_result<detail::packaged_token<Function, Allocator>,
912 Signature>::completion_handler_type type;
915 template <typename Function, typename Allocator, typename Result>
916 class async_result<detail::packaged_handler<Function, Allocator, Result> >
917 : public detail::packaged_async_result<Function, Allocator, Result>
920 typedef typename detail::packaged_async_result<
921 Function, Allocator, Result>::return_type type;
923 explicit async_result(
924 typename detail::packaged_async_result<
925 Function, Allocator, Result>::completion_handler_type& h)
926 : detail::packaged_async_result<Function, Allocator, Result>(h)
931 #endif // !defined(BOOST_ASIO_NO_DEPRECATED)
933 #endif // !defined(GENERATING_DOCUMENTATION)
938 #include <boost/asio/detail/pop_options.hpp>
940 #endif // BOOST_ASIO_IMPL_USE_FUTURE_HPP