123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- // Copyright Takatoshi Kondo 2018
- //
- // Distributed under the Boost Software License, Version 1.0.
- // (See accompanying file LICENSE_1_0.txt or copy at
- // http://www.boost.org/LICENSE_1_0.txt)
- #if !defined(MQTT_MESSAGE_VARIANT_HPP)
- #define MQTT_MESSAGE_VARIANT_HPP
- #include <mqtt/namespace.hpp>
- #include <mqtt/message.hpp>
- #include <mqtt/v5_message.hpp>
- #include <mqtt/variant.hpp>
- namespace MQTT_NS {
- // message_variant
- template <std::size_t PacketIdBytes>
- using basic_message_variant = variant<
- v3_1_1::connect_message,
- v3_1_1::connack_message,
- v3_1_1::basic_publish_message<PacketIdBytes>,
- v3_1_1::basic_puback_message<PacketIdBytes>,
- v3_1_1::basic_pubrec_message<PacketIdBytes>,
- v3_1_1::basic_pubrel_message<PacketIdBytes>,
- v3_1_1::basic_pubcomp_message<PacketIdBytes>,
- v3_1_1::basic_subscribe_message<PacketIdBytes>,
- v3_1_1::basic_suback_message<PacketIdBytes>,
- v3_1_1::basic_unsubscribe_message<PacketIdBytes>,
- v3_1_1::basic_unsuback_message<PacketIdBytes>,
- v3_1_1::pingreq_message,
- v3_1_1::pingresp_message,
- v3_1_1::disconnect_message,
- v5::connect_message,
- v5::connack_message,
- v5::basic_publish_message<PacketIdBytes>,
- v5::basic_puback_message<PacketIdBytes>,
- v5::basic_pubrec_message<PacketIdBytes>,
- v5::basic_pubrel_message<PacketIdBytes>,
- v5::basic_pubcomp_message<PacketIdBytes>,
- v5::basic_subscribe_message<PacketIdBytes>,
- v5::basic_suback_message<PacketIdBytes>,
- v5::basic_unsubscribe_message<PacketIdBytes>,
- v5::basic_unsuback_message<PacketIdBytes>,
- v5::pingreq_message,
- v5::pingresp_message,
- v5::disconnect_message,
- v5::auth_message
- >;
- using message_variant = basic_message_variant<2>;
- namespace detail {
- struct const_buffer_sequence_visitor {
- template <typename T>
- std::vector<as::const_buffer> operator()(T&& t) const {
- return t.const_buffer_sequence();
- }
- };
- struct size_visitor {
- template <typename T>
- std::size_t operator()(T&& t) const {
- return t.size();
- }
- };
- struct num_of_const_buffer_sequence_visitor {
- template <typename T>
- std::size_t operator()(T&& t) const {
- return t.num_of_const_buffer_sequence();
- }
- };
- struct continuous_buffer_visitor {
- template <typename T>
- std::string operator()(T&& t) const {
- return std::forward<T>(t).continuous_buffer();
- }
- };
- } // namespace detail
- template <std::size_t PacketIdBytes>
- inline std::vector<as::const_buffer> const_buffer_sequence(
- basic_message_variant<PacketIdBytes> const& mv) {
- return MQTT_NS::visit(detail::const_buffer_sequence_visitor(), mv);
- }
- template <std::size_t PacketIdBytes>
- inline std::size_t size(basic_message_variant<PacketIdBytes> const& mv) {
- return MQTT_NS::visit(detail::size_visitor(), mv);
- }
- template <std::size_t PacketIdBytes>
- inline std::size_t num_of_const_buffer_sequence(
- basic_message_variant<PacketIdBytes> const& mv) {
- return MQTT_NS::visit(detail::num_of_const_buffer_sequence_visitor(), mv);
- }
- template <std::size_t PacketIdBytes>
- inline std::string continuous_buffer(basic_message_variant<PacketIdBytes> const& mv) {
- return MQTT_NS::visit(detail::continuous_buffer_visitor(), mv);
- }
- // store_message_variant
- template <std::size_t PacketIdBytes>
- using basic_store_message_variant = variant<
- v3_1_1::basic_publish_message<PacketIdBytes>,
- v3_1_1::basic_pubrel_message<PacketIdBytes>,
- v5::basic_publish_message<PacketIdBytes>,
- v5::basic_pubrel_message<PacketIdBytes>
- >;
- using store_message_variant = basic_store_message_variant<2>;
- namespace detail {
- template <std::size_t PacketIdBytes>
- struct basic_message_variant_visitor {
- template <typename T>
- basic_message_variant<PacketIdBytes> operator()(T const& t) const {
- return t;
- }
- };
- } // detail
- template <std::size_t PacketIdBytes>
- inline
- basic_message_variant<PacketIdBytes> get_basic_message_variant(
- basic_store_message_variant<PacketIdBytes> smv) {
- return MQTT_NS::visit(detail::basic_message_variant_visitor<PacketIdBytes>(), smv);
- }
- template <std::size_t PacketIdBytes>
- inline std::string continuous_buffer(basic_store_message_variant<PacketIdBytes> const& mv) {
- return MQTT_NS::visit(detail::continuous_buffer_visitor(), mv);
- }
- } // namespace MQTT_NS
- #endif // MQTT_MESSAGE_VARIANT_HPP
|