refactor event system

This commit is contained in:
2025-01-23 19:12:15 -06:00
parent 03485935b7
commit 8c53a07d64
2 changed files with 21 additions and 22 deletions

View File

@ -51,26 +51,26 @@ protected:
~event_system2() { stop(); } ~event_system2() { stop(); }
public: public:
class event_consumer2 final { class event_consumer final {
public: public:
explicit event_consumer2(std::function<void(const i_event &)> callback) explicit event_consumer(std::function<void(const i_event &)> callback)
: callback_(std::move(callback)) { : callback_(std::move(callback)) {
event_system2::instance().attach(this); event_system2::instance().attach(this);
} }
event_consumer2(std::string_view event_name, event_consumer(std::string_view event_name,
std::function<void(const i_event &)> callback) std::function<void(const i_event &)> callback)
: callback_(std::move(callback)) { : callback_(std::move(callback)) {
event_system2::instance().attach(event_name, this); event_system2::instance().attach(event_name, this);
} }
~event_consumer2() { event_system2::instance().release(this); } ~event_consumer() { event_system2::instance().release(this); }
public: public:
event_consumer2(const event_consumer2 &) = delete; event_consumer(const event_consumer &) = delete;
event_consumer2(event_consumer2 &&) = delete; event_consumer(event_consumer &&) = delete;
auto operator=(const event_consumer2 &) -> event_consumer2 & = delete; auto operator=(const event_consumer &) -> event_consumer & = delete;
auto operator=(event_consumer2 &&) -> event_consumer2 & = delete; auto operator=(event_consumer &&) -> event_consumer & = delete;
private: private:
std::function<void(const i_event &)> callback_; std::function<void(const i_event &)> callback_;
@ -86,7 +86,7 @@ public:
[[nodiscard]] static auto instance() -> event_system2 &; [[nodiscard]] static auto instance() -> event_system2 &;
private: private:
std::unordered_map<std::string, std::deque<event_consumer2 *>> std::unordered_map<std::string, std::deque<event_consumer *>>
event_consumers_; event_consumers_;
std::recursive_mutex consumer_mutex_; std::recursive_mutex consumer_mutex_;
std::vector<std::shared_ptr<i_event>> event_list_; std::vector<std::shared_ptr<i_event>> event_list_;
@ -104,42 +104,41 @@ private:
void queue_event(std::shared_ptr<i_event> evt); void queue_event(std::shared_ptr<i_event> evt);
public: public:
void attach(event_consumer2 *consumer); void attach(event_consumer *consumer);
void attach(std::string_view event_name, event_consumer2 *consumer); void attach(std::string_view event_name, event_consumer *consumer);
template <typename evt_t, typename... arg_t> void raise(arg_t &&...args) { template <typename evt_t, typename... arg_t> void raise(arg_t &&...args) {
queue_event(std::make_shared<evt_t>(std::forward<arg_t>(args)...)); queue_event(std::make_shared<evt_t>(std::forward<arg_t>(args)...));
} }
void release(event_consumer2 *consumer); void release(event_consumer *consumer);
void start(); void start();
void stop(); void stop();
}; };
using event_consumer2 = event_system2::event_consumer2; using event_consumer = event_system2::event_consumer;
using event_consumer = event_system2::event_consumer2;
#define E_CONSUMER2() \ #define E_CONSUMER2() \
private: \ private: \
std::vector<std::shared_ptr<repertory::event_consumer2>> event_consumers2_ std::vector<std::shared_ptr<repertory::event_consumer>> event_consumers2_
#define E_CONSUMER2_RELEASE() event_consumers2_.clear() #define E_CONSUMER2_RELEASE() event_consumers2_.clear()
#define E_SUBSCRIBE2(name, callback) \ #define E_SUBSCRIBE2(name, callback) \
event_consumers2_.emplace_back(std::make_shared<repertory::event_consumer2>( \ event_consumers2_.emplace_back(std::make_shared<repertory::event_consumer>( \
#name, [this](const i_event &evt) { callback(evt); })) #name, [this](const i_event &evt) { callback(evt); }))
#define E_SUBSCRIBE2_EXACT(name, callback) \ #define E_SUBSCRIBE2_EXACT(name, callback) \
event_consumers2_.emplace_back(std::make_shared<repertory::event_consumer2>( \ event_consumers2_.emplace_back(std::make_shared<repertory::event_consumer>( \
#name, [this](const i_event &evt) { \ #name, [this](const i_event &evt) { \
callback(dynamic_cast<const name &>(evt)); \ callback(dynamic_cast<const name &>(evt)); \
})) }))
#define E_SUBSCRIBE2_ALL(callback) \ #define E_SUBSCRIBE2_ALL(callback) \
event_consumers2_.emplace_back(std::make_shared<repertory::event_consumer2>( \ event_consumers2_.emplace_back(std::make_shared<repertory::event_consumer>( \
[this](const i_event &evt) { callback(evt); })) [this](const i_event &evt) { callback(evt); }))
} // namespace repertory } // namespace repertory

View File

@ -30,13 +30,13 @@ event_system2 event_system2::instance_{};
auto event_system2::instance() -> event_system2 & { return instance_; } auto event_system2::instance() -> event_system2 & { return instance_; }
void event_system2::attach(event_consumer2 *consumer) { void event_system2::attach(event_consumer *consumer) {
recur_mutex_lock lock(consumer_mutex_); recur_mutex_lock lock(consumer_mutex_);
event_consumers_[""].push_back(consumer); event_consumers_[""].push_back(consumer);
} }
void event_system2::attach(std::string_view event_name, void event_system2::attach(std::string_view event_name,
event_consumer2 *consumer) { event_consumer *consumer) {
recur_mutex_lock lock(consumer_mutex_); recur_mutex_lock lock(consumer_mutex_);
event_consumers_[std::string{event_name}].push_back(consumer); event_consumers_[std::string{event_name}].push_back(consumer);
} }
@ -113,7 +113,7 @@ void event_system2::queue_event(std::shared_ptr<i_event> evt) {
} }
} }
void event_system2::release(event_consumer2 *consumer) { void event_system2::release(event_consumer *consumer) {
recur_mutex_lock lock(consumer_mutex_); recur_mutex_lock lock(consumer_mutex_);
auto iter = auto iter =
std::ranges::find_if(event_consumers_, [&consumer](auto &&item) -> bool { std::ranges::find_if(event_consumers_, [&consumer](auto &&item) -> bool {