diff --git a/include/matador/utils/message_bus.hpp b/include/matador/utils/message_bus.hpp index c919c3b..41f95a6 100644 --- a/include/matador/utils/message_bus.hpp +++ b/include/matador/utils/message_bus.hpp @@ -93,7 +93,9 @@ public: * @return True if the object matches the type, false otherwise. */ template - [[nodiscard]] bool is() const { return type_ == std::type_index(typeid(MessageType)); } + [[nodiscard]] bool is() const { + return type_ == std::type_index(typeid(MessageType)); + } /** * @brief Accesses the stored object as a typed reference. @@ -105,10 +107,14 @@ public: */ template const MessageType& get() const { - if (!is()) throw std::bad_cast(); - const void* p = raw_ptr(); - if (!p) throw std::runtime_error("AnyMessage: empty pointer"); - return *static_cast(p); + if (!is()) { + throw std::bad_cast(); + } + const void* ptr = raw_ptr(); + if (!ptr) { + throw std::runtime_error("AnyMessage: empty pointer"); + } + return *static_cast(ptr); } /** @@ -209,26 +215,24 @@ public: * @return A subscription object to manage the handler's registration. */ template - subscription subscribe(std::function handler, - Filter filter = nullptr) - { + subscription subscribe(std::function handler, Filter filter = nullptr) { auto id = next_id_.fetch_add(1, std::memory_order_relaxed); - std::unique_lock writeLock(mutex_); + std::unique_lock write_lock(mutex_); auto &vec = handlers_[std::type_index(typeid(MessageType))]; - Entry e; - e.id = id; - e.handler = [h = std::move(handler)](const void* p) { + Entry entry; + entry.id = id; + entry.handler = [h = std::move(handler)](const void* p) { h(*static_cast(p)); }; if (filter) { - e.filter = [f = std::move(filter)](const void* p) -> bool { + entry.filter = [f = std::move(filter)](const void* p) -> bool { return f(*static_cast(p)); }; } else { - e.filter = nullptr; + entry.filter = nullptr; } - vec.emplace_back(std::move(e)); + vec.emplace_back(std::move(entry)); return {this, std::type_index(typeid(MessageType)), id}; } @@ -245,8 +249,7 @@ public: template subscription subscribe(CallerClass* instance, MemberHandler memberFn, - Filter filter = nullptr) - { + Filter filter = nullptr) { auto fn = [instance, memberFn](const MessageType& m) { (instance->*memberFn)(m); }; return subscribe(std::function(fn), std::move(filter)); } @@ -257,29 +260,28 @@ public: * @tparam MessageType The type of the message to subscribe to. * @tparam CallerClass The class of the shared_ptr instance. * @param instance A shared pointer to the instance. - * @param memberFn A pointer to the member function to execute. + * @param member_func A pointer to the member function to execute. * @param filter An optional filter function. * @return A subscription object to manage the handler's registration. */ template subscription subscribe(std::shared_ptr instance, - MemberHandler memberFn, - Filter filter = nullptr) - { - std::weak_ptr w = instance; - auto handler = [w, memberFn](const MessageType& m) { - if (auto s = w.lock()) { - (s.get()->*memberFn)(m); + MemberHandler member_func, + Filter filter = nullptr) { + std::weak_ptr caller_ptr = instance; + auto handler = [caller_ptr, member_func](const MessageType& msg) { + if (auto caller = caller_ptr.lock()) { + (caller.get()->*member_func)(msg); } }; std::function local_filter = nullptr; if (filter) { - local_filter = [w, filter = std::move(filter)](const MessageType& m) -> bool { - if (w.expired()) { + local_filter = [caller_ptr, filter = std::move(filter)](const MessageType& msg) -> bool { + if (caller_ptr.expired()) { return false; } - return filter(m); + return filter(msg); }; } return subscribe(std::move(handler), std::move(local_filter)); @@ -321,7 +323,7 @@ public: void publish(const MessageType& msg) const { std::vector snapshot; { - std::shared_lock readLock(mutex_); + std::shared_lock read_lock(mutex_); const auto it = handlers_.find(std::type_index(typeid(MessageType))); if (it == handlers_.end()) { return; @@ -329,7 +331,9 @@ public: snapshot = it->second; // copy list to avoid holding lock during callbacks } for (const auto &e : snapshot) { - if (!e.filter || e.filter(&msg)) e.handler(&msg); + if (!e.filter || e.filter(&msg)) { + e.handler(&msg); + } } }