async_mqtt 9.0.1
Loading...
Searching...
No Matches
pubopts.hpp
1// Copyright Takatoshi Kondo 2022
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(ASYNC_MQTT_PACKET_PUBOPTS_HPP)
8#define ASYNC_MQTT_PACKET_PUBOPTS_HPP
9
10#include <boost/assert.hpp>
11
12#include <async_mqtt/packet/qos.hpp>
13
20namespace async_mqtt {
21
22namespace pub {
23
36constexpr bool is_dup(std::uint8_t v) {
37 return (v & 0b00001000) != 0;
38}
39
52constexpr qos get_qos(std::uint8_t v) {
53 return static_cast<qos>((v & 0b00000110) >> 1);
54}
55
68constexpr bool is_retain(std::uint8_t v) {
69 return (v & 0b00000001) != 0;
70}
71
84constexpr void set_dup(std::uint8_t& fixed_header, bool dup) {
85 if (dup) fixed_header |= 0b00001000;
86 else fixed_header &= static_cast<std::uint8_t>(~0b00001000);
87}
88
100enum class retain : std::uint8_t {
101 yes = 0b00000001,
102 no = 0b00000000,
103};
104
105
117enum class dup : std::uint8_t {
118 yes = 0b00001000,
119 no = 0b00000000,
120};
121
136struct opts final {
137 constexpr opts() = default;
138 ~opts() = default;
139 constexpr opts(opts &&) = default;
140 constexpr opts(opts const&) = default;
141 constexpr opts& operator=(opts &&) = default;
142 constexpr opts& operator=(opts const&) = default;
143
148 explicit constexpr opts(std::uint8_t value) : data_(value) { }
149
154 constexpr opts(retain value) : data_(static_cast<std::uint8_t>(value)) { }
155
160 constexpr opts(dup value) : data_(static_cast<std::uint8_t>(value)) { }
161
166 constexpr opts(qos value) : data_(static_cast<std::uint8_t>(static_cast<std::uint8_t>(value) << 1))
167 {
168 BOOST_ASSERT(value == qos::at_most_once || value == qos::at_least_once || value == qos::exactly_once);
169 }
170
176 constexpr opts operator|(opts rhs) const { return opts(data_ | rhs.data_); }
177
183 constexpr opts operator|(retain rhs) const { return *this | opts(rhs); }
184
190 constexpr opts operator|(dup rhs) const { return *this | opts(rhs); }
191
197 constexpr opts operator|(qos rhs) const { return *this | opts(rhs); }
198
204 constexpr opts& operator|=(opts rhs) { return (*this = (*this | rhs)); }
205
211 constexpr opts& operator|=(retain rhs) { return (*this = (*this | rhs)); }
212
218 constexpr opts& operator|=(dup rhs) { return (*this = (*this | rhs)); }
219
225 constexpr opts& operator|=(qos rhs) { return (*this = (*this | rhs)); }
226
232 constexpr retain get_retain() const
233 { return static_cast<enum retain>(data_ & 0b00000001); }
234
240 constexpr dup get_dup() const
241 { return static_cast<enum dup>(data_ & 0b00001000); }
242
248 constexpr qos get_qos() const
249 { return static_cast<enum qos>((data_ & 0b00000110) >> 1); }
250
256 explicit constexpr operator std::uint8_t() const { return data_; }
257
263 constexpr bool operator==(opts rhs) const { return data_ == rhs.data_; }
264
270 constexpr bool operator<(opts rhs) const { return data_ < rhs.data_; }
271
272private:
273 std::uint8_t data_ = 0; // defaults to retain::no, dup::no, qos::at_most_once
274};
275
288constexpr opts operator|(retain lhs, dup rhs) { return opts(lhs) | rhs; }
289
302constexpr opts operator|(retain lhs, qos rhs) { return opts(lhs) | rhs; }
303
316constexpr opts operator|(dup lhs, retain rhs) { return opts(lhs) | rhs; }
317
330constexpr opts operator|(dup lhs, qos rhs) { return opts(lhs) | rhs; }
331
344constexpr opts operator|(qos lhs, retain rhs) { return opts(lhs) | rhs; }
345
358constexpr opts operator|(qos lhs, dup rhs) { return opts(lhs) | rhs; }
359
360
373constexpr char const* retain_to_str(retain v) {
374 switch(v) {
375 case retain::yes: return "yes";
376 case retain::no: return "no";
377 default: return "invalid_retain";
378 }
379}
380
394inline
395std::ostream& operator<<(std::ostream& o, retain v)
396{
397 o << retain_to_str(v);
398 return o;
399}
400
413constexpr char const* dup_to_str(dup v) {
414 switch(v) {
415 case dup::yes: return "yes";
416 case dup::no: return "no";
417 default: return "invalid_dup";
418 }
419}
420
434inline
435std::ostream& operator<<(std::ostream& o, dup v)
436{
437 o << dup_to_str(v);
438 return o;
439}
440
441} // namespace pub
442
443} // namespace async_mqtt
444
445#endif // ASYNC_MQTT_PACKET_PUBOPTS_HPP
constexpr char const * dup_to_str(dup v)
stringize dup
Definition pubopts.hpp:413
constexpr qos get_qos(std::uint8_t v)
Get qos from the fixed header.
Definition pubopts.hpp:52
constexpr char const * retain_to_str(retain v)
stringize retain
Definition pubopts.hpp:373
constexpr void set_dup(std::uint8_t &fixed_header, bool dup)
Set DUP to the fixed header.
Definition pubopts.hpp:84
constexpr bool is_retain(std::uint8_t v)
Check fixed header is RETAIN.
Definition pubopts.hpp:68
std::ostream & operator<<(std::ostream &o, dup v)
output to the stream
Definition pubopts.hpp:435
retain
MQTT RETAIN.
Definition pubopts.hpp:100
std::ostream & operator<<(std::ostream &o, retain v)
output to the stream
Definition pubopts.hpp:395
dup
MQTT DUP.
Definition pubopts.hpp:117
constexpr bool is_dup(std::uint8_t v)
Check fixed header is DUP.
Definition pubopts.hpp:36
@ no
No Duplicated.
qos
MQTT QoS.
Definition qos.hpp:35
@ exactly_once
Exactly once delivery.
@ at_most_once
At most once delivery.
@ at_least_once
At least once delivery.
MQTT PublishOptions.
Definition pubopts.hpp:136
constexpr operator std::uint8_t() const
Get byte image.
Definition pubopts.hpp:256
constexpr opts operator|(dup lhs, retain rhs)
Combine opts operator.
Definition pubopts.hpp:316
constexpr opts(std::uint8_t value)
constructor
Definition pubopts.hpp:148
constexpr opts(dup value)
constructor
Definition pubopts.hpp:160
constexpr opts & operator|=(retain rhs)
Combine opts operator.
Definition pubopts.hpp:211
constexpr bool operator==(opts rhs) const
equal operator
Definition pubopts.hpp:263
constexpr opts operator|(qos lhs, retain rhs)
Combine opts operator.
Definition pubopts.hpp:344
constexpr dup get_dup() const
Get dup.
Definition pubopts.hpp:240
constexpr bool operator<(opts rhs) const
less than operator
Definition pubopts.hpp:270
constexpr opts operator|(dup lhs, qos rhs)
Combine opts operator.
Definition pubopts.hpp:330
constexpr retain get_retain() const
Get retain.
Definition pubopts.hpp:232
constexpr qos get_qos() const
Get qos.
Definition pubopts.hpp:248
constexpr opts & operator|=(qos rhs)
Combine opts operator.
Definition pubopts.hpp:225
constexpr opts operator|(opts rhs) const
Combine opts operator.
Definition pubopts.hpp:176
constexpr opts & operator|=(dup rhs)
Combine opts operator.
Definition pubopts.hpp:218
constexpr opts(retain value)
constructor
Definition pubopts.hpp:154
constexpr opts operator|(qos rhs) const
Combine opts operator.
Definition pubopts.hpp:197
constexpr opts operator|(retain lhs, dup rhs)
Combine opts operator.
Definition pubopts.hpp:288
constexpr opts operator|(qos lhs, dup rhs)
Combine opts operator.
Definition pubopts.hpp:358
constexpr opts operator|(retain lhs, qos rhs)
Combine opts operator.
Definition pubopts.hpp:302
constexpr opts(qos value)
constructor
Definition pubopts.hpp:166
constexpr opts operator|(dup rhs) const
Combine opts operator.
Definition pubopts.hpp:190
constexpr opts operator|(retain rhs) const
Combine opts operator.
Definition pubopts.hpp:183
constexpr opts & operator|=(opts rhs)
Combine opts operator.
Definition pubopts.hpp:204