summaryrefslogtreecommitdiffstats
path: root/engine/include/core/signal.hpp
diff options
context:
space:
mode:
authorancarola <raffaele.ancarola@epfl.ch>2019-01-23 19:43:09 +0100
committerancarola <raffaele.ancarola@epfl.ch>2019-01-23 19:43:09 +0100
commit40a2e6ae3d17e271f9eaa07a53d934fc5d5457db (patch)
tree0da332dbff1d621306d5bfc4d1e54fccb795a206 /engine/include/core/signal.hpp
parentTask debugging (diff)
downloadflatland-40a2e6ae3d17e271f9eaa07a53d934fc5d5457db.tar.gz
flatland-40a2e6ae3d17e271f9eaa07a53d934fc5d5457db.zip
Labelled, signal
Diffstat (limited to '')
-rw-r--r--engine/include/core/signal.hpp60
1 files changed, 40 insertions, 20 deletions
diff --git a/engine/include/core/signal.hpp b/engine/include/core/signal.hpp
index 2393bc7..4270aa5 100644
--- a/engine/include/core/signal.hpp
+++ b/engine/include/core/signal.hpp
@@ -8,73 +8,92 @@
#include "task.hpp"
#include "types.h"
#include <functional>
+#include <memory>
#include "priority.hpp"
+#include "labelled.hpp"
namespace flat
{
namespace core
{
- class signal : virtual public object, public prioritized
+ class signal : virtual public labelled, virtual public prioritized
{
public:
object * sender;
- void * data; // TODO, avoid this void pointer
+ package m_package;
priority_t prior;
signal( object * sender,
const std::string& id = "",
- void * data,
+ void * data = 0,
priority_t prior = priority_t::none);
/* Alias to flat::core::channel::emit() */
bool emit(const std::string& channel) const;
+
+ struct package
+ {
+ package(void *data) : data(data) {}
+
+ template<class T>
+ T * get() {
+
+ return dynamic_cast<T>(data);
+ }
+
+ void * data;
+ };
};
/* Channel class */
- class channel : virtual public object
+ class channel : virtual public labelled
{
/* Post processing signal stacking */
queue<signal> stack;
/* Listeners list */
- std::list<listener*> listeners;
+ std::list<std::weak_ptr<listener>> listeners;
/* Synchronous task checking for signals */
- task * checker;
+ task::ptr checker;
/* Channel mapping */
- static std::map<std::string, channel*> channels;
+ static std::map<std::string, std::weak_ptr<channel>> channels;
public:
channel(const std::string& id = "", priority_t task_priority = priority_t::none);
~channel();
+
+ void start();
+ bool map();
void emit(const signal&);
- void connect(const listener*);
- void disconnect(const listener*);
+ bool connect(listener::ptr l);
+ void disconnect(listener::ptr l);
- static channel * find_channel(const std::string&);
+ static ptr find(const std::string&);
+
+ static ptr create(const string& id, priority_t prior);
- void post_processing();
+ void check_and_call();
+
+ typedef shared_ptr<channel> ptr;
};
/* Listener class */
- class listener : virtual public object
+ class listener
{
-
std::list<std::string> filters;
bool check_in_filters(const std::string&) const;
callback_t m_callback;
-
- channel * parent;
public:
@@ -93,14 +112,15 @@ namespace flat
/* Allow to safely bind e functor */
template<class T>
- static listener create( const (T::*method(const object*, void*))& fct,
- T* ptr,
- const std::initializer_list<std::string>& filters = {})
+ static ptr make( const (T::*method(const object*, void*))& fct,
+ T* obj,
+ const std::initializer_list<std::string>& filters = {})
{
- return listener(std::bind(fct, ptr), filters);
+ return new listener(std::bind(fct, ptr), filters);
}
- typedef std::function<void(const object*, void*)> callback_t;
+ typedef std::function<void(const object*, signal::package)> callback_t;
+ typedef shared_ptr<listener> ptr;
};
}