diff options
author | ancarola <raffaele.ancarola@epfl.ch> | 2019-01-29 07:40:50 +0100 |
---|---|---|
committer | ancarola <raffaele.ancarola@epfl.ch> | 2019-01-29 07:40:50 +0100 |
commit | 0c5b2a011edf3260b9cc68703ce5b42e116f57fb (patch) | |
tree | 9f5858d3de0da9ec4c95d781715daf1fc9f35f98 | |
parent | Experimental status of signal (diff) | |
download | flatland-0c5b2a011edf3260b9cc68703ce5b42e116f57fb.tar.gz flatland-0c5b2a011edf3260b9cc68703ce5b42e116f57fb.zip |
It compiles
-rw-r--r-- | engine/include/core/signal.hpp | 32 | ||||
-rw-r--r-- | engine/signal.cpp | 8 |
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()); } |