| 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 publishenum 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";    }}inlinestd::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";    }}inlinestd::ostream& operator<<(std::ostream& os, dup val){    os << dup_to_str(val);    return os;}} // namespace MQTT_NS#endif // MQTT_PUBLISH_HPP
 |