summaryrefslogtreecommitdiffstats
path: root/engine/signal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engine/signal.cpp')
-rw-r--r--engine/signal.cpp110
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);
}