publish.hpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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. #if !defined(MQTT_PUBLISH_HPP)
  7. #define MQTT_PUBLISH_HPP
  8. #include <cstdint>
  9. #include <ostream>
  10. #include <boost/assert.hpp>
  11. #include <mqtt/namespace.hpp>
  12. #include <mqtt/subscribe_options.hpp>
  13. namespace MQTT_NS {
  14. namespace publish {
  15. constexpr bool is_dup(std::uint8_t v) {
  16. return (v & 0b00001000) != 0;
  17. }
  18. constexpr qos get_qos(std::uint8_t v) {
  19. return static_cast<qos>((v & 0b00000110) >> 1);
  20. }
  21. constexpr bool is_retain(std::uint8_t v) {
  22. return (v & 0b00000001) != 0;
  23. }
  24. constexpr void set_dup(std::uint8_t& fixed_header, bool dup) {
  25. if (dup) fixed_header |= 0b00001000;
  26. else fixed_header &= static_cast<std::uint8_t>(~0b00001000);
  27. }
  28. } // namespace publish
  29. enum class retain : std::uint8_t
  30. {
  31. yes = 0b00000001,
  32. no = 0b00000000,
  33. };
  34. enum class dup : std::uint8_t
  35. {
  36. yes = 0b00001000,
  37. no = 0b00000000,
  38. };
  39. struct publish_options final {
  40. constexpr publish_options() = default;
  41. ~publish_options() = default;
  42. constexpr publish_options(publish_options &&) = default;
  43. constexpr publish_options(publish_options const&) = default;
  44. constexpr publish_options& operator=(publish_options &&) = default;
  45. constexpr publish_options& operator=(publish_options const&) = default;
  46. explicit constexpr publish_options(std::uint8_t value) : data_(value) { }
  47. constexpr publish_options(retain value) : data_(static_cast<std::uint8_t>(value)) { }
  48. constexpr publish_options(dup value) : data_(static_cast<std::uint8_t>(value)) { }
  49. constexpr publish_options(qos value) : data_(static_cast<std::uint8_t>(static_cast<std::uint8_t>(value) << 1))
  50. {
  51. BOOST_ASSERT(value == qos::at_most_once || value == qos::at_least_once || value == qos::exactly_once);
  52. }
  53. constexpr publish_options operator|(publish_options rhs) const { return publish_options(data_ | rhs.data_); }
  54. constexpr publish_options operator|(retain rhs) const { return *this | publish_options(rhs); }
  55. constexpr publish_options operator|(dup rhs) const { return *this | publish_options(rhs); }
  56. constexpr publish_options operator|(qos rhs) const { return *this | publish_options(rhs); }
  57. constexpr publish_options& operator|=(publish_options rhs) { return (*this = (*this | rhs)); }
  58. constexpr publish_options& operator|=(retain rhs) { return (*this = (*this | rhs)); }
  59. constexpr publish_options& operator|=(dup rhs) { return (*this = (*this | rhs)); }
  60. constexpr publish_options& operator|=(qos rhs) { return (*this = (*this | rhs)); }
  61. constexpr retain get_retain() const
  62. { return static_cast<retain>(data_ & 0b00000001); }
  63. constexpr dup get_dup() const
  64. { return static_cast<dup>(data_ & 0b00001000); }
  65. constexpr qos get_qos() const
  66. { return static_cast<qos>((data_ & 0b00000110) >> 1); }
  67. explicit constexpr operator std::uint8_t() const { return data_; }
  68. private:
  69. std::uint8_t data_ = 0; // defaults to retain::no, dup::no, qos::at_most_once
  70. };
  71. constexpr publish_options operator|(retain lhs, dup rhs) { return publish_options(lhs) | rhs; }
  72. constexpr publish_options operator|(retain lhs, qos rhs) { return publish_options(lhs) | rhs; }
  73. constexpr publish_options operator|(dup lhs, retain rhs) { return publish_options(lhs) | rhs; }
  74. constexpr publish_options operator|(dup lhs, qos rhs) { return publish_options(lhs) | rhs; }
  75. constexpr publish_options operator|(qos lhs, retain rhs) { return publish_options(lhs) | rhs; }
  76. constexpr publish_options operator|(qos lhs, dup rhs) { return publish_options(lhs) | rhs; }
  77. constexpr char const* retain_to_str(retain v) {
  78. switch(v) {
  79. case retain::yes: return "yes";
  80. case retain::no: return "no";
  81. default: return "invalid_retain";
  82. }
  83. }
  84. inline
  85. std::ostream& operator<<(std::ostream& os, retain val)
  86. {
  87. os << retain_to_str(val);
  88. return os;
  89. }
  90. constexpr char const* dup_to_str(dup v) {
  91. switch(v) {
  92. case dup::yes: return "yes";
  93. case dup::no: return "no";
  94. default: return "invalid_dup";
  95. }
  96. }
  97. inline
  98. std::ostream& operator<<(std::ostream& os, dup val)
  99. {
  100. os << dup_to_str(val);
  101. return os;
  102. }
  103. } // namespace MQTT_NS
  104. #endif // MQTT_PUBLISH_HPP