| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 | 
							- // Copyright Takatoshi Kondo 2015
 
- //
 
- // 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_PUBLISH_HPP)
 
- #define MQTT_PUBLISH_HPP
 
- #include <cstdint>
 
- #include <ostream>
 
- #include <boost/assert.hpp>
 
- #include <mqtt/namespace.hpp>
 
- #include <mqtt/subscribe_options.hpp>
 
- namespace MQTT_NS {
 
- namespace publish {
 
- constexpr bool is_dup(std::uint8_t v) {
 
-     return (v & 0b00001000) != 0;
 
- }
 
- constexpr qos get_qos(std::uint8_t v) {
 
-     return static_cast<qos>((v & 0b00000110) >> 1);
 
- }
 
- constexpr bool is_retain(std::uint8_t v) {
 
-     return (v & 0b00000001) != 0;
 
- }
 
- constexpr void set_dup(std::uint8_t& fixed_header, bool dup) {
 
-     if (dup) fixed_header |=  0b00001000;
 
-     else     fixed_header &= static_cast<std::uint8_t>(~0b00001000);
 
- }
 
- } // namespace publish
 
- enum class retain : std::uint8_t
 
- {
 
-     yes = 0b00000001,
 
-     no = 0b00000000,
 
- };
 
- enum class dup : std::uint8_t
 
- {
 
-     yes = 0b00001000,
 
-     no = 0b00000000,
 
- };
 
- struct publish_options final {
 
-     constexpr publish_options() = default;
 
-     ~publish_options() = default;
 
-     constexpr publish_options(publish_options &&) = default;
 
-     constexpr publish_options(publish_options const&) = default;
 
-     constexpr publish_options& operator=(publish_options &&) = default;
 
-     constexpr publish_options& operator=(publish_options const&) = default;
 
-     explicit constexpr publish_options(std::uint8_t value) : data_(value) { }
 
-     constexpr publish_options(retain value) : data_(static_cast<std::uint8_t>(value)) { }
 
-     constexpr publish_options(dup value)    : data_(static_cast<std::uint8_t>(value)) { }
 
-     constexpr publish_options(qos value)    : data_(static_cast<std::uint8_t>(static_cast<std::uint8_t>(value) << 1))
 
-     {
 
-         BOOST_ASSERT(value == qos::at_most_once || value == qos::at_least_once || value == qos::exactly_once);
 
-     }
 
-     constexpr publish_options operator|(publish_options rhs) const { return publish_options(data_ | rhs.data_); }
 
-     constexpr publish_options operator|(retain rhs) const          { return *this | publish_options(rhs); }
 
-     constexpr publish_options operator|(dup rhs) const             { return *this | publish_options(rhs); }
 
-     constexpr publish_options operator|(qos rhs) const             { return *this | publish_options(rhs); }
 
-     constexpr publish_options& operator|=(publish_options rhs) { return (*this = (*this | rhs)); }
 
-     constexpr publish_options& operator|=(retain rhs)          { return (*this = (*this | rhs)); }
 
-     constexpr publish_options& operator|=(dup rhs)             { return (*this = (*this | rhs)); }
 
-     constexpr publish_options& operator|=(qos rhs)             { return (*this = (*this | rhs)); }
 
-     constexpr retain get_retain() const
 
-     { return static_cast<retain>(data_ & 0b00000001); }
 
-     constexpr dup get_dup() const
 
-     { return static_cast<dup>(data_ & 0b00001000); }
 
-     constexpr qos get_qos() const
 
-     { return static_cast<qos>((data_ & 0b00000110) >> 1); }
 
-     explicit constexpr operator std::uint8_t() const { return data_; }
 
- private:
 
-     std::uint8_t data_ = 0; // defaults to retain::no, dup::no, qos::at_most_once
 
- };
 
- constexpr publish_options operator|(retain lhs, dup rhs) { return publish_options(lhs) | rhs; }
 
- constexpr publish_options operator|(retain lhs, qos rhs) { return publish_options(lhs) | rhs; }
 
- constexpr publish_options operator|(dup lhs, retain rhs) { return publish_options(lhs) | rhs; }
 
- constexpr publish_options operator|(dup lhs, qos rhs)    { return publish_options(lhs) | rhs; }
 
- constexpr publish_options operator|(qos lhs, retain rhs) { return publish_options(lhs) | rhs; }
 
- constexpr publish_options operator|(qos lhs, dup rhs)    { return publish_options(lhs) | rhs; }
 
- constexpr char const* retain_to_str(retain v) {
 
-     switch(v) {
 
-         case retain::yes: return "yes";
 
-         case retain::no:  return "no";
 
-         default:          return "invalid_retain";
 
-     }
 
- }
 
- inline
 
- std::ostream& operator<<(std::ostream& os, retain val)
 
- {
 
-     os << retain_to_str(val);
 
-     return os;
 
- }
 
- constexpr char const* dup_to_str(dup v) {
 
-     switch(v) {
 
-         case dup::yes: return "yes";
 
-         case dup::no:  return "no";
 
-         default:       return "invalid_dup";
 
-     }
 
- }
 
- inline
 
- std::ostream& operator<<(std::ostream& os, dup val)
 
- {
 
-     os << dup_to_str(val);
 
-     return os;
 
- }
 
- } // namespace MQTT_NS
 
- #endif // MQTT_PUBLISH_HPP
 
 
  |