| 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_variant
 
- using 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 property
 
- inline 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>
 
- inline
 
- std::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>
 
- inline
 
- std::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>
 
- inline
 
- std::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>
 
- inline
 
- void
 
- visit_prop(property_variant const& prop, Visitors&&... visitors) {
 
-     MQTT_NS::visit(
 
-         make_lambda_visitor(std::forward<Visitors>(visitors)...), prop
 
-     );
 
- }
 
- template <typename... Visitors>
 
- inline
 
- void
 
- visit_props(properties const& props, Visitors&&... visitors) {
 
-     for (auto const& prop : props) {
 
-         visit_prop(
 
-             prop,
 
-             std::forward<Visitors>(visitors)...
 
-         );
 
-     }
 
- }
 
- template <typename... Visitors>
 
- inline
 
- void
 
- visit_prop(property_variant&& prop, Visitors&&... visitors) {
 
-     MQTT_NS::visit(
 
-         make_lambda_visitor(std::forward<Visitors>(visitors)...), force_move(prop)
 
-     );
 
- }
 
- template <typename... Visitors>
 
- inline
 
- void
 
- visit_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
 
 
  |