diff options
Diffstat (limited to 'engine/signal.cpp')
-rw-r--r-- | engine/signal.cpp | 110 |
1 files changed, 53 insertions, 57 deletions
diff --git a/engine/signal.cpp b/engine/signal.cpp index d6be29b..fbb4e06 100644 --- a/engine/signal.cpp +++ b/engine/signal.cpp @@ -7,17 +7,17 @@ using namespace flat::core; -std::map<std::string, std::weak_ptr<channel>> channel::channels; +std::map<std::string, std::weak_ptr<channel>> channel::m_channels; -channel::channel(const std::string& id) : labelled(id), mapped(false) +channel::channel(const std::string& id) : labelled(id), m_mapped(false) { } channel::~channel() { // by default it should be there - if (mapped) - channels.erase(label); + if (m_mapped) + m_channels.erase(label); } bool channel::start(priority_t prior, job * _job) @@ -25,7 +25,7 @@ bool channel::start(priority_t prior, job * _job) npdebug("Trying to map channel: ", label); if (map()) - checker.reset(); // force count to zero, it should remove task too + m_checker.reset(); // force count to zero, it should remove task too else return false; @@ -36,37 +36,36 @@ bool channel::start(priority_t prior, job * _job) _job = &flat::main_job(); // Initialize task - checker = _job->delegate_task(&channel::check_and_call, this, prior); + m_checker = _job->delegate_task(&channel::check_and_call, this, prior); return true; } bool channel::map() { - if (!mapped) { + if (!m_mapped) { channel::ptr other = channel::find(label); if (!other) { - - channels.insert(std::pair<std::string, std::weak_ptr<channel>>(label, weak_from_this())); - mapped = true; + m_channels.insert(std::pair<std::string, std::weak_ptr<channel>>(label, weak_from_this())); + m_mapped = true; } } - return mapped; + return m_mapped; } void channel::emit(const signal& sig) { - stack.insert(sig); + m_stack.insert(sig); npdebug("Emitted signal: ", sig.label, " ", this); } bool channel::connect(listener::ptr l) { /* Control not to double */ - for (auto lis : listeners) + for (auto lis : m_listeners) { auto pt = lis.lock(); @@ -74,18 +73,22 @@ bool channel::connect(listener::ptr l) return false; } - listeners.push_back(l); + m_listeners.push_back(l); return true; } void channel::disconnect(listener::ptr l) { - listeners.remove_if( - [l](std::weak_ptr<listener> p){ - - listener::ptr pt = p.lock(); - return pt.get() == l.get(); - }); + m_listeners.erase( + std::remove_if( + m_listeners.begin(), + m_listeners.end(), + [&l](std::weak_ptr<listener> p){ + listener::ptr pt = p.lock(); + return pt.get() == l.get(); + } + ) + ); } bool channel::connect(listener* l) @@ -112,7 +115,7 @@ listener::ptr channel::connect(listener::callback f, const std::initializer_list bool channel::legit() const { - return mapped; + return m_mapped; } channel::ptr channel::create(const std::string& id, priority_t prior, job * _job) @@ -125,17 +128,18 @@ channel::ptr channel::create(const std::string& id, priority_t prior, job * _job channel::ptr channel::find(const std::string& id) { + // what about anonymous (unlabeled) channels? if (id.empty()) return nullptr; - auto it = channels.find(id); + auto it = m_channels.find(id); - return (it == channels.end()) ? nullptr : (*it).second.lock(); + return (it == m_channels.end()) ? nullptr : (*it).second.lock(); } void channel::check_and_call() { - if (!stack.empty()) { + if (!m_stack.empty()) { npdebug("Signal detected: ", label, " ", this) @@ -144,13 +148,13 @@ void channel::check_and_call() // TODO, maybe it exists pop /* for each listener_s, catch signal */ - for (auto l : listeners) + for (auto l : m_listeners) { listener::ptr pt; if (pt = l.lock()) { - for (const auto& sig : stack) + for (const auto& sig : m_stack) pt->invoke(sig); } else @@ -158,47 +162,39 @@ void channel::check_and_call() } /* Erase invalidated listeners */ - listeners.remove_if( - [](std::weak_ptr<listener> e) { return e.expired(); }); - - stack.clear(); // TODO not so efficient + m_listeners.erase( + std::remove_if( + m_listeners.begin(), + m_listeners.end(), + [](std::weak_ptr<listener> e) { return e.expired(); } + ) + ); + + m_stack.clear(); // TODO not so efficient } } /* signal class */ -signal::signal( object *sender, - const std::string& id, - void *data, - priority_t priority) +signal::signal(object *sender, + const std::string& id, + void *data, + priority_t p) : labelled(id, true), - prioritized(priority), - sender(sender), + prioritized(p), + m_sender(sender), m_package(package(data)) { } -bool signal::emit(const std::string& chan) const -{ - channel::ptr c = channel::find(chan); - - if (!c) - return false; - - /* Finally emit in channel */ - c->emit(*this); - - return true; -} - /* listener_s class */ -listener::listener(callback m_callback, const std::initializer_list<std::string>& filters) +listener::listener(callback callback, const std::initializer_list<std::string>& filters) - : m_callback(m_callback), filters(filters) + : m_callback(callback), m_filters(filters) { } @@ -209,7 +205,7 @@ listener::~listener() bool listener::check_in_filters(const std::string& filter) const { - for (const auto& f : filters) + for (const auto& f : m_filters) { if (filter == f) return true; @@ -220,12 +216,12 @@ bool listener::check_in_filters(const std::string& filter) const void listener::add_filter(const std::string& f) { - filters.push_back(f); + m_filters.push_back(f); } void listener::remove_filter(const std::string& f) { - filters.remove(f); + m_filters.remove(f); } bool listener::connect(const std::string& chan) @@ -250,8 +246,8 @@ bool listener::disconnect(const std::string& chan) void listener::invoke(const signal& sig) { - if ( (!sig.label.empty() && check_in_filters(sig.label)) || - (sig.label.empty() && filters.empty())) - m_callback(sig.sender, sig.m_package); + if ((!sig.label.empty() && check_in_filters(sig.label)) || + (sig.label.empty() && m_filters.empty())) + m_callback(sig.m_sender, sig.m_package); } |