| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 | // 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_PROPERTY_VARIANT_HPP)#define MQTT_PROPERTY_VARIANT_HPP#include <vector>#include <mqtt/namespace.hpp>#include <mqtt/property.hpp>#include <mqtt/variant.hpp>#include <mqtt/visitor_util.hpp>namespace MQTT_NS {namespace v5 {//  property_variantusing property_variant = variant<    property::payload_format_indicator,    property::message_expiry_interval,    property::content_type,    property::response_topic,    property::correlation_data,    property::subscription_identifier,    property::session_expiry_interval,    property::assigned_client_identifier,    property::server_keep_alive,    property::authentication_method,    property::authentication_data,    property::request_problem_information,    property::will_delay_interval,    property::request_response_information,    property::response_information,    property::server_reference,    property::reason_string,    property::receive_maximum,    property::topic_alias_maximum,    property::topic_alias,    property::maximum_qos,    property::retain_available,    property::user_property,    property::maximum_packet_size,    property::wildcard_subscription_available,    property::subscription_identifier_available,    property::shared_subscription_available>;using properties = std::vector<property_variant>;namespace property {namespace detail {struct add_const_buffer_sequence_visitor {    add_const_buffer_sequence_visitor(std::vector<as::const_buffer>& v):v(v) {}    template <typename T>    void operator()(T&& t) const {        t.add_const_buffer_sequence(v);    }    std::vector<as::const_buffer>& v;};struct id_visitor {    template <typename T>    id operator()(T const& t) const {        return t.id();    }};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();    }};template <typename Iterator>struct fill_visitor {    fill_visitor(Iterator b, Iterator e):b(b), e(e) {}    template <typename T>    void operator()(T&& t) const {        t.fill(b, e);    }    Iterator b;    Iterator e;};template <typename Iterator>inline fill_visitor<Iterator> make_fill_visitor(Iterator b, Iterator e) {    return fill_visitor<Iterator>(b, e);}} // namespace detail} // namespace propertyinline void add_const_buffer_sequence(std::vector<as::const_buffer>& v, property_variant const& pv) {    MQTT_NS::visit(property::detail::add_const_buffer_sequence_visitor(v), pv);}inline property::id id(property_variant const& pv) {    return MQTT_NS::visit(property::detail::id_visitor(), pv);}inline std::size_t size(property_variant const& pv) {    return MQTT_NS::visit(property::detail::size_visitor(), pv);}inline std::size_t num_of_const_buffer_sequence(property_variant const& pv) {    return MQTT_NS::visit(property::detail::num_of_const_buffer_sequence_visitor(), pv);}template <typename Iterator>inline void fill(property_variant const& pv, Iterator b, Iterator e) {    auto vis = property::detail::make_fill_visitor(b, e);    MQTT_NS::visit(vis, pv);}struct less_than_visitor {    template <typename T>    bool operator()(T const& lhs, T const& rhs) const {        return lhs < rhs;    }    template <typename T, typename U>    bool operator()(T const& lhs, U const& rhs) const {        return lhs.id() < rhs.id();    }};template <typename PropertyVariant>inlinestd::enable_if_t<    std::is_same<PropertyVariant, property_variant>::value,    bool>operator<(PropertyVariant const& lhs, PropertyVariant const& rhs) {    return MQTT_NS::visit(        less_than_visitor(),        lhs,        rhs    );}struct equal_visitor {    template <typename T>    bool operator()(T const& lhs, T const& rhs) const {        return lhs == rhs;    }    template <typename T, typename U>    bool operator()(T const&, U const&) const {        return false;    }};template <typename PropertyVariant>inlinestd::enable_if_t<    std::is_same<PropertyVariant, property_variant>::value,    bool>operator==(PropertyVariant const& lhs, PropertyVariant const& rhs) {    return MQTT_NS::visit(        equal_visitor(),        lhs,        rhs    );}template <typename PropertyVariant>inlinestd::enable_if_t<    std::is_same<PropertyVariant, property_variant>::value,    bool>operator!=(PropertyVariant const& lhs, PropertyVariant const& rhs) {    return !MQTT_NS::visit(        equal_visitor(),        lhs,        rhs    );}template <typename... Visitors>inlinevoidvisit_prop(property_variant const& prop, Visitors&&... visitors) {    MQTT_NS::visit(        make_lambda_visitor(std::forward<Visitors>(visitors)...), prop    );}template <typename... Visitors>inlinevoidvisit_props(properties const& props, Visitors&&... visitors) {    for (auto const& prop : props) {        visit_prop(            prop,            std::forward<Visitors>(visitors)...        );    }}template <typename... Visitors>inlinevoidvisit_prop(property_variant&& prop, Visitors&&... visitors) {    MQTT_NS::visit(        make_lambda_visitor(std::forward<Visitors>(visitors)...), force_move(prop)    );}template <typename... Visitors>inlinevoidvisit_props(properties&& props, Visitors&&... visitors) {    for (auto&& prop : force_move(props)) {        visit_prop(            force_move(prop),            std::forward<Visitors>(visitors)...        );    }}} // namespace v5} // namespace MQTT_NS#endif // MQTT_PROPERTY_VARIANT_HPP
 |