libpromeki main
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
signal.h
Go to the documentation of this file.
1
8#pragma once
9
10#include <tuple>
11#include <functional>
14
16
27template <typename... Args> class Signal {
28 public:
30 using Function = std::function<void(Args...)>;
31
33 template <typename T> struct removeConstAndRef {
34 using type = std::remove_const_t<std::remove_reference_t<T>>;
35 };
36
38 template <typename T> using RemoveConstAndRef = typename removeConstAndRef<T>::type;
39
54 return { Variant(RemoveConstAndRef<Args>(args))... };
55 }
56
62 Signal(void *owner = nullptr, const char *prototype = nullptr) :
63 _owner(owner), _prototype(prototype) {}
64
68 void *owner() const { return _owner; }
69
73 const char *prototype() const { return _prototype; }
74
86 size_t connect(Function slot, void *ptr = nullptr) {
87 size_t slotID = _slots.size();
88 _slots += Info(slot, ptr);
89 return slotID;
90 }
91
108 template <typename T> size_t connect(T *obj, void (T::*memberFunction)(Args...)) {
109 size_t slotID = _slots.size();
110 _slots += Info(
111 ([obj, memberFunction](Args... args) {
112 (obj->*memberFunction)(args...);
113 }),
114 obj
115 );
116 return slotID;
117 }
118
127 void disconnect(size_t slotID) {
128 _slots.remove(slotID);
129 return;
130 }
131
144 template <typename T> void disconnect(const T *object, void (T::*memberFunction)(Args...)) {
145 _slots.removeIf([object, memberFunction](const Info &info) {
146 return static_cast<const T *>(info.object) == object && info.func == memberFunction;
147 });
148 return;
149 }
150
157 template <typename T> void disconnectFromObject(const T *object) {
158 _slots.removeIf([object](const Info &info) { return static_cast<const T *>(info.object) == object; });
159 return;
160 }
161
170 void emit(Args... args) const {
171 for (const auto &slot : _slots) slot.func(args...);
172 return;
173 }
174
175
176 private:
177 class Info {
178 public:
179 Function func;
180 const void *object = nullptr;
181
182 Info(Function f, const void *obj = nullptr) : func(f), object(obj) {}
183 };
184
185 void *_owner = nullptr;
186 const char *_prototype = nullptr;
187 List<Info> _slots;
188};
189
191
Dynamic array container wrapping std::vector.
Definition list.h:40
Iterator remove(ConstIterator pos)
Removes the element at the given iterator position.
Definition list.h:402
size_t size() const noexcept
Returns the number of elements in the list.
Definition list.h:301
void removeIf(TestFunc func)
Runs a test function on all the items and removes them if it returns true.
Definition list.h:429
Type-safe signal/slot mechanism for decoupled event notification.
Definition signal.h:27
void disconnectFromObject(const T *object)
Disconnects all slots connected from the given object.
Definition signal.h:157
Signal(void *owner=nullptr, const char *prototype=nullptr)
Signal constructor.
Definition signal.h:62
size_t connect(Function slot, void *ptr=nullptr)
Connects this signal to a callable (lambda or function).
Definition signal.h:86
const char * prototype() const
Returns the prototype string, or nullptr if not defined.
Definition signal.h:73
void disconnect(const T *object, void(T::*memberFunction)(Args...))
Disconnects a slot by its object and member function.
Definition signal.h:144
void disconnect(size_t slotID)
Disconnects a slot by its connection ID.
Definition signal.h:127
typename removeConstAndRef< T >::type RemoveConstAndRef
Convenience alias for removeConstAndRef.
Definition signal.h:38
static VariantList pack(Args... args)
Packs the arguments into a VariantList.
Definition signal.h:53
std::function< void(Args...)> Function
Callable type that slots must conform to.
Definition signal.h:30
void emit(Args... args) const
Emits this signal.
Definition signal.h:170
size_t connect(T *obj, void(T::*memberFunction)(Args...))
Connects this signal to an object member function.
Definition signal.h:108
void * owner() const
Returns the owner of this signal, or nullptr if not defined.
Definition signal.h:68
@ Info
Informational message.
#define PROMEKI_NAMESPACE_BEGIN
Starts a promeki namespace block.
Definition namespace.h:14
#define PROMEKI_NAMESPACE_END
Ends a promeki namespace block.
Definition namespace.h:19
Metafunction that strips const and reference qualifiers from a type.
Definition signal.h:33
VariantImpl< std::monostate, bool, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t, uint64_t, int64_t, float, double, String, DateTime, TimeStamp, Size2Du32, UUID, Timecode, Rational< int >, detail::VariantEnd > Variant
Concrete variant type instantiated with every type from PROMEKI_VARIANT_TYPES.
Definition variant.h:362