7 #if !defined(MQTT_TOPIC_ALIAS_SEND_HPP)
8 #define MQTT_TOPIC_ALIAS_SEND_HPP
11 #include <unordered_map>
14 #include <boost/multi_index_container.hpp>
15 #include <boost/multi_index/ordered_index.hpp>
16 #include <boost/multi_index/member.hpp>
17 #include <boost/multi_index/mem_fun.hpp>
31 namespace mi = boost::multi_index;
36 :max_{
max}, va_{min_, max_} {}
41 <<
"topic_alias_send insert"
43 <<
" alias:" << alias;
44 BOOST_ASSERT(!topic.empty() && alias >= min_ && alias <= max_);
46 auto& idx = aliases_.get<tag_alias>();
47 auto it = idx.lower_bound(alias);
48 if (it == idx.end() || it->alias != alias) {
49 idx.emplace_hint(it, std::string(topic), alias, std::chrono::steady_clock::now());
55 e.topic = std::string{topic};
56 e.tp = std::chrono::steady_clock::now();
58 [](
auto&) { BOOST_ASSERT(
false); }
67 <<
"find_topic_by_alias"
68 <<
" alias:" << alias;
70 BOOST_ASSERT(alias >= min_ && alias <= max_);
71 auto& idx = aliases_.get<tag_alias>();
72 auto it = idx.find(alias);
73 if (it == idx.end())
return std::string();
78 e.tp = std::chrono::steady_clock::now();
80 [](
auto&) { BOOST_ASSERT(
false); }
88 <<
"find_alias_by_topic"
89 <<
" topic:" << topic;
91 auto& idx = aliases_.get<tag_topic_name>();
92 auto it = idx.find(topic);
93 if (it == idx.end())
return nullopt;
100 <<
"clear_topic_alias";
106 BOOST_ASSERT(max_ > 0);
108 return alias_opt.value();
110 auto& idx = aliases_.get<tag_tp>();
111 return idx.begin()->alias;
134 struct tag_topic_name {};
135 using mi_topic_alias = mi::multi_index_container<
143 mi::tag<tag_topic_name>,
144 BOOST_MULTI_INDEX_CONST_MEM_FUN(entry,
string_view, get_topic_as_view)
146 mi::ordered_non_unique<
153 mi_topic_alias aliases_;
154 value_allocator<topic_alias_t> va_;
std::chrono::time_point< std::chrono::steady_clock > time_point_t
Definition: time_point_t.hpp:18
Definition: topic_alias_send.hpp:33
topic_alias_send(topic_alias_t max)
Definition: topic_alias_send.hpp:35
void insert_or_update(string_view topic, topic_alias_t alias)
Definition: topic_alias_send.hpp:38
optional< topic_alias_t > find(string_view topic) const
Definition: topic_alias_send.hpp:85
std::string find(topic_alias_t alias)
Definition: topic_alias_send.hpp:64
topic_alias_t get_lru_alias() const
Definition: topic_alias_send.hpp:105
topic_alias_t max() const
Definition: topic_alias_send.hpp:114
void clear()
Definition: topic_alias_send.hpp:97
optional< value_type > first_vacant() const
Get the first vacant value.
Definition: value_allocator.hpp:126
void clear()
Clear all allocated or used values.
Definition: value_allocator.hpp:255
bool use(value_type value)
Declare the value as used.
Definition: value_allocator.hpp:237
#define MQTT_LOG(chan, sev)
Definition: log.hpp:135
#define MQTT_ADD_VALUE(name, val)
Definition: log.hpp:136
boost::string_ref string_view
Definition: string_view.hpp:64
constexpr std::remove_reference_t< T > && force_move(T &&t)
Definition: move.hpp:20
std::uint16_t topic_alias_t
Definition: type.hpp:17
std::chrono::time_point< std::chrono::steady_clock > time_point_t
Definition: time_point_t.hpp:16