mqtt_topic_alias.hpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Copyright (c) 2017-2023 zhllxt
  3. *
  4. * author : zhllxt
  5. * email : 37792738@qq.com
  6. *
  7. * Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. */
  10. #ifndef __ASIO2_MQTT_TOPIC_ALIAS_HPP__
  11. #define __ASIO2_MQTT_TOPIC_ALIAS_HPP__
  12. #if defined(_MSC_VER) && (_MSC_VER >= 1200)
  13. #pragma once
  14. #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
  15. #include <unordered_map>
  16. #include <asio2/base/define.hpp>
  17. #include <asio2/base/detail/util.hpp>
  18. #include <asio2/base/detail/shared_mutex.hpp>
  19. #include <asio2/mqtt/message.hpp>
  20. namespace asio2::detail
  21. {
  22. ASIO2_CLASS_FORWARD_DECLARE_BASE;
  23. ASIO2_CLASS_FORWARD_DECLARE_TCP_BASE;
  24. ASIO2_CLASS_FORWARD_DECLARE_TCP_SERVER;
  25. ASIO2_CLASS_FORWARD_DECLARE_TCP_SESSION;
  26. ASIO2_CLASS_FORWARD_DECLARE_TCP_CLIENT;
  27. template<class derived_t, class args_t>
  28. class mqtt_topic_alias_t
  29. {
  30. friend derived_t;
  31. ASIO2_CLASS_FRIEND_DECLARE_BASE;
  32. ASIO2_CLASS_FRIEND_DECLARE_TCP_BASE;
  33. ASIO2_CLASS_FRIEND_DECLARE_TCP_SERVER;
  34. ASIO2_CLASS_FRIEND_DECLARE_TCP_SESSION;
  35. ASIO2_CLASS_FRIEND_DECLARE_TCP_CLIENT;
  36. protected:
  37. using self = mqtt_topic_alias_t<derived_t, args_t>;
  38. /**
  39. * @brief constructor
  40. */
  41. mqtt_topic_alias_t()
  42. {
  43. }
  44. /**
  45. * @brief destructor
  46. */
  47. ~mqtt_topic_alias_t() = default;
  48. public:
  49. template<class String>
  50. inline derived_t& push_topic_alias(std::uint16_t alias_value, String&& topic_name)
  51. {
  52. derived_t& derive = static_cast<derived_t&>(*this);
  53. asio2::unique_locker guard(this->topic_alias_mutex_);
  54. topic_aliases_[alias_value] = detail::to_string(std::forward<String>(topic_name));
  55. return static_cast<derived_t&>(*this);
  56. }
  57. inline bool find_topic_alias(std::uint16_t alias_value, std::string& topic_name)
  58. {
  59. derived_t& derive = static_cast<derived_t&>(*this);
  60. asio2::shared_locker guard(this->topic_alias_mutex_);
  61. auto iter = topic_aliases_.find(alias_value);
  62. if (iter != topic_aliases_.end())
  63. {
  64. topic_name = iter->second;
  65. return true;
  66. }
  67. return false;
  68. }
  69. protected:
  70. /// use rwlock to make thread safe
  71. mutable asio2::shared_mutexer topic_alias_mutex_;
  72. ///
  73. std::unordered_map<std::uint16_t, std::string> topic_aliases_ ASIO2_GUARDED_BY(topic_alias_mutex_);
  74. };
  75. }
  76. #endif // !__ASIO2_MQTT_TOPIC_ALIAS_HPP__