summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorancarola <raffaele.ancarola@epfl.ch>2019-01-29 07:40:50 +0100
committerancarola <raffaele.ancarola@epfl.ch>2019-01-29 07:40:50 +0100
commit0c5b2a011edf3260b9cc68703ce5b42e116f57fb (patch)
tree9f5858d3de0da9ec4c95d781715daf1fc9f35f98
parentExperimental status of signal (diff)
downloadflatland-0c5b2a011edf3260b9cc68703ce5b42e116f57fb.tar.gz
flatland-0c5b2a011edf3260b9cc68703ce5b42e116f57fb.zip
It compiles
-rw-r--r--engine/include/core/signal.hpp32
-rw-r--r--engine/signal.cpp8
2 files changed, 19 insertions, 21 deletions
diff --git a/engine/include/core/signal.hpp b/engine/include/core/signal.hpp
index fbcd043..fab1eaa 100644
--- a/engine/include/core/signal.hpp
+++ b/engine/include/core/signal.hpp
@@ -96,17 +96,18 @@ namespace flat
void add_filter(const std::string&);
void remove_filter(const std::string&);
- virtual void invoke(const abstract_signal&) = 0;
+ virtual void invoke(const abstract_signal *) = 0;
};
/* Listener class */
template <class ...Args>
class listener : public abstract_listener
{
+
public:
- using callback = std::function<void(Args...)>;
- using ptr = std::shared_ptr<listener<Args...>>;
+ using callback = typename std::function<void(Args...)>;
+ using ptr = typename std::shared_ptr<listener<Args...>>;
listener(callback m_callback, const std::initializer_list<std::string>& filters = {})
: abstract_listener(filters), m_callback(m_callback)
@@ -118,9 +119,9 @@ namespace flat
//bool disconnect(const std::string&);
template<int ...Is>
- void invoke(abstract_signal *sig, helper::int_sequence<Is...>)
+ void invoke(const abstract_signal * sig, helper::int_sequence<Is...>)
{
- signal<Args...>* pt = dynamic_cast<signal<Args...>*>(sig);
+ const signal<Args...> * pt = dynamic_cast<const signal<Args...>*>(sig);
// check if the arguments and the filters match
if (pt && match_filters(sig))
@@ -128,7 +129,7 @@ namespace flat
}
// implement base class method
- virtual bool invoke(abstract_signal* sig) override
+ virtual bool invoke(const abstract_signal * sig) override
{
return invoke(sig, helper::make_int_sequence<sizeof...(Args)>{});
}
@@ -190,12 +191,12 @@ namespace flat
template<class ...Args>
- void disconnect(listener<Args...>::ptr l)
+ void disconnect(typename listener<Args...>::ptr l)
{
listeners.remove_if(
- [l](std::weak_ptr<listener> p){
+ [l](std::weak_ptr<abstract_listener> p){
- listener::ptr pt = p.lock();
+ typename listener<Args...>::ptr pt = p.lock();
return pt.get() == l.get();
});
}
@@ -203,7 +204,7 @@ namespace flat
template<class ...Args>
void disconnect(listener<Args...>* l)
{
- listener<Args...>::ptr pt(l);
+ typename listener<Args...>::ptr pt(l);
disconnect<Args...>(pt);
}
@@ -233,12 +234,12 @@ namespace flat
* returns the corresponding listener
*/
template<class ...Args>
- listener<Args...>::ptr connect( listener<Args...>::callback f,
+ typename listener<Args...>::ptr connect( typename listener<Args...>::callback f,
const std::initializer_list<std::string>& filters = {})
{
- listener<Args...>::ptr lis = std::make_shared<listener<Args..>>(f, filters);
+ typename listener<Args...>::ptr lis = std::make_shared<listener<Args...>>(f, filters);
- if (connect(static_pointer_cast<abstract_listener>(lis)))
+ if (connect(std::static_pointer_cast<abstract_listener>(lis)))
return lis;
return nullptr;
@@ -248,9 +249,8 @@ namespace flat
* Connect a class member function and returns the
* corresponding listener
*/
- template<typename R, typename T, class Args...>
- inline listener::ptr connect(R T::*mf, T* obj,
- const std::initializer_list<std::string>& filters = {})
+ template<typename R, typename T, class ...Args>
+ inline typename listener<Args...>::ptr connect(R T::*mf, T* obj, const std::initializer_list<std::string>& filters = {})
{
//using namespace std::placeholders;
//return connect<Args...>(std::bind(mf, obj, _1, _2), filters);
diff --git a/engine/signal.cpp b/engine/signal.cpp
index 675bdc8..941d641 100644
--- a/engine/signal.cpp
+++ b/engine/signal.cpp
@@ -147,9 +147,7 @@ void channel::check_and_call()
abstract_signal::abstract_signal(const std::string& id, priority_t priority)
: labelled(id, true),
- prioritized(priority),
-{
-}
+ prioritized(priority) {}
/*bool signal::emit(const std::string& chan) const
{
@@ -200,7 +198,7 @@ void abstract_listener::remove_filter(const std::string& f)
bool abstract_listener::match_filters(const abstract_signal *sig) const
{
- return (!sig.label.empty() && check_in_filters(sig.label)) ||
- (sig.label.empty() && filters.empty());
+ return (!sig->label.empty() && check_in_filters(sig->label)) ||
+ (sig->label.empty() && filters.empty());
}