// 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 #include #include #include namespace MQTT_NS { // message_variant template using basic_message_variant = variant< v3_1_1::connect_message, v3_1_1::connack_message, v3_1_1::basic_publish_message, v3_1_1::basic_puback_message, v3_1_1::basic_pubrec_message, v3_1_1::basic_pubrel_message, v3_1_1::basic_pubcomp_message, v3_1_1::basic_subscribe_message, v3_1_1::basic_suback_message, v3_1_1::basic_unsubscribe_message, v3_1_1::basic_unsuback_message, 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, v5::basic_puback_message, v5::basic_pubrec_message, v5::basic_pubrel_message, v5::basic_pubcomp_message, v5::basic_subscribe_message, v5::basic_suback_message, v5::basic_unsubscribe_message, v5::basic_unsuback_message, 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 std::vector operator()(T&& t) const { return t.const_buffer_sequence(); } }; struct size_visitor { template std::size_t operator()(T&& t) const { return t.size(); } }; struct num_of_const_buffer_sequence_visitor { template std::size_t operator()(T&& t) const { return t.num_of_const_buffer_sequence(); } }; struct continuous_buffer_visitor { template std::string operator()(T&& t) const { return std::forward(t).continuous_buffer(); } }; } // namespace detail template inline std::vector const_buffer_sequence( basic_message_variant const& mv) { return MQTT_NS::visit(detail::const_buffer_sequence_visitor(), mv); } template inline std::size_t size(basic_message_variant const& mv) { return MQTT_NS::visit(detail::size_visitor(), mv); } template inline std::size_t num_of_const_buffer_sequence( basic_message_variant const& mv) { return MQTT_NS::visit(detail::num_of_const_buffer_sequence_visitor(), mv); } template inline std::string continuous_buffer(basic_message_variant const& mv) { return MQTT_NS::visit(detail::continuous_buffer_visitor(), mv); } // store_message_variant template using basic_store_message_variant = variant< v3_1_1::basic_publish_message, v3_1_1::basic_pubrel_message, v5::basic_publish_message, v5::basic_pubrel_message >; using store_message_variant = basic_store_message_variant<2>; namespace detail { template struct basic_message_variant_visitor { template basic_message_variant operator()(T const& t) const { return t; } }; } // detail template inline basic_message_variant get_basic_message_variant( basic_store_message_variant smv) { return MQTT_NS::visit(detail::basic_message_variant_visitor(), smv); } template inline std::string continuous_buffer(basic_store_message_variant const& mv) { return MQTT_NS::visit(detail::continuous_buffer_visitor(), mv); } } // namespace MQTT_NS #endif // MQTT_MESSAGE_VARIANT_HPP