message_variant.hpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. // Copyright Takatoshi Kondo 2018
  2. //
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. #if !defined(MQTT_MESSAGE_VARIANT_HPP)
  7. #define MQTT_MESSAGE_VARIANT_HPP
  8. #include <mqtt/namespace.hpp>
  9. #include <mqtt/message.hpp>
  10. #include <mqtt/v5_message.hpp>
  11. #include <mqtt/variant.hpp>
  12. namespace MQTT_NS {
  13. // message_variant
  14. template <std::size_t PacketIdBytes>
  15. using basic_message_variant = variant<
  16. v3_1_1::connect_message,
  17. v3_1_1::connack_message,
  18. v3_1_1::basic_publish_message<PacketIdBytes>,
  19. v3_1_1::basic_puback_message<PacketIdBytes>,
  20. v3_1_1::basic_pubrec_message<PacketIdBytes>,
  21. v3_1_1::basic_pubrel_message<PacketIdBytes>,
  22. v3_1_1::basic_pubcomp_message<PacketIdBytes>,
  23. v3_1_1::basic_subscribe_message<PacketIdBytes>,
  24. v3_1_1::basic_suback_message<PacketIdBytes>,
  25. v3_1_1::basic_unsubscribe_message<PacketIdBytes>,
  26. v3_1_1::basic_unsuback_message<PacketIdBytes>,
  27. v3_1_1::pingreq_message,
  28. v3_1_1::pingresp_message,
  29. v3_1_1::disconnect_message,
  30. v5::connect_message,
  31. v5::connack_message,
  32. v5::basic_publish_message<PacketIdBytes>,
  33. v5::basic_puback_message<PacketIdBytes>,
  34. v5::basic_pubrec_message<PacketIdBytes>,
  35. v5::basic_pubrel_message<PacketIdBytes>,
  36. v5::basic_pubcomp_message<PacketIdBytes>,
  37. v5::basic_subscribe_message<PacketIdBytes>,
  38. v5::basic_suback_message<PacketIdBytes>,
  39. v5::basic_unsubscribe_message<PacketIdBytes>,
  40. v5::basic_unsuback_message<PacketIdBytes>,
  41. v5::pingreq_message,
  42. v5::pingresp_message,
  43. v5::disconnect_message,
  44. v5::auth_message
  45. >;
  46. using message_variant = basic_message_variant<2>;
  47. namespace detail {
  48. struct const_buffer_sequence_visitor {
  49. template <typename T>
  50. std::vector<as::const_buffer> operator()(T&& t) const {
  51. return t.const_buffer_sequence();
  52. }
  53. };
  54. struct size_visitor {
  55. template <typename T>
  56. std::size_t operator()(T&& t) const {
  57. return t.size();
  58. }
  59. };
  60. struct num_of_const_buffer_sequence_visitor {
  61. template <typename T>
  62. std::size_t operator()(T&& t) const {
  63. return t.num_of_const_buffer_sequence();
  64. }
  65. };
  66. struct continuous_buffer_visitor {
  67. template <typename T>
  68. std::string operator()(T&& t) const {
  69. return std::forward<T>(t).continuous_buffer();
  70. }
  71. };
  72. } // namespace detail
  73. template <std::size_t PacketIdBytes>
  74. inline std::vector<as::const_buffer> const_buffer_sequence(
  75. basic_message_variant<PacketIdBytes> const& mv) {
  76. return MQTT_NS::visit(detail::const_buffer_sequence_visitor(), mv);
  77. }
  78. template <std::size_t PacketIdBytes>
  79. inline std::size_t size(basic_message_variant<PacketIdBytes> const& mv) {
  80. return MQTT_NS::visit(detail::size_visitor(), mv);
  81. }
  82. template <std::size_t PacketIdBytes>
  83. inline std::size_t num_of_const_buffer_sequence(
  84. basic_message_variant<PacketIdBytes> const& mv) {
  85. return MQTT_NS::visit(detail::num_of_const_buffer_sequence_visitor(), mv);
  86. }
  87. template <std::size_t PacketIdBytes>
  88. inline std::string continuous_buffer(basic_message_variant<PacketIdBytes> const& mv) {
  89. return MQTT_NS::visit(detail::continuous_buffer_visitor(), mv);
  90. }
  91. // store_message_variant
  92. template <std::size_t PacketIdBytes>
  93. using basic_store_message_variant = variant<
  94. v3_1_1::basic_publish_message<PacketIdBytes>,
  95. v3_1_1::basic_pubrel_message<PacketIdBytes>,
  96. v5::basic_publish_message<PacketIdBytes>,
  97. v5::basic_pubrel_message<PacketIdBytes>
  98. >;
  99. using store_message_variant = basic_store_message_variant<2>;
  100. namespace detail {
  101. template <std::size_t PacketIdBytes>
  102. struct basic_message_variant_visitor {
  103. template <typename T>
  104. basic_message_variant<PacketIdBytes> operator()(T const& t) const {
  105. return t;
  106. }
  107. };
  108. } // detail
  109. template <std::size_t PacketIdBytes>
  110. inline
  111. basic_message_variant<PacketIdBytes> get_basic_message_variant(
  112. basic_store_message_variant<PacketIdBytes> smv) {
  113. return MQTT_NS::visit(detail::basic_message_variant_visitor<PacketIdBytes>(), smv);
  114. }
  115. template <std::size_t PacketIdBytes>
  116. inline std::string continuous_buffer(basic_store_message_variant<PacketIdBytes> const& mv) {
  117. return MQTT_NS::visit(detail::continuous_buffer_visitor(), mv);
  118. }
  119. } // namespace MQTT_NS
  120. #endif // MQTT_MESSAGE_VARIANT_HPP