deferred.hpp 4.9 KB

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