channel_payload.hpp 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. //
  2. // experimental/detail/channel_payload.hpp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2022 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_EXPERIMENTAL_DETAIL_CHANNEL_PAYLOAD_HPP
  11. #define ASIO_EXPERIMENTAL_DETAIL_CHANNEL_PAYLOAD_HPP
  12. #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  13. # pragma once
  14. #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  15. #include "asio/detail/config.hpp"
  16. #include <variant>
  17. #include "asio/detail/type_traits.hpp"
  18. #include "asio/experimental/detail/channel_message.hpp"
  19. #include "asio/detail/push_options.hpp"
  20. namespace asio {
  21. namespace experimental {
  22. namespace detail {
  23. template <typename... Signatures>
  24. class channel_payload
  25. {
  26. public:
  27. template <typename Signature>
  28. channel_payload(ASIO_MOVE_ARG(channel_message<Signature>) m)
  29. : message_(ASIO_MOVE_CAST(channel_message<Signature>)(m))
  30. {
  31. }
  32. template <typename Handler>
  33. void receive(Handler& handler)
  34. {
  35. std::visit(
  36. [&](auto& message)
  37. {
  38. message.receive(handler);
  39. }, message_);
  40. }
  41. private:
  42. std::variant<channel_message<Signatures>...> message_;
  43. };
  44. template <typename R>
  45. class channel_payload<R()>
  46. {
  47. public:
  48. explicit channel_payload(channel_message<R()>)
  49. {
  50. }
  51. template <typename Handler>
  52. void receive(Handler& handler)
  53. {
  54. ASIO_MOVE_OR_LVALUE(Handler)(handler)();
  55. }
  56. };
  57. template <typename Signature>
  58. class channel_payload<Signature>
  59. {
  60. public:
  61. channel_payload(ASIO_MOVE_ARG(channel_message<Signature>) m)
  62. : message_(ASIO_MOVE_CAST(channel_message<Signature>)(m))
  63. {
  64. }
  65. template <typename Handler>
  66. void receive(Handler& handler)
  67. {
  68. message_.receive(handler);
  69. }
  70. private:
  71. channel_message<Signature> message_;
  72. };
  73. } // namespace detail
  74. } // namespace experimental
  75. } // namespace asio
  76. #include "asio/detail/pop_options.hpp"
  77. #endif // ASIO_EXPERIMENTAL_DETAIL_CHANNEL_PAYLOAD_HPP