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(); }
public:
class event_consumer2 final {
class event_consumer final {
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)) {
event_system2::instance().attach(this);
}
event_consumer2(std::string_view event_name,
std::function<void(const i_event &)> callback)
event_consumer(std::string_view event_name,
std::function<void(const i_event &)> callback)
: callback_(std::move(callback)) {
event_system2::instance().attach(event_name, this);
}
~event_consumer2() { event_system2::instance().release(this); }
~event_consumer() { event_system2::instance().release(this); }
public:
event_consumer2(const event_consumer2 &) = delete;
event_consumer2(event_consumer2 &&) = delete;
auto operator=(const event_consumer2 &) -> event_consumer2 & = delete;
auto operator=(event_consumer2 &&) -> event_consumer2 & = delete;
event_consumer(const event_consumer &) = delete;
event_consumer(event_consumer &&) = delete;
auto operator=(const event_consumer &) -> event_consumer & = delete;
auto operator=(event_consumer &&) -> event_consumer & = delete;
private:
std::function<void(const i_event &)> callback_;
@ -86,7 +86,7 @@ public:
[[nodiscard]] static auto instance() -> event_system2 &;
private:
std::unordered_map<std::string, std::deque<event_consumer2 *>>
std::unordered_map<std::string, std::deque<event_consumer *>>
event_consumers_;
std::recursive_mutex consumer_mutex_;
std::vector<std::shared_ptr<i_event>> event_list_;
@ -104,42 +104,41 @@ private:
void queue_event(std::shared_ptr<i_event> evt);
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) {
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 stop();
};
using event_consumer2 = event_system2::event_consumer2;
using event_consumer = event_system2::event_consumer2;
using event_consumer = event_system2::event_consumer;
#define E_CONSUMER2() \
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_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); }))
#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) { \
callback(dynamic_cast<const name &>(evt)); \
}))
#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); }))
} // namespace repertory

View File

@ -30,13 +30,13 @@ event_system2 event_system2::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_);
event_consumers_[""].push_back(consumer);
}
void event_system2::attach(std::string_view event_name,
event_consumer2 *consumer) {
event_consumer *consumer) {
recur_mutex_lock lock(consumer_mutex_);
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_);
auto iter =
std::ranges::find_if(event_consumers_, [&consumer](auto &&item) -> bool {