deferred.hpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. //
  2. // impl/deferred.hpp
  3. // ~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2023 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. #ifndef BOOST_ASIO_IMPL_DEFERRED_HPP
  11. #define BOOST_ASIO_IMPL_DEFERRED_HPP
  12. #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  13. # pragma once
  14. #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  15. #include <boost/asio/detail/push_options.hpp>
  16. namespace boost {
  17. namespace asio {
  18. #if !defined(GENERATING_DOCUMENTATION)
  19. template <typename Signature>
  20. class async_result<deferred_t, Signature>
  21. {
  22. public:
  23. template <typename Initiation, typename... InitArgs>
  24. static deferred_async_operation<Signature, Initiation, InitArgs...>
  25. initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
  26. deferred_t, BOOST_ASIO_MOVE_ARG(InitArgs)... args)
  27. {
  28. return deferred_async_operation<
  29. Signature, Initiation, InitArgs...>(
  30. deferred_init_tag{},
  31. BOOST_ASIO_MOVE_CAST(Initiation)(initiation),
  32. BOOST_ASIO_MOVE_CAST(InitArgs)(args)...);
  33. }
  34. };
  35. template <typename... Signatures>
  36. class async_result<deferred_t, Signatures...>
  37. {
  38. public:
  39. template <typename Initiation, typename... InitArgs>
  40. static deferred_async_operation<
  41. deferred_signatures<Signatures...>, Initiation, InitArgs...>
  42. initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
  43. deferred_t, BOOST_ASIO_MOVE_ARG(InitArgs)... args)
  44. {
  45. return deferred_async_operation<
  46. deferred_signatures<Signatures...>, Initiation, InitArgs...>(
  47. deferred_init_tag{},
  48. BOOST_ASIO_MOVE_CAST(Initiation)(initiation),
  49. BOOST_ASIO_MOVE_CAST(InitArgs)(args)...);
  50. }
  51. };
  52. template <typename Function, typename Signature>
  53. class async_result<deferred_function<Function>, Signature>
  54. {
  55. public:
  56. template <typename Initiation, typename... InitArgs>
  57. static auto initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
  58. deferred_function<Function> token,
  59. BOOST_ASIO_MOVE_ARG(InitArgs)... init_args)
  60. -> decltype(
  61. deferred_sequence<
  62. deferred_async_operation<
  63. Signature, Initiation, InitArgs...>,
  64. Function>(deferred_init_tag{},
  65. deferred_async_operation<
  66. Signature, Initiation, InitArgs...>(
  67. deferred_init_tag{},
  68. BOOST_ASIO_MOVE_CAST(Initiation)(initiation),
  69. BOOST_ASIO_MOVE_CAST(InitArgs)(init_args)...),
  70. BOOST_ASIO_MOVE_CAST(Function)(token.function_)))
  71. {
  72. return deferred_sequence<
  73. deferred_async_operation<
  74. Signature, Initiation, InitArgs...>,
  75. Function>(deferred_init_tag{},
  76. deferred_async_operation<
  77. Signature, Initiation, InitArgs...>(
  78. deferred_init_tag{},
  79. BOOST_ASIO_MOVE_CAST(Initiation)(initiation),
  80. BOOST_ASIO_MOVE_CAST(InitArgs)(init_args)...),
  81. BOOST_ASIO_MOVE_CAST(Function)(token.function_));
  82. }
  83. };
  84. template <typename Function, typename... Signatures>
  85. class async_result<deferred_function<Function>, Signatures...>
  86. {
  87. public:
  88. template <typename Initiation, typename... InitArgs>
  89. static auto initiate(BOOST_ASIO_MOVE_ARG(Initiation) initiation,
  90. deferred_function<Function> token,
  91. BOOST_ASIO_MOVE_ARG(InitArgs)... init_args)
  92. -> decltype(
  93. deferred_sequence<
  94. deferred_async_operation<
  95. deferred_signatures<Signatures...>, Initiation, InitArgs...>,
  96. Function>(deferred_init_tag{},
  97. deferred_async_operation<
  98. deferred_signatures<Signatures...>, Initiation, InitArgs...>(
  99. deferred_init_tag{},
  100. BOOST_ASIO_MOVE_CAST(Initiation)(initiation),
  101. BOOST_ASIO_MOVE_CAST(InitArgs)(init_args)...),
  102. BOOST_ASIO_MOVE_CAST(Function)(token.function_)))
  103. {
  104. return deferred_sequence<
  105. deferred_async_operation<
  106. deferred_signatures<Signatures...>, Initiation, InitArgs...>,
  107. Function>(deferred_init_tag{},
  108. deferred_async_operation<
  109. deferred_signatures<Signatures...>, Initiation, InitArgs...>(
  110. deferred_init_tag{},
  111. BOOST_ASIO_MOVE_CAST(Initiation)(initiation),
  112. BOOST_ASIO_MOVE_CAST(InitArgs)(init_args)...),
  113. BOOST_ASIO_MOVE_CAST(Function)(token.function_));
  114. }
  115. };
  116. template <template <typename, typename> class Associator,
  117. typename Handler, typename Tail, typename DefaultCandidate>
  118. struct associator<Associator,
  119. detail::deferred_sequence_handler<Handler, Tail>,
  120. DefaultCandidate>
  121. : Associator<Handler, DefaultCandidate>
  122. {
  123. static typename Associator<Handler, DefaultCandidate>::type
  124. get(const detail::deferred_sequence_handler<Handler, Tail>& h)
  125. BOOST_ASIO_NOEXCEPT
  126. {
  127. return Associator<Handler, DefaultCandidate>::get(h.handler_);
  128. }
  129. static BOOST_ASIO_AUTO_RETURN_TYPE_PREFIX2(
  130. typename Associator<Handler, DefaultCandidate>::type)
  131. get(const detail::deferred_sequence_handler<Handler, Tail>& h,
  132. const DefaultCandidate& c) BOOST_ASIO_NOEXCEPT
  133. BOOST_ASIO_AUTO_RETURN_TYPE_SUFFIX((
  134. Associator<Handler, DefaultCandidate>::get(h.handler_, c)))
  135. {
  136. return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
  137. }
  138. };
  139. #endif // !defined(GENERATING_DOCUMENTATION)
  140. } // namespace asio
  141. } // namespace boost
  142. #include <boost/asio/detail/pop_options.hpp>
  143. #endif // BOOST_ASIO_IMPL_DEFERRED_HPP