diff --git a/subscriptionstore.cpp b/subscriptionstore.cpp index 42644fb..b8974bc 100644 --- a/subscriptionstore.cpp +++ b/subscriptionstore.cpp @@ -28,8 +28,16 @@ void SubscriptionStore::addSubscription(Client_p &client, const std::string &top SubscriptionNode *deepestNode = root.get(); for(const std::string &subtopic : subtopics) { - SubscriptionNode &nodeRef = *deepestNode; - std::unique_ptr &node = nodeRef.children[subtopic]; + std::unique_ptr *selectedChildren = nullptr; + + if (subtopic == "#") + selectedChildren = &deepestNode->childrenPound; + else if (subtopic == "+") + selectedChildren = &deepestNode->childrenPlus; + else + selectedChildren = &deepestNode->children[subtopic]; + + std::unique_ptr &node = *selectedChildren; if (!node) { @@ -75,17 +83,16 @@ void SubscriptionStore::publishRecursively(std::vector::const_itera return; } - if (this_node->children.empty()) + if (this_node->children.empty() && !this_node->childrenPlus && !this_node->childrenPound) return; std::string cur_subtop = *cur_subtopic_it; const auto next_subtopic = ++cur_subtopic_it; - const auto pound_sign_node = this_node->children.find("#"); - if (pound_sign_node != this_node->children.end()) + if (this_node->childrenPound) { - publishNonRecursively(packet, pound_sign_node->second->subscribers); + publishNonRecursively(packet, this_node->childrenPound->subscribers); } auto sub_node = this_node->children.find(cur_subtop); @@ -94,10 +101,9 @@ void SubscriptionStore::publishRecursively(std::vector::const_itera publishRecursively(next_subtopic, end, sub_node->second, packet); } - const auto plus_sign_node = this_node->children.find("+"); - if (plus_sign_node != this_node->children.end()) + if (this_node->childrenPlus) { - publishRecursively(next_subtopic, end, plus_sign_node->second, packet); + publishRecursively(next_subtopic, end, this_node->childrenPlus, packet); } } diff --git a/subscriptionstore.h b/subscriptionstore.h index 6f13f71..459e4f6 100644 --- a/subscriptionstore.h +++ b/subscriptionstore.h @@ -30,6 +30,8 @@ public: std::forward_list subscribers; // The idea is to store subscriptions by client id, to support persistent sessions. std::unordered_map> children; + std::unique_ptr childrenPlus; + std::unique_ptr childrenPound; }; class SubscriptionStore