From 01ebb0063cde2a65be60ca7aecb5a9159c0d85c0 Mon Sep 17 00:00:00 2001 From: q66 Date: Thu, 16 Jul 2015 01:37:37 +0100 Subject: [PATCH] add new signal API --- ostd/signal.hh | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 ostd/signal.hh diff --git a/ostd/signal.hh b/ostd/signal.hh new file mode 100644 index 0000000..6e2e51a --- /dev/null +++ b/ostd/signal.hh @@ -0,0 +1,79 @@ +/* Signals/slots for OctaSTD. + * + * This file is part of OctaSTD. See COPYING.md for futher information. + */ + +#ifndef OSTD_SIGNAL_HH +#define OSTD_SIGNAL_HH + +#include "ostd/functional.hh" +#include "ostd/utility.hh" + +namespace ostd { + +template +struct Event { + Event(C *cl = nullptr): p_class(cl), p_funcs(nullptr), p_nfuncs(0) {} + + Event(const Event &ev): p_class(ev.p_class), p_nfuncs(ev.p_nfuncs) { + using Func = Function; + Func *nbuf = (Func *)new byte[sizeof(Func) * p_nfuncs]; + for (Size i = 0; i < p_nfuncs; ++i) + new (&nbuf[i]) Func(ev.p_funcs[i]); + p_funcs = nbuf; + } + + Event(Event &&ev): p_class(ev.p_class), p_funcs(ev.p_funcs), + p_nfuncs(ev.p_nfuncs) { + ev.p_class = nullptr; + ev.p_funcs = nullptr; + ev.p_nfuncs = 0; + } + + ~Event() { + for (Size i = 0; i < p_nfuncs; ++i) + p_funcs[i].~Function(); + delete[] (byte *)p_funcs; + } + + template + Size connect(F func) { + using Func = Function; + Func *nbuf = (Func *)new byte[sizeof(Func) * (p_nfuncs + 1)]; + for (Size i = 0; i < p_nfuncs; ++i) { + new (&nbuf[i]) Func(move(p_funcs[i])); + p_funcs[i].~Func(); + } + new (&nbuf[p_nfuncs]) Func(func); + delete[] (byte *)p_funcs; + p_funcs = nbuf; + return p_nfuncs++; + } + + bool disconnect(Size idx) { + if ((idx >= p_nfuncs) || !p_funcs[idx]) return false; + p_funcs[idx] = nullptr; + return true; + } + + template + void emit(Args &&...args) { + if (!p_class) return; + for (Size i = 0; i < p_nfuncs; ++i) + if (p_funcs[i]) p_funcs[i](*p_class, args...); + } + + template + void operator()(Args &&...args) { + emit(forward(args)...); + } + +private: + C *p_class; + Function *p_funcs; + Size p_nfuncs; +}; + +} /* namespace ostd */ + +#endif \ No newline at end of file