deferred.hpp 4.9 KB

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