consign.hpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. //
  2. // impl/consign.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_CONSIGN_HPP
  11. #define BOOST_ASIO_IMPL_CONSIGN_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/config.hpp>
  16. #include <boost/asio/associator.hpp>
  17. #include <boost/asio/async_result.hpp>
  18. #include <boost/asio/detail/handler_cont_helpers.hpp>
  19. #include <boost/asio/detail/initiation_base.hpp>
  20. #include <boost/asio/detail/type_traits.hpp>
  21. #include <boost/asio/detail/utility.hpp>
  22. #include <boost/asio/detail/push_options.hpp>
  23. namespace boost {
  24. namespace asio {
  25. namespace detail {
  26. // Class to adapt a consign_t as a completion handler.
  27. template <typename Handler, typename... Values>
  28. class consign_handler
  29. {
  30. public:
  31. typedef void result_type;
  32. template <typename H>
  33. consign_handler(H&& handler, std::tuple<Values...> values)
  34. : handler_(static_cast<H&&>(handler)),
  35. values_(static_cast<std::tuple<Values...>&&>(values))
  36. {
  37. }
  38. template <typename... Args>
  39. void operator()(Args&&... args)
  40. {
  41. static_cast<Handler&&>(handler_)(static_cast<Args&&>(args)...);
  42. }
  43. //private:
  44. Handler handler_;
  45. std::tuple<Values...> values_;
  46. };
  47. template <typename Handler>
  48. inline bool asio_handler_is_continuation(
  49. consign_handler<Handler>* this_handler)
  50. {
  51. return boost_asio_handler_cont_helpers::is_continuation(
  52. this_handler->handler_);
  53. }
  54. } // namespace detail
  55. #if !defined(GENERATING_DOCUMENTATION)
  56. template <typename CompletionToken, typename... Values, typename... Signatures>
  57. struct async_result<consign_t<CompletionToken, Values...>, Signatures...>
  58. : async_result<CompletionToken, Signatures...>
  59. {
  60. template <typename Initiation>
  61. struct init_wrapper : detail::initiation_base<Initiation>
  62. {
  63. using detail::initiation_base<Initiation>::initiation_base;
  64. template <typename Handler, typename... Args>
  65. void operator()(Handler&& handler,
  66. std::tuple<Values...> values, Args&&... args) &&
  67. {
  68. static_cast<Initiation&&>(*this)(
  69. detail::consign_handler<decay_t<Handler>, Values...>(
  70. static_cast<Handler&&>(handler),
  71. static_cast<std::tuple<Values...>&&>(values)),
  72. static_cast<Args&&>(args)...);
  73. }
  74. template <typename Handler, typename... Args>
  75. void operator()(Handler&& handler,
  76. std::tuple<Values...> values, Args&&... args) const &
  77. {
  78. static_cast<const Initiation&>(*this)(
  79. detail::consign_handler<decay_t<Handler>, Values...>(
  80. static_cast<Handler&&>(handler),
  81. static_cast<std::tuple<Values...>&&>(values)),
  82. static_cast<Args&&>(args)...);
  83. }
  84. };
  85. template <typename Initiation, typename RawCompletionToken, typename... Args>
  86. static auto initiate(Initiation&& initiation,
  87. RawCompletionToken&& token, Args&&... args)
  88. -> decltype(
  89. async_initiate<CompletionToken, Signatures...>(
  90. init_wrapper<decay_t<Initiation>>(
  91. static_cast<Initiation&&>(initiation)),
  92. token.token_, static_cast<std::tuple<Values...>&&>(token.values_),
  93. static_cast<Args&&>(args)...))
  94. {
  95. return async_initiate<CompletionToken, Signatures...>(
  96. init_wrapper<decay_t<Initiation>>(
  97. static_cast<Initiation&&>(initiation)),
  98. token.token_, static_cast<std::tuple<Values...>&&>(token.values_),
  99. static_cast<Args&&>(args)...);
  100. }
  101. };
  102. template <template <typename, typename> class Associator,
  103. typename Handler, typename... Values, typename DefaultCandidate>
  104. struct associator<Associator,
  105. detail::consign_handler<Handler, Values...>, DefaultCandidate>
  106. : Associator<Handler, DefaultCandidate>
  107. {
  108. static typename Associator<Handler, DefaultCandidate>::type get(
  109. const detail::consign_handler<Handler, Values...>& h) noexcept
  110. {
  111. return Associator<Handler, DefaultCandidate>::get(h.handler_);
  112. }
  113. static auto get(const detail::consign_handler<Handler, Values...>& h,
  114. const DefaultCandidate& c) noexcept
  115. -> decltype(Associator<Handler, DefaultCandidate>::get(h.handler_, c))
  116. {
  117. return Associator<Handler, DefaultCandidate>::get(h.handler_, c);
  118. }
  119. };
  120. #endif // !defined(GENERATING_DOCUMENTATION)
  121. } // namespace asio
  122. } // namespace boost
  123. #include <boost/asio/detail/pop_options.hpp>
  124. #endif // BOOST_ASIO_IMPL_CONSIGN_HPP