mqtt_cpp
publish.hpp
Go to the documentation of this file.
1 // Copyright Takatoshi Kondo 2015
2 //
3 // Distributed under the Boost Software License, Version 1.0.
4 // (See accompanying file LICENSE_1_0.txt or copy at
5 // http://www.boost.org/LICENSE_1_0.txt)
6 
7 #if !defined(MQTT_PUBLISH_HPP)
8 #define MQTT_PUBLISH_HPP
9 
10 #include <cstdint>
11 #include <ostream>
12 
13 #include <boost/assert.hpp>
14 
15 #include <mqtt/namespace.hpp>
17 
18 namespace MQTT_NS {
19 
20 namespace publish {
21 
22 constexpr bool is_dup(std::uint8_t v) {
23  return (v & 0b00001000) != 0;
24 }
25 
26 constexpr qos get_qos(std::uint8_t v) {
27  return static_cast<qos>((v & 0b00000110) >> 1);
28 }
29 
30 constexpr bool is_retain(std::uint8_t v) {
31  return (v & 0b00000001) != 0;
32 }
33 
34 constexpr void set_dup(std::uint8_t& fixed_header, bool dup) {
35  if (dup) fixed_header |= 0b00001000;
36  else fixed_header &= static_cast<std::uint8_t>(~0b00001000);
37 }
38 
39 } // namespace publish
40 
41 enum class retain : std::uint8_t
42 {
43  yes = 0b00000001,
44  no = 0b00000000,
45 };
46 
47 enum class dup : std::uint8_t
48 {
49  yes = 0b00001000,
50  no = 0b00000000,
51 };
52 
53 struct publish_options final {
54  constexpr publish_options() = default;
55  ~publish_options() = default;
56  constexpr publish_options(publish_options &&) = default;
57  constexpr publish_options(publish_options const&) = default;
58  constexpr publish_options& operator=(publish_options &&) = default;
59  constexpr publish_options& operator=(publish_options const&) = default;
60 
61  explicit constexpr publish_options(std::uint8_t value) : data_(value) { }
62 
63  constexpr publish_options(retain value) : data_(static_cast<std::uint8_t>(value)) { }
64  constexpr publish_options(dup value) : data_(static_cast<std::uint8_t>(value)) { }
65  constexpr publish_options(qos value) : data_(static_cast<std::uint8_t>(static_cast<std::uint8_t>(value) << 1))
66  {
67  BOOST_ASSERT(value == qos::at_most_once || value == qos::at_least_once || value == qos::exactly_once);
68  }
69 
70  constexpr publish_options operator|(publish_options rhs) const { return publish_options(data_ | rhs.data_); }
71  constexpr publish_options operator|(retain rhs) const { return *this | publish_options(rhs); }
72  constexpr publish_options operator|(dup rhs) const { return *this | publish_options(rhs); }
73  constexpr publish_options operator|(qos rhs) const { return *this | publish_options(rhs); }
74 
75  constexpr publish_options& operator|=(publish_options rhs) { return (*this = (*this | rhs)); }
76  constexpr publish_options& operator|=(retain rhs) { return (*this = (*this | rhs)); }
77  constexpr publish_options& operator|=(dup rhs) { return (*this = (*this | rhs)); }
78  constexpr publish_options& operator|=(qos rhs) { return (*this = (*this | rhs)); }
79 
80  constexpr retain get_retain() const
81  { return static_cast<retain>(data_ & 0b00000001); }
82  constexpr dup get_dup() const
83  { return static_cast<dup>(data_ & 0b00001000); }
84  constexpr qos get_qos() const
85  { return static_cast<qos>((data_ & 0b00000110) >> 1); }
86 
87  explicit constexpr operator std::uint8_t() const { return data_; }
88 
89 private:
90  std::uint8_t data_ = 0; // defaults to retain::no, dup::no, qos::at_most_once
91 };
92 
93 constexpr publish_options operator|(retain lhs, dup rhs) { return publish_options(lhs) | rhs; }
94 constexpr publish_options operator|(retain lhs, qos rhs) { return publish_options(lhs) | rhs; }
95 
96 constexpr publish_options operator|(dup lhs, retain rhs) { return publish_options(lhs) | rhs; }
97 constexpr publish_options operator|(dup lhs, qos rhs) { return publish_options(lhs) | rhs; }
98 
99 constexpr publish_options operator|(qos lhs, retain rhs) { return publish_options(lhs) | rhs; }
100 constexpr publish_options operator|(qos lhs, dup rhs) { return publish_options(lhs) | rhs; }
101 
102 
103 constexpr char const* retain_to_str(retain v) {
104  switch(v) {
105  case retain::yes: return "yes";
106  case retain::no: return "no";
107  default: return "invalid_retain";
108  }
109 }
110 
111 
112 inline
113 std::ostream& operator<<(std::ostream& os, retain val)
114 {
115  os << retain_to_str(val);
116  return os;
117 }
118 
119 constexpr char const* dup_to_str(dup v) {
120  switch(v) {
121  case dup::yes: return "yes";
122  case dup::no: return "no";
123  default: return "invalid_dup";
124  }
125 }
126 
127 
128 inline
129 std::ostream& operator<<(std::ostream& os, dup val)
130 {
131  os << dup_to_str(val);
132  return os;
133 }
134 
135 } // namespace MQTT_NS
136 
137 #endif // MQTT_PUBLISH_HPP
constexpr bool is_dup(std::uint8_t v)
Definition: publish.hpp:22
constexpr qos get_qos(std::uint8_t v)
Definition: publish.hpp:26
constexpr void set_dup(std::uint8_t &fixed_header, bool dup)
Definition: publish.hpp:34
constexpr bool is_retain(std::uint8_t v)
Definition: publish.hpp:30
Definition: any.hpp:27
dup
Definition: publish.hpp:48
retain
Definition: publish.hpp:42
constexpr publish_options operator|(retain lhs, dup rhs)
Definition: publish.hpp:93
std::ostream & operator<<(std::ostream &os, connect_return_code val)
Definition: connect_return_code.hpp:43
qos
Definition: subscribe_options.hpp:34
constexpr char const * retain_to_str(retain v)
Definition: publish.hpp:103
constexpr char const * dup_to_str(dup v)
Definition: publish.hpp:119
Definition: publish.hpp:53
constexpr publish_options operator|(retain rhs) const
Definition: publish.hpp:71
constexpr publish_options(publish_options &&)=default
constexpr qos get_qos() const
Definition: publish.hpp:84
constexpr publish_options(retain value)
Definition: publish.hpp:63
constexpr publish_options()=default
constexpr publish_options & operator|=(dup rhs)
Definition: publish.hpp:77
constexpr publish_options(std::uint8_t value)
Definition: publish.hpp:61
constexpr publish_options operator|(publish_options rhs) const
Definition: publish.hpp:70
constexpr publish_options(dup value)
Definition: publish.hpp:64
constexpr publish_options & operator|=(publish_options rhs)
Definition: publish.hpp:75
constexpr publish_options & operator|=(retain rhs)
Definition: publish.hpp:76
constexpr publish_options(publish_options const &)=default
constexpr publish_options operator|(qos rhs) const
Definition: publish.hpp:73
constexpr retain get_retain() const
Definition: publish.hpp:80
constexpr publish_options & operator=(publish_options &&)=default
constexpr dup get_dup() const
Definition: publish.hpp:82
constexpr publish_options & operator|=(qos rhs)
Definition: publish.hpp:78
constexpr publish_options & operator=(publish_options const &)=default
constexpr publish_options operator|(dup rhs) const
Definition: publish.hpp:72
constexpr publish_options(qos value)
Definition: publish.hpp:65