Note! This project has moved to github.com/armmbed/mbed-events

Dependents:   SimpleHTTPExample

This repository has been superceded

This project has moved to mbed-events

Composable event loops combine the cheap synchronicity of event loops with the composability of preempted threads.

Two modular event queue classes are provided:

  • EventLoop - for loops coupled with a c++ managed thread
  • EventQueue - for manually managed event queues

The Event class takes advantage of the extensibility of FuncPtr to allow an event to be passed through APIs as a normal function.

More information on composable event loops.

Committer:
Christopher Haster
Date:
Wed Apr 20 11:43:51 2016 -0500
Revision:
0:b1b901ae3696
Child:
2:11cda6bead99
Initial commit of Event and EventQueue classes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Christopher Haster 0:b1b901ae3696 1 /* Event
Christopher Haster 0:b1b901ae3696 2 *
Christopher Haster 0:b1b901ae3696 3 * Pendable event
Christopher Haster 0:b1b901ae3696 4 */
Christopher Haster 0:b1b901ae3696 5 #ifndef EVENT_H
Christopher Haster 0:b1b901ae3696 6 #define EVENT_H
Christopher Haster 0:b1b901ae3696 7
Christopher Haster 0:b1b901ae3696 8 #include "EventQueue.h"
Christopher Haster 0:b1b901ae3696 9 #include "FuncPtr.h"
Christopher Haster 0:b1b901ae3696 10 #include "Binder.h"
Christopher Haster 0:b1b901ae3696 11
Christopher Haster 0:b1b901ae3696 12
Christopher Haster 0:b1b901ae3696 13 /** Pendable event class
Christopher Haster 0:b1b901ae3696 14 */
Christopher Haster 0:b1b901ae3696 15 template <typename F>
Christopher Haster 0:b1b901ae3696 16 class Event;
Christopher Haster 0:b1b901ae3696 17
Christopher Haster 0:b1b901ae3696 18 /** Pendable event class
Christopher Haster 0:b1b901ae3696 19 */
Christopher Haster 0:b1b901ae3696 20 template <typename A0, typename A1, typename A2, typename A3>
Christopher Haster 0:b1b901ae3696 21 class Event<void(A0, A1, A2, A3)> {
Christopher Haster 0:b1b901ae3696 22 public:
Christopher Haster 0:b1b901ae3696 23 /** Create an unbound event
Christopher Haster 0:b1b901ae3696 24 */
Christopher Haster 0:b1b901ae3696 25 Event() {}
Christopher Haster 0:b1b901ae3696 26
Christopher Haster 0:b1b901ae3696 27 /** Create an event bound to a queue
Christopher Haster 0:b1b901ae3696 28 */
Christopher Haster 0:b1b901ae3696 29 Event(EventQueue *queue, FuncPtr<void(A0, A1, A2, A3)> callback) {
Christopher Haster 0:b1b901ae3696 30 attach(queue, callback);
Christopher Haster 0:b1b901ae3696 31 }
Christopher Haster 0:b1b901ae3696 32
Christopher Haster 0:b1b901ae3696 33 /** Safe lifetime management
Christopher Haster 0:b1b901ae3696 34 */
Christopher Haster 0:b1b901ae3696 35 ~Event() {
Christopher Haster 0:b1b901ae3696 36 cancel();
Christopher Haster 0:b1b901ae3696 37 }
Christopher Haster 0:b1b901ae3696 38
Christopher Haster 0:b1b901ae3696 39 /** Attach an event to a queue
Christopher Haster 0:b1b901ae3696 40 */
Christopher Haster 0:b1b901ae3696 41 void attach(EventQueue *queue, FuncPtr<void(A0, A1, A2, A3)> callback) {
Christopher Haster 0:b1b901ae3696 42 _queue = queue;
Christopher Haster 0:b1b901ae3696 43 _callback.attach(callback);
Christopher Haster 0:b1b901ae3696 44 }
Christopher Haster 0:b1b901ae3696 45
Christopher Haster 0:b1b901ae3696 46 /** Dispatch the event onto the bound queue
Christopher Haster 0:b1b901ae3696 47 */
Christopher Haster 0:b1b901ae3696 48 void call(A0 a0, A1 a1, A2 a2, A3 a3) {
Christopher Haster 0:b1b901ae3696 49 _bind.attach(_callback, a0, a1, a2, a3);
Christopher Haster 0:b1b901ae3696 50 _event.callback = Binder<void(A0, A1, A2, A3), A0, A1, A2, A3>::thunk;
Christopher Haster 0:b1b901ae3696 51 _event.data = &_bind;
Christopher Haster 0:b1b901ae3696 52 _queue->event_register(&_event);
Christopher Haster 0:b1b901ae3696 53 }
Christopher Haster 0:b1b901ae3696 54
Christopher Haster 0:b1b901ae3696 55 /** Dispatch the event onto the bound queue
Christopher Haster 0:b1b901ae3696 56 */
Christopher Haster 0:b1b901ae3696 57 void operator()(A0 a0, A1 a1, A2 a2, A3 a3) {
Christopher Haster 0:b1b901ae3696 58 return call(a0, a1, a2, a3);
Christopher Haster 0:b1b901ae3696 59 }
Christopher Haster 0:b1b901ae3696 60
Christopher Haster 0:b1b901ae3696 61 /** Test if event has been bound
Christopher Haster 0:b1b901ae3696 62 */
Christopher Haster 0:b1b901ae3696 63 operator bool() const {
Christopher Haster 0:b1b901ae3696 64 return _callback && _queue;
Christopher Haster 0:b1b901ae3696 65 }
Christopher Haster 0:b1b901ae3696 66
Christopher Haster 0:b1b901ae3696 67 /** Static thunk for passing as C-style function
Christopher Haster 0:b1b901ae3696 68 * @param data Event to dispatch passed as void pointer
Christopher Haster 0:b1b901ae3696 69 */
Christopher Haster 0:b1b901ae3696 70 static void thunk(void *data, A0 a0, A1 a1, A2 a2, A3 a3) {
Christopher Haster 0:b1b901ae3696 71 return static_cast<Event<void(A0, A1, A2, A3)>*>(data)
Christopher Haster 0:b1b901ae3696 72 ->call(a0, a1, a2, a3);
Christopher Haster 0:b1b901ae3696 73 }
Christopher Haster 0:b1b901ae3696 74
Christopher Haster 0:b1b901ae3696 75 /** Cancel a pending event
Christopher Haster 0:b1b901ae3696 76 */
Christopher Haster 0:b1b901ae3696 77 void cancel() {
Christopher Haster 0:b1b901ae3696 78 _queue->event_unregister(&_event);
Christopher Haster 0:b1b901ae3696 79 }
Christopher Haster 0:b1b901ae3696 80
Christopher Haster 0:b1b901ae3696 81 private:
Christopher Haster 0:b1b901ae3696 82 EventQueue *_queue;
Christopher Haster 0:b1b901ae3696 83 EventQueue::event _event;
Christopher Haster 0:b1b901ae3696 84 FuncPtr<void(A0, A1, A2, A3)> _callback;
Christopher Haster 0:b1b901ae3696 85 Binder<void(A0, A1, A2, A3), A0, A1, A2, A3> _bind;
Christopher Haster 0:b1b901ae3696 86 };
Christopher Haster 0:b1b901ae3696 87
Christopher Haster 0:b1b901ae3696 88 /** Pendable event class
Christopher Haster 0:b1b901ae3696 89 */
Christopher Haster 0:b1b901ae3696 90 template <typename A0, typename A1, typename A2>
Christopher Haster 0:b1b901ae3696 91 class Event<void(A0, A1, A2)> {
Christopher Haster 0:b1b901ae3696 92 public:
Christopher Haster 0:b1b901ae3696 93 /** Create an unbound event
Christopher Haster 0:b1b901ae3696 94 */
Christopher Haster 0:b1b901ae3696 95 Event() {}
Christopher Haster 0:b1b901ae3696 96
Christopher Haster 0:b1b901ae3696 97 /** Create an event bound to a queue
Christopher Haster 0:b1b901ae3696 98 */
Christopher Haster 0:b1b901ae3696 99 Event(EventQueue *queue, FuncPtr<void(A0, A1, A2)> callback) {
Christopher Haster 0:b1b901ae3696 100 attach(queue, callback);
Christopher Haster 0:b1b901ae3696 101 }
Christopher Haster 0:b1b901ae3696 102
Christopher Haster 0:b1b901ae3696 103 /** Safe lifetime management
Christopher Haster 0:b1b901ae3696 104 */
Christopher Haster 0:b1b901ae3696 105 ~Event() {
Christopher Haster 0:b1b901ae3696 106 cancel();
Christopher Haster 0:b1b901ae3696 107 }
Christopher Haster 0:b1b901ae3696 108
Christopher Haster 0:b1b901ae3696 109 /** Attach an event to a queue
Christopher Haster 0:b1b901ae3696 110 */
Christopher Haster 0:b1b901ae3696 111 void attach(EventQueue *queue, FuncPtr<void(A0, A1, A2)> callback) {
Christopher Haster 0:b1b901ae3696 112 _queue = queue;
Christopher Haster 0:b1b901ae3696 113 _callback.attach(callback);
Christopher Haster 0:b1b901ae3696 114 }
Christopher Haster 0:b1b901ae3696 115
Christopher Haster 0:b1b901ae3696 116 /** Dispatch the event onto the bound queue
Christopher Haster 0:b1b901ae3696 117 */
Christopher Haster 0:b1b901ae3696 118 void call(A0 a0, A1 a1, A2 a2) {
Christopher Haster 0:b1b901ae3696 119 _bind.attach(_callback, a0, a1, a2);
Christopher Haster 0:b1b901ae3696 120 _event.callback = Binder<void(A0, A1, A2), A0, A1, A2>::thunk;
Christopher Haster 0:b1b901ae3696 121 _event.data = &_bind;
Christopher Haster 0:b1b901ae3696 122 _queue->event_register(&_event);
Christopher Haster 0:b1b901ae3696 123 }
Christopher Haster 0:b1b901ae3696 124
Christopher Haster 0:b1b901ae3696 125 /** Dispatch the event onto the bound queue
Christopher Haster 0:b1b901ae3696 126 */
Christopher Haster 0:b1b901ae3696 127 void operator()(A0 a0, A1 a1, A2 a2) {
Christopher Haster 0:b1b901ae3696 128 return call(a0, a1, a2);
Christopher Haster 0:b1b901ae3696 129 }
Christopher Haster 0:b1b901ae3696 130
Christopher Haster 0:b1b901ae3696 131 /** Test if event has been bound
Christopher Haster 0:b1b901ae3696 132 */
Christopher Haster 0:b1b901ae3696 133 operator bool() const {
Christopher Haster 0:b1b901ae3696 134 return _callback && _queue;
Christopher Haster 0:b1b901ae3696 135 }
Christopher Haster 0:b1b901ae3696 136
Christopher Haster 0:b1b901ae3696 137 /** Static thunk for passing as C-style function
Christopher Haster 0:b1b901ae3696 138 * @param data Event to dispatch passed as void pointer
Christopher Haster 0:b1b901ae3696 139 */
Christopher Haster 0:b1b901ae3696 140 static void thunk(void *data, A0 a0, A1 a1, A2 a2) {
Christopher Haster 0:b1b901ae3696 141 return static_cast<Event<void(A0, A1, A2)>*>(data)
Christopher Haster 0:b1b901ae3696 142 ->call(a0, a1, a2);
Christopher Haster 0:b1b901ae3696 143 }
Christopher Haster 0:b1b901ae3696 144
Christopher Haster 0:b1b901ae3696 145 /** Cancel a pending event
Christopher Haster 0:b1b901ae3696 146 */
Christopher Haster 0:b1b901ae3696 147 void cancel() {
Christopher Haster 0:b1b901ae3696 148 _queue->event_unregister(&_event);
Christopher Haster 0:b1b901ae3696 149 }
Christopher Haster 0:b1b901ae3696 150
Christopher Haster 0:b1b901ae3696 151 private:
Christopher Haster 0:b1b901ae3696 152 EventQueue *_queue;
Christopher Haster 0:b1b901ae3696 153 EventQueue::event _event;
Christopher Haster 0:b1b901ae3696 154 FuncPtr<void(A0, A1, A2)> _callback;
Christopher Haster 0:b1b901ae3696 155 Binder<void(A0, A1, A2), A0, A1, A2> _bind;
Christopher Haster 0:b1b901ae3696 156 };
Christopher Haster 0:b1b901ae3696 157
Christopher Haster 0:b1b901ae3696 158 /** Pendable event class
Christopher Haster 0:b1b901ae3696 159 */
Christopher Haster 0:b1b901ae3696 160 template <typename A0, typename A1>
Christopher Haster 0:b1b901ae3696 161 class Event<void(A0, A1)> {
Christopher Haster 0:b1b901ae3696 162 public:
Christopher Haster 0:b1b901ae3696 163 /** Create an unbound event
Christopher Haster 0:b1b901ae3696 164 */
Christopher Haster 0:b1b901ae3696 165 Event() {}
Christopher Haster 0:b1b901ae3696 166
Christopher Haster 0:b1b901ae3696 167 /** Create an event bound to a queue
Christopher Haster 0:b1b901ae3696 168 */
Christopher Haster 0:b1b901ae3696 169 Event(EventQueue *queue, FuncPtr<void(A0, A1)> callback) {
Christopher Haster 0:b1b901ae3696 170 attach(queue, callback);
Christopher Haster 0:b1b901ae3696 171 }
Christopher Haster 0:b1b901ae3696 172
Christopher Haster 0:b1b901ae3696 173 /** Safe lifetime management
Christopher Haster 0:b1b901ae3696 174 */
Christopher Haster 0:b1b901ae3696 175 ~Event() {
Christopher Haster 0:b1b901ae3696 176 cancel();
Christopher Haster 0:b1b901ae3696 177 }
Christopher Haster 0:b1b901ae3696 178
Christopher Haster 0:b1b901ae3696 179 /** Attach an event to a queue
Christopher Haster 0:b1b901ae3696 180 */
Christopher Haster 0:b1b901ae3696 181 void attach(EventQueue *queue, FuncPtr<void(A0, A1)> callback) {
Christopher Haster 0:b1b901ae3696 182 _queue = queue;
Christopher Haster 0:b1b901ae3696 183 _callback.attach(callback);
Christopher Haster 0:b1b901ae3696 184 }
Christopher Haster 0:b1b901ae3696 185
Christopher Haster 0:b1b901ae3696 186 /** Dispatch the event onto the bound queue
Christopher Haster 0:b1b901ae3696 187 */
Christopher Haster 0:b1b901ae3696 188 void call(A0 a0, A1 a1) {
Christopher Haster 0:b1b901ae3696 189 _bind.attach(_callback, a0, a1);
Christopher Haster 0:b1b901ae3696 190 _event.callback = Binder<void(A0, A1), A0, A1>::thunk;
Christopher Haster 0:b1b901ae3696 191 _event.data = &_bind;
Christopher Haster 0:b1b901ae3696 192 _queue->event_register(&_event);
Christopher Haster 0:b1b901ae3696 193 }
Christopher Haster 0:b1b901ae3696 194
Christopher Haster 0:b1b901ae3696 195 /** Dispatch the event onto the bound queue
Christopher Haster 0:b1b901ae3696 196 */
Christopher Haster 0:b1b901ae3696 197 void operator()(A0 a0, A1 a1) {
Christopher Haster 0:b1b901ae3696 198 return call(a0, a1);
Christopher Haster 0:b1b901ae3696 199 }
Christopher Haster 0:b1b901ae3696 200
Christopher Haster 0:b1b901ae3696 201 /** Test if event has been bound
Christopher Haster 0:b1b901ae3696 202 */
Christopher Haster 0:b1b901ae3696 203 operator bool() const {
Christopher Haster 0:b1b901ae3696 204 return _callback && _queue;
Christopher Haster 0:b1b901ae3696 205 }
Christopher Haster 0:b1b901ae3696 206
Christopher Haster 0:b1b901ae3696 207 /** Static thunk for passing as C-style function
Christopher Haster 0:b1b901ae3696 208 * @param data Event to dispatch passed as void pointer
Christopher Haster 0:b1b901ae3696 209 */
Christopher Haster 0:b1b901ae3696 210 static void thunk(void *data, A0 a0, A1 a1) {
Christopher Haster 0:b1b901ae3696 211 return static_cast<Event<void(A0, A1)>*>(data)
Christopher Haster 0:b1b901ae3696 212 ->call(a0, a1);
Christopher Haster 0:b1b901ae3696 213 }
Christopher Haster 0:b1b901ae3696 214
Christopher Haster 0:b1b901ae3696 215 /** Cancel a pending event
Christopher Haster 0:b1b901ae3696 216 */
Christopher Haster 0:b1b901ae3696 217 void cancel() {
Christopher Haster 0:b1b901ae3696 218 _queue->event_unregister(&_event);
Christopher Haster 0:b1b901ae3696 219 }
Christopher Haster 0:b1b901ae3696 220
Christopher Haster 0:b1b901ae3696 221 private:
Christopher Haster 0:b1b901ae3696 222 EventQueue *_queue;
Christopher Haster 0:b1b901ae3696 223 EventQueue::event _event;
Christopher Haster 0:b1b901ae3696 224 FuncPtr<void(A0, A1)> _callback;
Christopher Haster 0:b1b901ae3696 225 Binder<void(A0, A1), A0, A1> _bind;
Christopher Haster 0:b1b901ae3696 226 };
Christopher Haster 0:b1b901ae3696 227
Christopher Haster 0:b1b901ae3696 228 /** Pendable event class
Christopher Haster 0:b1b901ae3696 229 */
Christopher Haster 0:b1b901ae3696 230 template <typename A0>
Christopher Haster 0:b1b901ae3696 231 class Event<void(A0)> {
Christopher Haster 0:b1b901ae3696 232 public:
Christopher Haster 0:b1b901ae3696 233 /** Create an unbound event
Christopher Haster 0:b1b901ae3696 234 */
Christopher Haster 0:b1b901ae3696 235 Event() {}
Christopher Haster 0:b1b901ae3696 236
Christopher Haster 0:b1b901ae3696 237 /** Create an event bound to a queue
Christopher Haster 0:b1b901ae3696 238 */
Christopher Haster 0:b1b901ae3696 239 Event(EventQueue *queue, FuncPtr<void(A0)> callback) {
Christopher Haster 0:b1b901ae3696 240 attach(queue, callback);
Christopher Haster 0:b1b901ae3696 241 }
Christopher Haster 0:b1b901ae3696 242
Christopher Haster 0:b1b901ae3696 243 /** Safe lifetime management
Christopher Haster 0:b1b901ae3696 244 */
Christopher Haster 0:b1b901ae3696 245 ~Event() {
Christopher Haster 0:b1b901ae3696 246 cancel();
Christopher Haster 0:b1b901ae3696 247 }
Christopher Haster 0:b1b901ae3696 248
Christopher Haster 0:b1b901ae3696 249 /** Attach an event to a queue
Christopher Haster 0:b1b901ae3696 250 */
Christopher Haster 0:b1b901ae3696 251 void attach(EventQueue *queue, FuncPtr<void(A0)> callback) {
Christopher Haster 0:b1b901ae3696 252 _queue = queue;
Christopher Haster 0:b1b901ae3696 253 _callback.attach(callback);
Christopher Haster 0:b1b901ae3696 254 }
Christopher Haster 0:b1b901ae3696 255
Christopher Haster 0:b1b901ae3696 256 /** Dispatch the event onto the bound queue
Christopher Haster 0:b1b901ae3696 257 */
Christopher Haster 0:b1b901ae3696 258 void call(A0 a0) {
Christopher Haster 0:b1b901ae3696 259 _bind.attach(_callback, a0);
Christopher Haster 0:b1b901ae3696 260 _event.callback = Binder<void(A0), A0>::thunk;
Christopher Haster 0:b1b901ae3696 261 _event.data = &_bind;
Christopher Haster 0:b1b901ae3696 262 _queue->event_register(&_event);
Christopher Haster 0:b1b901ae3696 263 }
Christopher Haster 0:b1b901ae3696 264
Christopher Haster 0:b1b901ae3696 265 /** Dispatch the event onto the bound queue
Christopher Haster 0:b1b901ae3696 266 */
Christopher Haster 0:b1b901ae3696 267 void operator()(A0 a0) {
Christopher Haster 0:b1b901ae3696 268 return call(a0);
Christopher Haster 0:b1b901ae3696 269 }
Christopher Haster 0:b1b901ae3696 270
Christopher Haster 0:b1b901ae3696 271 /** Test if event has been bound
Christopher Haster 0:b1b901ae3696 272 */
Christopher Haster 0:b1b901ae3696 273 operator bool() const {
Christopher Haster 0:b1b901ae3696 274 return _callback && _queue;
Christopher Haster 0:b1b901ae3696 275 }
Christopher Haster 0:b1b901ae3696 276
Christopher Haster 0:b1b901ae3696 277 /** Static thunk for passing as C-style function
Christopher Haster 0:b1b901ae3696 278 * @param data Event to dispatch passed as void pointer
Christopher Haster 0:b1b901ae3696 279 */
Christopher Haster 0:b1b901ae3696 280 static void thunk(void *data, A0 a0) {
Christopher Haster 0:b1b901ae3696 281 return static_cast<Event<void(A0)>*>(data)
Christopher Haster 0:b1b901ae3696 282 ->call(a0);
Christopher Haster 0:b1b901ae3696 283 }
Christopher Haster 0:b1b901ae3696 284
Christopher Haster 0:b1b901ae3696 285 /** Cancel a pending event
Christopher Haster 0:b1b901ae3696 286 */
Christopher Haster 0:b1b901ae3696 287 void cancel() {
Christopher Haster 0:b1b901ae3696 288 _queue->event_unregister(&_event);
Christopher Haster 0:b1b901ae3696 289 }
Christopher Haster 0:b1b901ae3696 290
Christopher Haster 0:b1b901ae3696 291 private:
Christopher Haster 0:b1b901ae3696 292 EventQueue *_queue;
Christopher Haster 0:b1b901ae3696 293 EventQueue::event _event;
Christopher Haster 0:b1b901ae3696 294 FuncPtr<void(A0)> _callback;
Christopher Haster 0:b1b901ae3696 295 Binder<void(A0), A0> _bind;
Christopher Haster 0:b1b901ae3696 296 };
Christopher Haster 0:b1b901ae3696 297
Christopher Haster 0:b1b901ae3696 298 /** Pendable event class
Christopher Haster 0:b1b901ae3696 299 */
Christopher Haster 0:b1b901ae3696 300 template <>
Christopher Haster 0:b1b901ae3696 301 class Event<void()> {
Christopher Haster 0:b1b901ae3696 302 public:
Christopher Haster 0:b1b901ae3696 303 /** Create an unbound event
Christopher Haster 0:b1b901ae3696 304 */
Christopher Haster 0:b1b901ae3696 305 Event() {}
Christopher Haster 0:b1b901ae3696 306
Christopher Haster 0:b1b901ae3696 307 /** Create an event bound to a queue
Christopher Haster 0:b1b901ae3696 308 */
Christopher Haster 0:b1b901ae3696 309 Event(EventQueue *queue, FuncPtr<void()> callback) {
Christopher Haster 0:b1b901ae3696 310 attach(queue, callback);
Christopher Haster 0:b1b901ae3696 311 }
Christopher Haster 0:b1b901ae3696 312
Christopher Haster 0:b1b901ae3696 313 /** Safe lifetime management
Christopher Haster 0:b1b901ae3696 314 */
Christopher Haster 0:b1b901ae3696 315 ~Event() {
Christopher Haster 0:b1b901ae3696 316 cancel();
Christopher Haster 0:b1b901ae3696 317 }
Christopher Haster 0:b1b901ae3696 318
Christopher Haster 0:b1b901ae3696 319 /** Attach an event to a queue
Christopher Haster 0:b1b901ae3696 320 */
Christopher Haster 0:b1b901ae3696 321 void attach(EventQueue *queue, FuncPtr<void()> callback) {
Christopher Haster 0:b1b901ae3696 322 _queue = queue;
Christopher Haster 0:b1b901ae3696 323 _callback.attach(callback);
Christopher Haster 0:b1b901ae3696 324 }
Christopher Haster 0:b1b901ae3696 325
Christopher Haster 0:b1b901ae3696 326 /** Dispatch the event onto the bound queue
Christopher Haster 0:b1b901ae3696 327 */
Christopher Haster 0:b1b901ae3696 328 void call() {
Christopher Haster 0:b1b901ae3696 329 _event.callback = FuncPtr<void()>::thunk;
Christopher Haster 0:b1b901ae3696 330 _event.data = &_callback;
Christopher Haster 0:b1b901ae3696 331 _queue->event_register(&_event);
Christopher Haster 0:b1b901ae3696 332 }
Christopher Haster 0:b1b901ae3696 333
Christopher Haster 0:b1b901ae3696 334 /** Dispatch the event onto the bound queue
Christopher Haster 0:b1b901ae3696 335 */
Christopher Haster 0:b1b901ae3696 336 void operator()() {
Christopher Haster 0:b1b901ae3696 337 return call();
Christopher Haster 0:b1b901ae3696 338 }
Christopher Haster 0:b1b901ae3696 339
Christopher Haster 0:b1b901ae3696 340 /** Test if event has been bound
Christopher Haster 0:b1b901ae3696 341 */
Christopher Haster 0:b1b901ae3696 342 operator bool() const {
Christopher Haster 0:b1b901ae3696 343 return _callback && _queue;
Christopher Haster 0:b1b901ae3696 344 }
Christopher Haster 0:b1b901ae3696 345
Christopher Haster 0:b1b901ae3696 346 /** Static thunk for passing as C-style function
Christopher Haster 0:b1b901ae3696 347 * @param data Event to dispatch passed as void pointer
Christopher Haster 0:b1b901ae3696 348 */
Christopher Haster 0:b1b901ae3696 349 static void thunk(void *data) {
Christopher Haster 0:b1b901ae3696 350 return static_cast<Event<void()>*>(data)
Christopher Haster 0:b1b901ae3696 351 ->call();
Christopher Haster 0:b1b901ae3696 352 }
Christopher Haster 0:b1b901ae3696 353
Christopher Haster 0:b1b901ae3696 354 /** Cancel a pending event
Christopher Haster 0:b1b901ae3696 355 */
Christopher Haster 0:b1b901ae3696 356 void cancel() {
Christopher Haster 0:b1b901ae3696 357 _queue->event_unregister(&_event);
Christopher Haster 0:b1b901ae3696 358 }
Christopher Haster 0:b1b901ae3696 359
Christopher Haster 0:b1b901ae3696 360 private:
Christopher Haster 0:b1b901ae3696 361 EventQueue *_queue;
Christopher Haster 0:b1b901ae3696 362 EventQueue::event _event;
Christopher Haster 0:b1b901ae3696 363 FuncPtr<void()> _callback;
Christopher Haster 0:b1b901ae3696 364 };
Christopher Haster 0:b1b901ae3696 365
Christopher Haster 0:b1b901ae3696 366
Christopher Haster 0:b1b901ae3696 367 #endif