summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorancarola <raffaele.ancarola@epfl.ch>2019-01-22 03:16:00 +0100
committerancarola <raffaele.ancarola@epfl.ch>2019-01-22 03:16:00 +0100
commit21241191fbce373a484b247224d79fcd095d1d3b (patch)
tree2364c5b122c952c7196006356d7b1ecae98004e9
parentWoo (diff)
downloadflatland-21241191fbce373a484b247224d79fcd095d1d3b.tar.gz
flatland-21241191fbce373a484b247224d79fcd095d1d3b.zip
Duplicate
-rw-r--r--engine/include/signal.h112
-rw-r--r--engine/include/signal.hpp50
2 files changed, 12 insertions, 150 deletions
diff --git a/engine/include/signal.h b/engine/include/signal.h
deleted file mode 100644
index db6638b..0000000
--- a/engine/include/signal.h
+++ /dev/null
@@ -1,112 +0,0 @@
-#pragma once
-
-#include <map>
-#include <list>
-#include <set>
-#include <initializer_list>
-#include "object.hpp"
-#include "task.hpp"
-#include "types.h"
-#include <functional>
-
-namespace flat
-{
- namespace core
- {
- class signal;
- class channel;
- }
-}
-
-class flat::core::signal : virtual public flat::core::object
-{
-
-public:
-
- flat::core::object * sender;
- priority prior;
-
- signal( flat::core::object * sender,
- const std::string& id = "",
- priority prior = 5);
-
- /* Alias to flat::core::channel::emit() */
- bool emit(const std::string& channel) const;
-
- enum class priority : uint8_t
- {
- instant = 0,
- highest,
- high,
- none,
- low,
- lowest
- };
-};
-
-
-/* Channel class */
-class flat::core::channel : virtual public flat::core::object
-{
- /* Post processing signal stacking */
- stack_t stack;
-
- /* Listeners list */
- std::list<flat::core::listener> listeners;
-
- /* Synchronous task checking for signals */
- task_s * checker;
-
- /* Channel mapping */
- static std::map<std::string, channel*> channels;
-
-public:
-
- flat::core::channel(const std::string& id = "", flat::core::task::priority prior = flat::core::task::priority::none);
- ~flat::core::channel();
-
- void emit(const flat::core::signal&);
-
- void connect(flat::core::listener_s*);
- void disconnect(flat::core::listener_s*);
-
- static flat::core::channel * find_channel(const std::string&);
-
- void post_processing(void*);
-
- /* Functor for order comparison */
- struct sig_prior_cmp {
-
- bool operator()(const flat::core::signal&, const flat::core::signal&) const;
- };
-
- typedef std::set<flat::core::signal, sig_prior_cmp> stack_t;
-};
-
-/* Listener class */
-class flat::core::listener : virtual public flat::core::object
-{
- std::list<std::string> filters;
-
- bool check_in_filters(const std::string&) const;
-
- std::function<void(const flat::core::object*)> m_callback;
-
- flat::core::channel * parent = 0;
-
-public:
-
- listener( std::function<void()> m_callback,
- const std::initializer_list<std::string>& filters = {});
-
- ~listener();
-
- void add_filter(const std::string&);
- void remove_filter(const std::string&);
-
- bool connect(const std::string&);
- bool disconnect(const std::string&);
-
- void invoke(const flat::core::signal&);
-};
-
diff --git a/engine/include/signal.hpp b/engine/include/signal.hpp
index 24d240d..db6638b 100644
--- a/engine/include/signal.hpp
+++ b/engine/include/signal.hpp
@@ -6,7 +6,8 @@
#include <initializer_list>
#include "object.hpp"
#include "task.hpp"
-#include "types.hpp"
+#include "types.h"
+#include <functional>
namespace flat
{
@@ -23,12 +24,10 @@ class flat::core::signal : virtual public flat::core::object
public:
flat::core::object * sender;
- void * data;
priority prior;
signal( flat::core::object * sender,
const std::string& id = "",
- void *data = 0,
priority prior = 5);
/* Alias to flat::core::channel::emit() */
@@ -53,7 +52,7 @@ class flat::core::channel : virtual public flat::core::object
stack_t stack;
/* Listeners list */
- std::list<flat::core::listener_s*> listeners;
+ std::list<flat::core::listener> listeners;
/* Synchronous task checking for signals */
task_s * checker;
@@ -85,54 +84,29 @@ public:
};
/* Listener class */
-class flat::core::listener_s : virtual public flat::core::object
+class flat::core::listener : virtual public flat::core::object
{
std::list<std::string> filters;
bool check_in_filters(const std::string&) const;
+ std::function<void(const flat::core::object*)> m_callback;
+
+ flat::core::channel * parent = 0;
+
public:
- flat::core::listener(const std::initializer_list<std::string>& filters = {});
- virtual ~flat::core::listener() {}
+ listener( std::function<void()> m_callback,
+ const std::initializer_list<std::string>& filters = {});
- virtual void execute(const flat::core::signal&) = 0;
+ ~listener();
void add_filter(const std::string&);
void remove_filter(const std::string&);
bool connect(const std::string&);
bool disconnect(const std::string&);
-};
-
-template<class T>
-class flat::core::listener : public flat::core::listener_s
-{
- typedef void (T::*callback_t)(void*);
-
- T * object;
- callback_t callback;
-
- void *args;
-public:
-
- listener( T *object,
- callback_t callback,
- const std::initializer_list<std::string>& filters = {},
- void *args = 0)
-
- : flat::core::listener_s(filters),
- object(object),
- callback(callback),
- args(args) {}
-
- virtual void execute(const flat::core::signal&) override
- {
- if ((!sig.get_id().empty() && check_in_filters(sig.get_id())) ||
- (sig.get_id().empty() && filters.empty()))
- (object->*callback)(sig.sender, sig.data);
- }
+ void invoke(const flat::core::signal&);
};
-