shared_target.hpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. // Copyright Takatoshi Kondo 2020
  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_BROKER_SHARED_TARGET_HPP)
  7. #define MQTT_BROKER_SHARED_TARGET_HPP
  8. #include <mqtt/config.hpp>
  9. #include <set>
  10. #include <boost/multi_index_container.hpp>
  11. #include <boost/multi_index/ordered_index.hpp>
  12. #include <boost/multi_index/composite_key.hpp>
  13. #include <boost/multi_index/member.hpp>
  14. #include <boost/multi_index/mem_fun.hpp>
  15. #include <mqtt/buffer.hpp>
  16. #include <mqtt/optional.hpp>
  17. #include <mqtt/time_point_t.hpp>
  18. #include <mqtt/broker/broker_namespace.hpp>
  19. #include <mqtt/broker/session_state_fwd.hpp>
  20. #include <mqtt/broker/tags.hpp>
  21. #include <mqtt/broker/mutex.hpp>
  22. MQTT_BROKER_NS_BEGIN
  23. namespace mi = boost::multi_index;
  24. class shared_target {
  25. public:
  26. void insert(buffer share_name, buffer topic_filter, session_state& ss);
  27. void erase(buffer share_name, buffer topic_filter, session_state const& ss);
  28. void erase(session_state const& ss);
  29. optional<session_state_ref> get_target(buffer const& share_name, buffer const& topic_filter);
  30. private:
  31. struct entry {
  32. entry(buffer share_name, session_state& ss, time_point_t tp);
  33. buffer const& client_id() const;
  34. buffer share_name;
  35. session_state_ref ssr;
  36. time_point_t tp;
  37. std::set<buffer> topic_filters;
  38. };
  39. using mi_shared_target = mi::multi_index_container<
  40. entry,
  41. mi::indexed_by<
  42. mi::ordered_unique<
  43. mi::tag<tag_cid_sn>,
  44. mi::composite_key<
  45. entry,
  46. BOOST_MULTI_INDEX_CONST_MEM_FUN(entry, buffer const&, client_id),
  47. BOOST_MULTI_INDEX_MEMBER(entry, buffer, share_name)
  48. >
  49. >,
  50. mi::ordered_non_unique<
  51. mi::tag<tag_sn_tp>,
  52. mi::composite_key<
  53. entry,
  54. BOOST_MULTI_INDEX_MEMBER(entry, buffer, share_name),
  55. BOOST_MULTI_INDEX_MEMBER(entry, time_point_t, tp)
  56. >
  57. >
  58. >
  59. >;
  60. mutable mutex mtx_targets_;
  61. mi_shared_target targets_;
  62. };
  63. MQTT_BROKER_NS_END
  64. #endif // MQTT_BROKER_SHARED_TARGET_HPP