diff --git a/src/modules/stream/callable.cpp b/src/modules/stream/callable.cpp new file mode 100644 index 0000000..b598b05 --- /dev/null +++ b/src/modules/stream/callable.cpp @@ -0,0 +1,3 @@ +#include +#include +#include "callable.h" diff --git a/src/modules/stream/callable.h b/src/modules/stream/callable.h new file mode 100644 index 0000000..80e0bec --- /dev/null +++ b/src/modules/stream/callable.h @@ -0,0 +1,93 @@ +#ifndef CALLABLE_H_ +#define CALLABLE_H_ +#include +class _CallableBase {}; + +template +class _Callable : public _CallableBase { + T *obj; + Ret (T::*method)(Args...); + +public: + void operator()(Args... args) + { + (obj->*method)(args...); + } + _Callable(T *obj, Ret (T::*method)(Args...)) + : obj(obj) + , method(method) + { + } +}; +template class _Signal { + std::list<_CallableBase *> callables; + +public: + class T {}; + void connect(_CallableBase *callable) + { + callables.push_front(callable); + } + void disconnect(_CallableBase *callable) + { + callables.remove(callable); + } + void emit(Args... args) + { + auto e = callables.begin(); + while (e != callables.end()) { + _Callable *foo = + reinterpret_cast<_Callable *>( + *e); + (*foo)(args...); + e++; + } + } +}; +#ifdef __TEST +#include +class check { +public: + _Signal sig; + +public: + check() + { + } + void emit() + { + sig.emit(); + } +}; +class cfoo { + void handler1() + { + printf("handler1\n"); + } + void handler2() + { + printf("handler2\n"); + } + +public: + cfoo() + { + check b; + _Callable c(this, &cfoo::handler1); + _Callable d(this, &cfoo::handler2); + b.sig.connect(&c); + b.sig.connect(&d); + b.emit(); + b.emit(); + b.sig.disconnect(&c); + b.sig.disconnect(&d); + b.emit(); + } +}; +int main() +{ + cfoo c; + return 0; +} +#endif +#endif \ No newline at end of file diff --git a/src/modules/stream/road_lines_data.h b/src/modules/stream/road_lines_data.h index 7585d04..336c9ca 100644 --- a/src/modules/stream/road_lines_data.h +++ b/src/modules/stream/road_lines_data.h @@ -1,5 +1,6 @@ #ifndef ROAD_LINES_DATA_H #define ROAD_LINES_DATA_H +#include "callable.h" class RoadLinesData { String road_lines_path; uint32_t road_lines_hash(const Vector3 &v); @@ -7,6 +8,7 @@ class RoadLinesData { protected: RoadLinesData(); static RoadLinesData *singleton; + _Signal lines_updated; public: struct road_line { @@ -16,6 +18,7 @@ public: int pattern; int flags; Dictionary metadata; + _Signal line_updated; }; HashMap lines; static RoadLinesData *get_singleton();