1.10
signal.h
1/*
2 * Copyright (C) 2018 Microchip Technology Inc. All rights reserved.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6#ifndef EGT_SIGNAL_H
7#define EGT_SIGNAL_H
8
14#include <cstdint>
15#include <egt/detail/cow.h>
16#include <egt/detail/meta.h>
17#include <functional>
18#include <vector>
19
20namespace egt
21{
22inline namespace v1
23{
24
28template<typename... Args>
29class Signal
30{
31public:
32
33 enum
34 {
36 };
37
41 using EventCallback = std::function<void(Args...)>;
42
46 using RegisterHandle = uint32_t;
47
60 {
61 if (handler)
62 {
63 // TODO: m_handle_counter can wrap, making the handle non-unique
64 auto handle = ++m_handle_counter;
65 m_callbacks->emplace_back(handler, handle);
66 return handle;
67 }
68
69 return 0;
70 }
71
76 {
77 return on_event(handler);
78 }
79
85 void invoke(Args... args)
86 {
87 if (!m_enabled)
88 return;
89
90 if (!m_callbacks)
91 return;
92
93 for (auto& callback : *m_callbacks)
94 callback.callback(args...);
95 }
96
100 void clear()
101 {
102 if (!m_callbacks)
103 return;
104
105 m_callbacks->clear();
106 }
107
114 {
115 if (!m_callbacks)
116 return;
117
118 auto i = std::find_if(m_callbacks->begin(), m_callbacks->end(),
119 [handle](const CallbackMeta & meta)
120 {
121 return meta.handle == handle;
122 });
123
124 if (i != m_callbacks->end())
125 m_callbacks->erase(i);
126 }
127
131 void disable()
132 {
133 m_enabled = false;
134 }
135
139 void enable()
140 {
141 m_enabled = true;
142 }
143
147 EGT_NODISCARD bool enabled() const { return m_enabled; }
148
149private:
150
154 RegisterHandle m_handle_counter{INVALID_HANDLE};
155
160 struct CallbackMeta
161 {
162 CallbackMeta(EventCallback c,
163 RegisterHandle h) noexcept
164 : callback(std::move(c)),
165 handle(h)
166 {}
167
168 EventCallback callback;
169 RegisterHandle handle{0};
170 };
171
173 using CallbackArray = std::vector<CallbackMeta>;
174
176 detail::CopyOnWriteAllocate<CallbackArray> m_callbacks;
177
179 bool m_enabled{true};
180};
181
182template<typename... Args>
184{
185public:
186
187 enum
188 {
190 };
191
192 using EventCallback = std::function<void(Args...)>;
193
194 using RegisterHandle = uint32_t;
195
197 {
198 m_src_signal = src;
199 }
200
202 {
203 return m_src_signal->on_event(handler);
204 }
205
207 {
208 return m_src_signal->on_event(handler);
209 }
210
211 void invoke(Args... args)
212 {
213 m_src_signal->invoke(args...);
214 }
215
216 void clear()
217 {
219 }
220
222 {
223 m_src_signal->remove(handle);
224 }
225
226 void disable()
227 {
229 }
230
231 void enable()
232 {
234 }
235
236 EGT_NODISCARD bool enabled() const
237 {
238 return m_src_signal->enable();
239 }
240
242 {
243 m_src_signal = src;
244 }
245
246protected:
247 Signal<Args...>* m_src_signal{nullptr};
248
249};
250
251}
252}
253
254#endif
Definition signal.h:184
void invoke(Args... args)
Definition signal.h:211
RegisterHandle on_event(const EventCallback &handler)
Definition signal.h:201
EGT_NODISCARD bool enabled() const
Definition signal.h:236
Signal< Args... > * m_src_signal
Definition signal.h:247
void enable()
Definition signal.h:231
RegisterHandle operator()(const EventCallback &handler)
Definition signal.h:206
void disable()
Definition signal.h:226
void set_src_signal(Signal<> *src)
Definition signal.h:241
uint32_t RegisterHandle
Definition signal.h:194
void remove(RegisterHandle handle)
Definition signal.h:221
void clear()
Definition signal.h:216
SignalW(Signal< Args... > *src)
Definition signal.h:196
@ INVALID_HANDLE
Definition signal.h:189
std::function< void(Args...)> EventCallback
Definition signal.h:192
Signal class used for defining a signal and dispatching events.
Definition signal.h:30
@ INVALID_HANDLE
Definition signal.h:35
void invoke(Args... args)
Invoke all handlers with the specified args.
Definition signal.h:85
RegisterHandle on_event(const EventCallback &handler)
Add an event handler to be called when the widget generates an event.
Definition signal.h:59
EGT_NODISCARD bool enabled() const
Is callback invoking enabled?
Definition signal.h:147
void enable()
Enable invoking callbacks.
Definition signal.h:139
RegisterHandle operator()(const EventCallback &handler)
Convenience wrapper for on_event().
Definition signal.h:75
void disable()
Disable invoking callbacks.
Definition signal.h:131
uint32_t RegisterHandle
Handle type.
Definition signal.h:46
void remove(RegisterHandle handle)
Remove an event handler.
Definition signal.h:113
void clear()
Clear all registered event handlers.
Definition signal.h:100
std::function< void(Args...)> EventCallback
Event handler callback function.
Definition signal.h:41
EGT framework namespace.
Definition animation.h:24