#pragma once #include "message-buffer.hpp" #include #include #include namespace advss { template class MessageDispatcher { public: [[nodiscard]] std::shared_ptr> RegisterClient(); void DispatchMessage(const T &message); private: std::vector>> _clients; std::mutex _mutex; }; template inline std::shared_ptr> MessageDispatcher::RegisterClient() { std::lock_guard lock(_mutex); // Clear expired client buffers auto isExpired = [](const std::weak_ptr> &ptr) { return ptr.expired(); }; _clients.erase(std::remove_if(_clients.begin(), _clients.end(), isExpired), _clients.end()); // Prepare new buffer for client auto buffer = std::make_shared>(); _clients.emplace_back(buffer); return buffer; } template inline void MessageDispatcher::DispatchMessage(const T &message) { std::lock_guard lock(_mutex); for (auto &client_ : _clients) { auto client = client_.lock(); if (!client) { continue; } client->AppendMessage(message); } } } // namespace advss