mbed-os for GR-LYCHEE

Dependents:   mbed-os-example-blinky-gr-lychee GR-Boads_Camera_sample GR-Boards_Audio_Recoder GR-Boads_Camera_DisplayApp ... more

Committer:
dkato
Date:
Fri Feb 02 05:42:23 2018 +0000
Revision:
0:f782d9c66c49
mbed-os for GR-LYCHEE

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:f782d9c66c49 1 /* events
dkato 0:f782d9c66c49 2 * Copyright (c) 2016 ARM Limited
dkato 0:f782d9c66c49 3 *
dkato 0:f782d9c66c49 4 * Licensed under the Apache License, Version 2.0 (the "License");
dkato 0:f782d9c66c49 5 * you may not use this file except in compliance with the License.
dkato 0:f782d9c66c49 6 * You may obtain a copy of the License at
dkato 0:f782d9c66c49 7 *
dkato 0:f782d9c66c49 8 * http://www.apache.org/licenses/LICENSE-2.0
dkato 0:f782d9c66c49 9 *
dkato 0:f782d9c66c49 10 * Unless required by applicable law or agreed to in writing, software
dkato 0:f782d9c66c49 11 * distributed under the License is distributed on an "AS IS" BASIS,
dkato 0:f782d9c66c49 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dkato 0:f782d9c66c49 13 * See the License for the specific language governing permissions and
dkato 0:f782d9c66c49 14 * limitations under the License.
dkato 0:f782d9c66c49 15 */
dkato 0:f782d9c66c49 16 #ifndef EVENT_H
dkato 0:f782d9c66c49 17 #define EVENT_H
dkato 0:f782d9c66c49 18
dkato 0:f782d9c66c49 19 #include "events/EventQueue.h"
dkato 0:f782d9c66c49 20 #include "platform/mbed_assert.h"
dkato 0:f782d9c66c49 21
dkato 0:f782d9c66c49 22 namespace events {
dkato 0:f782d9c66c49 23 /** \addtogroup events */
dkato 0:f782d9c66c49 24 /** @{*/
dkato 0:f782d9c66c49 25
dkato 0:f782d9c66c49 26 /** Event
dkato 0:f782d9c66c49 27 *
dkato 0:f782d9c66c49 28 * Representation of an event for fine-grain dispatch control
dkato 0:f782d9c66c49 29 */
dkato 0:f782d9c66c49 30 template <typename F>
dkato 0:f782d9c66c49 31 class Event;
dkato 0:f782d9c66c49 32
dkato 0:f782d9c66c49 33 /** Event
dkato 0:f782d9c66c49 34 *
dkato 0:f782d9c66c49 35 * Representation of an event for fine-grain dispatch control
dkato 0:f782d9c66c49 36 */
dkato 0:f782d9c66c49 37 template <>
dkato 0:f782d9c66c49 38 class Event<void()> {
dkato 0:f782d9c66c49 39 public:
dkato 0:f782d9c66c49 40 /** Create an event
dkato 0:f782d9c66c49 41 *
dkato 0:f782d9c66c49 42 * Constructs an event bound to the specified event queue. The specified
dkato 0:f782d9c66c49 43 * callback acts as the target for the event and is executed in the
dkato 0:f782d9c66c49 44 * context of the event queue's dispatch loop once posted.
dkato 0:f782d9c66c49 45 *
dkato 0:f782d9c66c49 46 * @param q Event queue to dispatch on
dkato 0:f782d9c66c49 47 * @param f Function to execute when the event is dispatched
dkato 0:f782d9c66c49 48 * @param c0..c4 Arguments to bind to the callback, these arguments are
dkato 0:f782d9c66c49 49 * allocated on an irq-safe allocator from the event queue's
dkato 0:f782d9c66c49 50 * memory pool. Must be type-compatible with b0..b4, the
dkato 0:f782d9c66c49 51 * arguments to the underlying callback.
dkato 0:f782d9c66c49 52 */
dkato 0:f782d9c66c49 53 template <typename F>
dkato 0:f782d9c66c49 54 Event(EventQueue *q, F f) {
dkato 0:f782d9c66c49 55 _event = static_cast<struct event *>(
dkato 0:f782d9c66c49 56 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
dkato 0:f782d9c66c49 57
dkato 0:f782d9c66c49 58 if (_event) {
dkato 0:f782d9c66c49 59 _event->equeue = &q->_equeue;
dkato 0:f782d9c66c49 60 _event->id = 0;
dkato 0:f782d9c66c49 61 _event->delay = 0;
dkato 0:f782d9c66c49 62 _event->period = -1;
dkato 0:f782d9c66c49 63
dkato 0:f782d9c66c49 64 _event->post = &Event::event_post<F>;
dkato 0:f782d9c66c49 65 _event->dtor = &Event::event_dtor<F>;
dkato 0:f782d9c66c49 66
dkato 0:f782d9c66c49 67 new (_event+1) F(f);
dkato 0:f782d9c66c49 68
dkato 0:f782d9c66c49 69 _event->ref = 1;
dkato 0:f782d9c66c49 70 }
dkato 0:f782d9c66c49 71 }
dkato 0:f782d9c66c49 72
dkato 0:f782d9c66c49 73 /** Copy constructor for events
dkato 0:f782d9c66c49 74 */
dkato 0:f782d9c66c49 75 Event(const Event &e) {
dkato 0:f782d9c66c49 76 _event = 0;
dkato 0:f782d9c66c49 77 if (e._event) {
dkato 0:f782d9c66c49 78 _event = e._event;
dkato 0:f782d9c66c49 79 _event->ref += 1;
dkato 0:f782d9c66c49 80 }
dkato 0:f782d9c66c49 81 }
dkato 0:f782d9c66c49 82
dkato 0:f782d9c66c49 83 /** Assignment operator for events
dkato 0:f782d9c66c49 84 */
dkato 0:f782d9c66c49 85 Event &operator=(const Event &that) {
dkato 0:f782d9c66c49 86 if (this != &that) {
dkato 0:f782d9c66c49 87 this->~Event();
dkato 0:f782d9c66c49 88 new (this) Event(that);
dkato 0:f782d9c66c49 89 }
dkato 0:f782d9c66c49 90
dkato 0:f782d9c66c49 91 return *this;
dkato 0:f782d9c66c49 92 }
dkato 0:f782d9c66c49 93
dkato 0:f782d9c66c49 94 /** Destructor for events
dkato 0:f782d9c66c49 95 */
dkato 0:f782d9c66c49 96 ~Event() {
dkato 0:f782d9c66c49 97 if (_event) {
dkato 0:f782d9c66c49 98 _event->ref -= 1;
dkato 0:f782d9c66c49 99 if (_event->ref == 0) {
dkato 0:f782d9c66c49 100 _event->dtor(_event);
dkato 0:f782d9c66c49 101 equeue_dealloc(_event->equeue, _event);
dkato 0:f782d9c66c49 102 }
dkato 0:f782d9c66c49 103 }
dkato 0:f782d9c66c49 104 }
dkato 0:f782d9c66c49 105
dkato 0:f782d9c66c49 106 /** Configure the delay of an event
dkato 0:f782d9c66c49 107 *
dkato 0:f782d9c66c49 108 * @param delay Millisecond delay before dispatching the event
dkato 0:f782d9c66c49 109 */
dkato 0:f782d9c66c49 110 void delay(int delay) {
dkato 0:f782d9c66c49 111 if (_event) {
dkato 0:f782d9c66c49 112 _event->delay = delay;
dkato 0:f782d9c66c49 113 }
dkato 0:f782d9c66c49 114 }
dkato 0:f782d9c66c49 115
dkato 0:f782d9c66c49 116 /** Configure the period of an event
dkato 0:f782d9c66c49 117 *
dkato 0:f782d9c66c49 118 * @param period Millisecond period for repeatedly dispatching an event
dkato 0:f782d9c66c49 119 */
dkato 0:f782d9c66c49 120 void period(int period) {
dkato 0:f782d9c66c49 121 if (_event) {
dkato 0:f782d9c66c49 122 _event->period = period;
dkato 0:f782d9c66c49 123 }
dkato 0:f782d9c66c49 124 }
dkato 0:f782d9c66c49 125
dkato 0:f782d9c66c49 126 /** Posts an event onto the underlying event queue
dkato 0:f782d9c66c49 127 *
dkato 0:f782d9c66c49 128 * The event is posted to the underlying queue and is executed in the
dkato 0:f782d9c66c49 129 * context of the event queue's dispatch loop.
dkato 0:f782d9c66c49 130 *
dkato 0:f782d9c66c49 131 * The post function is irq safe and can act as a mechanism for moving
dkato 0:f782d9c66c49 132 * events out of irq contexts.
dkato 0:f782d9c66c49 133 *
dkato 0:f782d9c66c49 134 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 135 * @return A unique id that represents the posted event and can
dkato 0:f782d9c66c49 136 * be passed to EventQueue::cancel, or an id of 0 if
dkato 0:f782d9c66c49 137 * there is not enough memory to allocate the event.
dkato 0:f782d9c66c49 138 */
dkato 0:f782d9c66c49 139 int post() const {
dkato 0:f782d9c66c49 140 if (!_event) {
dkato 0:f782d9c66c49 141 return 0;
dkato 0:f782d9c66c49 142 }
dkato 0:f782d9c66c49 143
dkato 0:f782d9c66c49 144 _event->id = _event->post(_event);
dkato 0:f782d9c66c49 145 return _event->id;
dkato 0:f782d9c66c49 146 }
dkato 0:f782d9c66c49 147
dkato 0:f782d9c66c49 148 /** Posts an event onto the underlying event queue, returning void
dkato 0:f782d9c66c49 149 *
dkato 0:f782d9c66c49 150 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 151 */
dkato 0:f782d9c66c49 152 void call() const {
dkato 0:f782d9c66c49 153 MBED_UNUSED int id = post();
dkato 0:f782d9c66c49 154 MBED_ASSERT(id);
dkato 0:f782d9c66c49 155 }
dkato 0:f782d9c66c49 156
dkato 0:f782d9c66c49 157 /** Posts an event onto the underlying event queue, returning void
dkato 0:f782d9c66c49 158 *
dkato 0:f782d9c66c49 159 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 160 */
dkato 0:f782d9c66c49 161 void operator()() const {
dkato 0:f782d9c66c49 162 return call();
dkato 0:f782d9c66c49 163 }
dkato 0:f782d9c66c49 164
dkato 0:f782d9c66c49 165 /** Static thunk for passing as C-style function
dkato 0:f782d9c66c49 166 *
dkato 0:f782d9c66c49 167 * @param func Event to call passed as a void pointer
dkato 0:f782d9c66c49 168 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 169 */
dkato 0:f782d9c66c49 170 static void thunk(void *func) {
dkato 0:f782d9c66c49 171 return static_cast<Event*>(func)->call();
dkato 0:f782d9c66c49 172 }
dkato 0:f782d9c66c49 173
dkato 0:f782d9c66c49 174 /** Cancels the most recently posted event
dkato 0:f782d9c66c49 175 *
dkato 0:f782d9c66c49 176 * Attempts to cancel the most recently posted event. It is safe to call
dkato 0:f782d9c66c49 177 * cancel after an event has already been dispatched.
dkato 0:f782d9c66c49 178 *
dkato 0:f782d9c66c49 179 * The cancel function is irq safe.
dkato 0:f782d9c66c49 180 *
dkato 0:f782d9c66c49 181 * If called while the event queue's dispatch loop is active, the cancel
dkato 0:f782d9c66c49 182 * function does not garuntee that the event will not execute after it
dkato 0:f782d9c66c49 183 * returns, as the event may have already begun executing.
dkato 0:f782d9c66c49 184 */
dkato 0:f782d9c66c49 185 void cancel() const {
dkato 0:f782d9c66c49 186 if (_event) {
dkato 0:f782d9c66c49 187 equeue_cancel(_event->equeue, _event->id);
dkato 0:f782d9c66c49 188 }
dkato 0:f782d9c66c49 189 }
dkato 0:f782d9c66c49 190
dkato 0:f782d9c66c49 191 private:
dkato 0:f782d9c66c49 192 struct event {
dkato 0:f782d9c66c49 193 unsigned ref;
dkato 0:f782d9c66c49 194 equeue_t *equeue;
dkato 0:f782d9c66c49 195 int id;
dkato 0:f782d9c66c49 196
dkato 0:f782d9c66c49 197 int delay;
dkato 0:f782d9c66c49 198 int period;
dkato 0:f782d9c66c49 199
dkato 0:f782d9c66c49 200 int (*post)(struct event *);
dkato 0:f782d9c66c49 201 void (*dtor)(struct event *);
dkato 0:f782d9c66c49 202
dkato 0:f782d9c66c49 203 // F follows
dkato 0:f782d9c66c49 204 } *_event;
dkato 0:f782d9c66c49 205
dkato 0:f782d9c66c49 206 // Event attributes
dkato 0:f782d9c66c49 207 template <typename F>
dkato 0:f782d9c66c49 208 static int event_post(struct event *e) {
dkato 0:f782d9c66c49 209 typedef EventQueue::context00<F> C;
dkato 0:f782d9c66c49 210 void *p = equeue_alloc(e->equeue, sizeof(C));
dkato 0:f782d9c66c49 211 if (!p) {
dkato 0:f782d9c66c49 212 return 0;
dkato 0:f782d9c66c49 213 }
dkato 0:f782d9c66c49 214
dkato 0:f782d9c66c49 215 new (p) C(*(F*)(e + 1));
dkato 0:f782d9c66c49 216 equeue_event_delay(p, e->delay);
dkato 0:f782d9c66c49 217 equeue_event_period(p, e->period);
dkato 0:f782d9c66c49 218 equeue_event_dtor(p, &EventQueue::function_dtor<C>);
dkato 0:f782d9c66c49 219 return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
dkato 0:f782d9c66c49 220 }
dkato 0:f782d9c66c49 221
dkato 0:f782d9c66c49 222 template <typename F>
dkato 0:f782d9c66c49 223 static void event_dtor(struct event *e) {
dkato 0:f782d9c66c49 224 ((F*)(e + 1))->~F();
dkato 0:f782d9c66c49 225 }
dkato 0:f782d9c66c49 226
dkato 0:f782d9c66c49 227 public:
dkato 0:f782d9c66c49 228 /** Create an event
dkato 0:f782d9c66c49 229 * @see Event::Event
dkato 0:f782d9c66c49 230 */
dkato 0:f782d9c66c49 231 template <typename F, typename C0>
dkato 0:f782d9c66c49 232 Event(EventQueue *q, F f, C0 c0) {
dkato 0:f782d9c66c49 233 new (this) Event(q, EventQueue::context10<F, C0>(f, c0));
dkato 0:f782d9c66c49 234 }
dkato 0:f782d9c66c49 235
dkato 0:f782d9c66c49 236 /** Create an event
dkato 0:f782d9c66c49 237 * @see Event::Event
dkato 0:f782d9c66c49 238 */
dkato 0:f782d9c66c49 239 template <typename F, typename C0, typename C1>
dkato 0:f782d9c66c49 240 Event(EventQueue *q, F f, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 241 new (this) Event(q, EventQueue::context20<F, C0, C1>(f, c0, c1));
dkato 0:f782d9c66c49 242 }
dkato 0:f782d9c66c49 243
dkato 0:f782d9c66c49 244 /** Create an event
dkato 0:f782d9c66c49 245 * @see Event::Event
dkato 0:f782d9c66c49 246 */
dkato 0:f782d9c66c49 247 template <typename F, typename C0, typename C1, typename C2>
dkato 0:f782d9c66c49 248 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 249 new (this) Event(q, EventQueue::context30<F, C0, C1, C2>(f, c0, c1, c2));
dkato 0:f782d9c66c49 250 }
dkato 0:f782d9c66c49 251
dkato 0:f782d9c66c49 252 /** Create an event
dkato 0:f782d9c66c49 253 * @see Event::Event
dkato 0:f782d9c66c49 254 */
dkato 0:f782d9c66c49 255 template <typename F, typename C0, typename C1, typename C2, typename C3>
dkato 0:f782d9c66c49 256 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 257 new (this) Event(q, EventQueue::context40<F, C0, C1, C2, C3>(f, c0, c1, c2, c3));
dkato 0:f782d9c66c49 258 }
dkato 0:f782d9c66c49 259
dkato 0:f782d9c66c49 260 /** Create an event
dkato 0:f782d9c66c49 261 * @see Event::Event
dkato 0:f782d9c66c49 262 */
dkato 0:f782d9c66c49 263 template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
dkato 0:f782d9c66c49 264 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 265 new (this) Event(q, EventQueue::context50<F, C0, C1, C2, C3, C4>(f, c0, c1, c2, c3, c4));
dkato 0:f782d9c66c49 266 }
dkato 0:f782d9c66c49 267
dkato 0:f782d9c66c49 268 /** Create an event
dkato 0:f782d9c66c49 269 * @see Event::Event
dkato 0:f782d9c66c49 270 */
dkato 0:f782d9c66c49 271 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 272 Event(EventQueue *q, T *obj, R (T::*method)(B0), B0 b0) {
dkato 0:f782d9c66c49 273 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 274 }
dkato 0:f782d9c66c49 275
dkato 0:f782d9c66c49 276 /** Create an event
dkato 0:f782d9c66c49 277 * @see Event::Event
dkato 0:f782d9c66c49 278 */
dkato 0:f782d9c66c49 279 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 280 Event(EventQueue *q, const T *obj, R (T::*method)(B0) const, B0 b0) {
dkato 0:f782d9c66c49 281 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 282 }
dkato 0:f782d9c66c49 283
dkato 0:f782d9c66c49 284 /** Create an event
dkato 0:f782d9c66c49 285 * @see Event::Event
dkato 0:f782d9c66c49 286 */
dkato 0:f782d9c66c49 287 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 288 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0) volatile, B0 b0) {
dkato 0:f782d9c66c49 289 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 290 }
dkato 0:f782d9c66c49 291
dkato 0:f782d9c66c49 292 /** Create an event
dkato 0:f782d9c66c49 293 * @see Event::Event
dkato 0:f782d9c66c49 294 */
dkato 0:f782d9c66c49 295 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 296 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0) const volatile, B0 b0) {
dkato 0:f782d9c66c49 297 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 298 }
dkato 0:f782d9c66c49 299
dkato 0:f782d9c66c49 300 /** Create an event
dkato 0:f782d9c66c49 301 * @see Event::Event
dkato 0:f782d9c66c49 302 */
dkato 0:f782d9c66c49 303 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 304 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1), B0 b0, B1 b1) {
dkato 0:f782d9c66c49 305 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 306 }
dkato 0:f782d9c66c49 307
dkato 0:f782d9c66c49 308 /** Create an event
dkato 0:f782d9c66c49 309 * @see Event::Event
dkato 0:f782d9c66c49 310 */
dkato 0:f782d9c66c49 311 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 312 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1) const, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 313 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 314 }
dkato 0:f782d9c66c49 315
dkato 0:f782d9c66c49 316 /** Create an event
dkato 0:f782d9c66c49 317 * @see Event::Event
dkato 0:f782d9c66c49 318 */
dkato 0:f782d9c66c49 319 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 320 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1) volatile, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 321 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 322 }
dkato 0:f782d9c66c49 323
dkato 0:f782d9c66c49 324 /** Create an event
dkato 0:f782d9c66c49 325 * @see Event::Event
dkato 0:f782d9c66c49 326 */
dkato 0:f782d9c66c49 327 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 328 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1) const volatile, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 329 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 330 }
dkato 0:f782d9c66c49 331
dkato 0:f782d9c66c49 332 /** Create an event
dkato 0:f782d9c66c49 333 * @see Event::Event
dkato 0:f782d9c66c49 334 */
dkato 0:f782d9c66c49 335 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 336 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2), B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 337 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 338 }
dkato 0:f782d9c66c49 339
dkato 0:f782d9c66c49 340 /** Create an event
dkato 0:f782d9c66c49 341 * @see Event::Event
dkato 0:f782d9c66c49 342 */
dkato 0:f782d9c66c49 343 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 344 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2) const, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 345 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 346 }
dkato 0:f782d9c66c49 347
dkato 0:f782d9c66c49 348 /** Create an event
dkato 0:f782d9c66c49 349 * @see Event::Event
dkato 0:f782d9c66c49 350 */
dkato 0:f782d9c66c49 351 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 352 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2) volatile, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 353 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 354 }
dkato 0:f782d9c66c49 355
dkato 0:f782d9c66c49 356 /** Create an event
dkato 0:f782d9c66c49 357 * @see Event::Event
dkato 0:f782d9c66c49 358 */
dkato 0:f782d9c66c49 359 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 360 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2) const volatile, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 361 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 362 }
dkato 0:f782d9c66c49 363
dkato 0:f782d9c66c49 364 /** Create an event
dkato 0:f782d9c66c49 365 * @see Event::Event
dkato 0:f782d9c66c49 366 */
dkato 0:f782d9c66c49 367 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 368 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3), B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 369 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 370 }
dkato 0:f782d9c66c49 371
dkato 0:f782d9c66c49 372 /** Create an event
dkato 0:f782d9c66c49 373 * @see Event::Event
dkato 0:f782d9c66c49 374 */
dkato 0:f782d9c66c49 375 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 376 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3) const, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 377 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 378 }
dkato 0:f782d9c66c49 379
dkato 0:f782d9c66c49 380 /** Create an event
dkato 0:f782d9c66c49 381 * @see Event::Event
dkato 0:f782d9c66c49 382 */
dkato 0:f782d9c66c49 383 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 384 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 385 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 386 }
dkato 0:f782d9c66c49 387
dkato 0:f782d9c66c49 388 /** Create an event
dkato 0:f782d9c66c49 389 * @see Event::Event
dkato 0:f782d9c66c49 390 */
dkato 0:f782d9c66c49 391 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 392 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3) const volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 393 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 394 }
dkato 0:f782d9c66c49 395
dkato 0:f782d9c66c49 396 /** Create an event
dkato 0:f782d9c66c49 397 * @see Event::Event
dkato 0:f782d9c66c49 398 */
dkato 0:f782d9c66c49 399 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 400 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 401 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 402 }
dkato 0:f782d9c66c49 403
dkato 0:f782d9c66c49 404 /** Create an event
dkato 0:f782d9c66c49 405 * @see Event::Event
dkato 0:f782d9c66c49 406 */
dkato 0:f782d9c66c49 407 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 408 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, B4) const, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 409 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 410 }
dkato 0:f782d9c66c49 411
dkato 0:f782d9c66c49 412 /** Create an event
dkato 0:f782d9c66c49 413 * @see Event::Event
dkato 0:f782d9c66c49 414 */
dkato 0:f782d9c66c49 415 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 416 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4) volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 417 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 418 }
dkato 0:f782d9c66c49 419
dkato 0:f782d9c66c49 420 /** Create an event
dkato 0:f782d9c66c49 421 * @see Event::Event
dkato 0:f782d9c66c49 422 */
dkato 0:f782d9c66c49 423 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 424 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4) const volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 425 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 426 }
dkato 0:f782d9c66c49 427 };
dkato 0:f782d9c66c49 428
dkato 0:f782d9c66c49 429 /** Event
dkato 0:f782d9c66c49 430 *
dkato 0:f782d9c66c49 431 * Representation of an event for fine-grain dispatch control
dkato 0:f782d9c66c49 432 */
dkato 0:f782d9c66c49 433 template <typename A0>
dkato 0:f782d9c66c49 434 class Event<void(A0)> {
dkato 0:f782d9c66c49 435 public:
dkato 0:f782d9c66c49 436 /** Create an event
dkato 0:f782d9c66c49 437 *
dkato 0:f782d9c66c49 438 * Constructs an event bound to the specified event queue. The specified
dkato 0:f782d9c66c49 439 * callback acts as the target for the event and is executed in the
dkato 0:f782d9c66c49 440 * context of the event queue's dispatch loop once posted.
dkato 0:f782d9c66c49 441 *
dkato 0:f782d9c66c49 442 * @param q Event queue to dispatch on
dkato 0:f782d9c66c49 443 * @param f Function to execute when the event is dispatched
dkato 0:f782d9c66c49 444 * @param c0..c4 Arguments to bind to the callback, these arguments are
dkato 0:f782d9c66c49 445 * allocated on an irq-safe allocator from the event queue's
dkato 0:f782d9c66c49 446 * memory pool. Must be type-compatible with b0..b4, the
dkato 0:f782d9c66c49 447 * arguments to the underlying callback.
dkato 0:f782d9c66c49 448 */
dkato 0:f782d9c66c49 449 template <typename F>
dkato 0:f782d9c66c49 450 Event(EventQueue *q, F f) {
dkato 0:f782d9c66c49 451 _event = static_cast<struct event *>(
dkato 0:f782d9c66c49 452 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
dkato 0:f782d9c66c49 453
dkato 0:f782d9c66c49 454 if (_event) {
dkato 0:f782d9c66c49 455 _event->equeue = &q->_equeue;
dkato 0:f782d9c66c49 456 _event->id = 0;
dkato 0:f782d9c66c49 457 _event->delay = 0;
dkato 0:f782d9c66c49 458 _event->period = -1;
dkato 0:f782d9c66c49 459
dkato 0:f782d9c66c49 460 _event->post = &Event::event_post<F>;
dkato 0:f782d9c66c49 461 _event->dtor = &Event::event_dtor<F>;
dkato 0:f782d9c66c49 462
dkato 0:f782d9c66c49 463 new (_event+1) F(f);
dkato 0:f782d9c66c49 464
dkato 0:f782d9c66c49 465 _event->ref = 1;
dkato 0:f782d9c66c49 466 }
dkato 0:f782d9c66c49 467 }
dkato 0:f782d9c66c49 468
dkato 0:f782d9c66c49 469 /** Copy constructor for events
dkato 0:f782d9c66c49 470 */
dkato 0:f782d9c66c49 471 Event(const Event &e) {
dkato 0:f782d9c66c49 472 _event = 0;
dkato 0:f782d9c66c49 473 if (e._event) {
dkato 0:f782d9c66c49 474 _event = e._event;
dkato 0:f782d9c66c49 475 _event->ref += 1;
dkato 0:f782d9c66c49 476 }
dkato 0:f782d9c66c49 477 }
dkato 0:f782d9c66c49 478
dkato 0:f782d9c66c49 479 /** Assignment operator for events
dkato 0:f782d9c66c49 480 */
dkato 0:f782d9c66c49 481 Event &operator=(const Event &that) {
dkato 0:f782d9c66c49 482 if (this != &that) {
dkato 0:f782d9c66c49 483 this->~Event();
dkato 0:f782d9c66c49 484 new (this) Event(that);
dkato 0:f782d9c66c49 485 }
dkato 0:f782d9c66c49 486
dkato 0:f782d9c66c49 487 return *this;
dkato 0:f782d9c66c49 488 }
dkato 0:f782d9c66c49 489
dkato 0:f782d9c66c49 490 /** Destructor for events
dkato 0:f782d9c66c49 491 */
dkato 0:f782d9c66c49 492 ~Event() {
dkato 0:f782d9c66c49 493 if (_event) {
dkato 0:f782d9c66c49 494 _event->ref -= 1;
dkato 0:f782d9c66c49 495 if (_event->ref == 0) {
dkato 0:f782d9c66c49 496 _event->dtor(_event);
dkato 0:f782d9c66c49 497 equeue_dealloc(_event->equeue, _event);
dkato 0:f782d9c66c49 498 }
dkato 0:f782d9c66c49 499 }
dkato 0:f782d9c66c49 500 }
dkato 0:f782d9c66c49 501
dkato 0:f782d9c66c49 502 /** Configure the delay of an event
dkato 0:f782d9c66c49 503 *
dkato 0:f782d9c66c49 504 * @param delay Millisecond delay before dispatching the event
dkato 0:f782d9c66c49 505 */
dkato 0:f782d9c66c49 506 void delay(int delay) {
dkato 0:f782d9c66c49 507 if (_event) {
dkato 0:f782d9c66c49 508 _event->delay = delay;
dkato 0:f782d9c66c49 509 }
dkato 0:f782d9c66c49 510 }
dkato 0:f782d9c66c49 511
dkato 0:f782d9c66c49 512 /** Configure the period of an event
dkato 0:f782d9c66c49 513 *
dkato 0:f782d9c66c49 514 * @param period Millisecond period for repeatedly dispatching an event
dkato 0:f782d9c66c49 515 */
dkato 0:f782d9c66c49 516 void period(int period) {
dkato 0:f782d9c66c49 517 if (_event) {
dkato 0:f782d9c66c49 518 _event->period = period;
dkato 0:f782d9c66c49 519 }
dkato 0:f782d9c66c49 520 }
dkato 0:f782d9c66c49 521
dkato 0:f782d9c66c49 522 /** Posts an event onto the underlying event queue
dkato 0:f782d9c66c49 523 *
dkato 0:f782d9c66c49 524 * The event is posted to the underlying queue and is executed in the
dkato 0:f782d9c66c49 525 * context of the event queue's dispatch loop.
dkato 0:f782d9c66c49 526 *
dkato 0:f782d9c66c49 527 * The post function is irq safe and can act as a mechanism for moving
dkato 0:f782d9c66c49 528 * events out of irq contexts.
dkato 0:f782d9c66c49 529 *
dkato 0:f782d9c66c49 530 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 531 * @return A unique id that represents the posted event and can
dkato 0:f782d9c66c49 532 * be passed to EventQueue::cancel, or an id of 0 if
dkato 0:f782d9c66c49 533 * there is not enough memory to allocate the event.
dkato 0:f782d9c66c49 534 */
dkato 0:f782d9c66c49 535 int post(A0 a0) const {
dkato 0:f782d9c66c49 536 if (!_event) {
dkato 0:f782d9c66c49 537 return 0;
dkato 0:f782d9c66c49 538 }
dkato 0:f782d9c66c49 539
dkato 0:f782d9c66c49 540 _event->id = _event->post(_event, a0);
dkato 0:f782d9c66c49 541 return _event->id;
dkato 0:f782d9c66c49 542 }
dkato 0:f782d9c66c49 543
dkato 0:f782d9c66c49 544 /** Posts an event onto the underlying event queue, returning void
dkato 0:f782d9c66c49 545 *
dkato 0:f782d9c66c49 546 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 547 */
dkato 0:f782d9c66c49 548 void call(A0 a0) const {
dkato 0:f782d9c66c49 549 MBED_UNUSED int id = post(a0);
dkato 0:f782d9c66c49 550 MBED_ASSERT(id);
dkato 0:f782d9c66c49 551 }
dkato 0:f782d9c66c49 552
dkato 0:f782d9c66c49 553 /** Posts an event onto the underlying event queue, returning void
dkato 0:f782d9c66c49 554 *
dkato 0:f782d9c66c49 555 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 556 */
dkato 0:f782d9c66c49 557 void operator()(A0 a0) const {
dkato 0:f782d9c66c49 558 return call(a0);
dkato 0:f782d9c66c49 559 }
dkato 0:f782d9c66c49 560
dkato 0:f782d9c66c49 561 /** Static thunk for passing as C-style function
dkato 0:f782d9c66c49 562 *
dkato 0:f782d9c66c49 563 * @param func Event to call passed as a void pointer
dkato 0:f782d9c66c49 564 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 565 */
dkato 0:f782d9c66c49 566 static void thunk(void *func, A0 a0) {
dkato 0:f782d9c66c49 567 return static_cast<Event*>(func)->call(a0);
dkato 0:f782d9c66c49 568 }
dkato 0:f782d9c66c49 569
dkato 0:f782d9c66c49 570 /** Cancels the most recently posted event
dkato 0:f782d9c66c49 571 *
dkato 0:f782d9c66c49 572 * Attempts to cancel the most recently posted event. It is safe to call
dkato 0:f782d9c66c49 573 * cancel after an event has already been dispatched.
dkato 0:f782d9c66c49 574 *
dkato 0:f782d9c66c49 575 * The cancel function is irq safe.
dkato 0:f782d9c66c49 576 *
dkato 0:f782d9c66c49 577 * If called while the event queue's dispatch loop is active, the cancel
dkato 0:f782d9c66c49 578 * function does not garuntee that the event will not execute after it
dkato 0:f782d9c66c49 579 * returns, as the event may have already begun executing.
dkato 0:f782d9c66c49 580 */
dkato 0:f782d9c66c49 581 void cancel() const {
dkato 0:f782d9c66c49 582 if (_event) {
dkato 0:f782d9c66c49 583 equeue_cancel(_event->equeue, _event->id);
dkato 0:f782d9c66c49 584 }
dkato 0:f782d9c66c49 585 }
dkato 0:f782d9c66c49 586
dkato 0:f782d9c66c49 587 private:
dkato 0:f782d9c66c49 588 struct event {
dkato 0:f782d9c66c49 589 unsigned ref;
dkato 0:f782d9c66c49 590 equeue_t *equeue;
dkato 0:f782d9c66c49 591 int id;
dkato 0:f782d9c66c49 592
dkato 0:f782d9c66c49 593 int delay;
dkato 0:f782d9c66c49 594 int period;
dkato 0:f782d9c66c49 595
dkato 0:f782d9c66c49 596 int (*post)(struct event *, A0 a0);
dkato 0:f782d9c66c49 597 void (*dtor)(struct event *);
dkato 0:f782d9c66c49 598
dkato 0:f782d9c66c49 599 // F follows
dkato 0:f782d9c66c49 600 } *_event;
dkato 0:f782d9c66c49 601
dkato 0:f782d9c66c49 602 // Event attributes
dkato 0:f782d9c66c49 603 template <typename F>
dkato 0:f782d9c66c49 604 static int event_post(struct event *e, A0 a0) {
dkato 0:f782d9c66c49 605 typedef EventQueue::context10<F, A0> C;
dkato 0:f782d9c66c49 606 void *p = equeue_alloc(e->equeue, sizeof(C));
dkato 0:f782d9c66c49 607 if (!p) {
dkato 0:f782d9c66c49 608 return 0;
dkato 0:f782d9c66c49 609 }
dkato 0:f782d9c66c49 610
dkato 0:f782d9c66c49 611 new (p) C(*(F*)(e + 1), a0);
dkato 0:f782d9c66c49 612 equeue_event_delay(p, e->delay);
dkato 0:f782d9c66c49 613 equeue_event_period(p, e->period);
dkato 0:f782d9c66c49 614 equeue_event_dtor(p, &EventQueue::function_dtor<C>);
dkato 0:f782d9c66c49 615 return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
dkato 0:f782d9c66c49 616 }
dkato 0:f782d9c66c49 617
dkato 0:f782d9c66c49 618 template <typename F>
dkato 0:f782d9c66c49 619 static void event_dtor(struct event *e) {
dkato 0:f782d9c66c49 620 ((F*)(e + 1))->~F();
dkato 0:f782d9c66c49 621 }
dkato 0:f782d9c66c49 622
dkato 0:f782d9c66c49 623 public:
dkato 0:f782d9c66c49 624 /** Create an event
dkato 0:f782d9c66c49 625 * @see Event::Event
dkato 0:f782d9c66c49 626 */
dkato 0:f782d9c66c49 627 template <typename F, typename C0>
dkato 0:f782d9c66c49 628 Event(EventQueue *q, F f, C0 c0) {
dkato 0:f782d9c66c49 629 new (this) Event(q, EventQueue::context11<F, C0, A0>(f, c0));
dkato 0:f782d9c66c49 630 }
dkato 0:f782d9c66c49 631
dkato 0:f782d9c66c49 632 /** Create an event
dkato 0:f782d9c66c49 633 * @see Event::Event
dkato 0:f782d9c66c49 634 */
dkato 0:f782d9c66c49 635 template <typename F, typename C0, typename C1>
dkato 0:f782d9c66c49 636 Event(EventQueue *q, F f, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 637 new (this) Event(q, EventQueue::context21<F, C0, C1, A0>(f, c0, c1));
dkato 0:f782d9c66c49 638 }
dkato 0:f782d9c66c49 639
dkato 0:f782d9c66c49 640 /** Create an event
dkato 0:f782d9c66c49 641 * @see Event::Event
dkato 0:f782d9c66c49 642 */
dkato 0:f782d9c66c49 643 template <typename F, typename C0, typename C1, typename C2>
dkato 0:f782d9c66c49 644 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 645 new (this) Event(q, EventQueue::context31<F, C0, C1, C2, A0>(f, c0, c1, c2));
dkato 0:f782d9c66c49 646 }
dkato 0:f782d9c66c49 647
dkato 0:f782d9c66c49 648 /** Create an event
dkato 0:f782d9c66c49 649 * @see Event::Event
dkato 0:f782d9c66c49 650 */
dkato 0:f782d9c66c49 651 template <typename F, typename C0, typename C1, typename C2, typename C3>
dkato 0:f782d9c66c49 652 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 653 new (this) Event(q, EventQueue::context41<F, C0, C1, C2, C3, A0>(f, c0, c1, c2, c3));
dkato 0:f782d9c66c49 654 }
dkato 0:f782d9c66c49 655
dkato 0:f782d9c66c49 656 /** Create an event
dkato 0:f782d9c66c49 657 * @see Event::Event
dkato 0:f782d9c66c49 658 */
dkato 0:f782d9c66c49 659 template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
dkato 0:f782d9c66c49 660 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 661 new (this) Event(q, EventQueue::context51<F, C0, C1, C2, C3, C4, A0>(f, c0, c1, c2, c3, c4));
dkato 0:f782d9c66c49 662 }
dkato 0:f782d9c66c49 663
dkato 0:f782d9c66c49 664 /** Create an event
dkato 0:f782d9c66c49 665 * @see Event::Event
dkato 0:f782d9c66c49 666 */
dkato 0:f782d9c66c49 667 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 668 Event(EventQueue *q, T *obj, R (T::*method)(B0, A0), B0 b0) {
dkato 0:f782d9c66c49 669 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 670 }
dkato 0:f782d9c66c49 671
dkato 0:f782d9c66c49 672 /** Create an event
dkato 0:f782d9c66c49 673 * @see Event::Event
dkato 0:f782d9c66c49 674 */
dkato 0:f782d9c66c49 675 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 676 Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0) const, B0 b0) {
dkato 0:f782d9c66c49 677 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 678 }
dkato 0:f782d9c66c49 679
dkato 0:f782d9c66c49 680 /** Create an event
dkato 0:f782d9c66c49 681 * @see Event::Event
dkato 0:f782d9c66c49 682 */
dkato 0:f782d9c66c49 683 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 684 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0) volatile, B0 b0) {
dkato 0:f782d9c66c49 685 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 686 }
dkato 0:f782d9c66c49 687
dkato 0:f782d9c66c49 688 /** Create an event
dkato 0:f782d9c66c49 689 * @see Event::Event
dkato 0:f782d9c66c49 690 */
dkato 0:f782d9c66c49 691 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 692 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0) const volatile, B0 b0) {
dkato 0:f782d9c66c49 693 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 694 }
dkato 0:f782d9c66c49 695
dkato 0:f782d9c66c49 696 /** Create an event
dkato 0:f782d9c66c49 697 * @see Event::Event
dkato 0:f782d9c66c49 698 */
dkato 0:f782d9c66c49 699 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 700 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0), B0 b0, B1 b1) {
dkato 0:f782d9c66c49 701 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 702 }
dkato 0:f782d9c66c49 703
dkato 0:f782d9c66c49 704 /** Create an event
dkato 0:f782d9c66c49 705 * @see Event::Event
dkato 0:f782d9c66c49 706 */
dkato 0:f782d9c66c49 707 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 708 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0) const, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 709 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 710 }
dkato 0:f782d9c66c49 711
dkato 0:f782d9c66c49 712 /** Create an event
dkato 0:f782d9c66c49 713 * @see Event::Event
dkato 0:f782d9c66c49 714 */
dkato 0:f782d9c66c49 715 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 716 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0) volatile, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 717 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 718 }
dkato 0:f782d9c66c49 719
dkato 0:f782d9c66c49 720 /** Create an event
dkato 0:f782d9c66c49 721 * @see Event::Event
dkato 0:f782d9c66c49 722 */
dkato 0:f782d9c66c49 723 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 724 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0) const volatile, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 725 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 726 }
dkato 0:f782d9c66c49 727
dkato 0:f782d9c66c49 728 /** Create an event
dkato 0:f782d9c66c49 729 * @see Event::Event
dkato 0:f782d9c66c49 730 */
dkato 0:f782d9c66c49 731 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 732 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0), B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 733 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 734 }
dkato 0:f782d9c66c49 735
dkato 0:f782d9c66c49 736 /** Create an event
dkato 0:f782d9c66c49 737 * @see Event::Event
dkato 0:f782d9c66c49 738 */
dkato 0:f782d9c66c49 739 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 740 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0) const, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 741 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 742 }
dkato 0:f782d9c66c49 743
dkato 0:f782d9c66c49 744 /** Create an event
dkato 0:f782d9c66c49 745 * @see Event::Event
dkato 0:f782d9c66c49 746 */
dkato 0:f782d9c66c49 747 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 748 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0) volatile, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 749 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 750 }
dkato 0:f782d9c66c49 751
dkato 0:f782d9c66c49 752 /** Create an event
dkato 0:f782d9c66c49 753 * @see Event::Event
dkato 0:f782d9c66c49 754 */
dkato 0:f782d9c66c49 755 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 756 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, A0) const volatile, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 757 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 758 }
dkato 0:f782d9c66c49 759
dkato 0:f782d9c66c49 760 /** Create an event
dkato 0:f782d9c66c49 761 * @see Event::Event
dkato 0:f782d9c66c49 762 */
dkato 0:f782d9c66c49 763 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 764 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0), B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 765 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 766 }
dkato 0:f782d9c66c49 767
dkato 0:f782d9c66c49 768 /** Create an event
dkato 0:f782d9c66c49 769 * @see Event::Event
dkato 0:f782d9c66c49 770 */
dkato 0:f782d9c66c49 771 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 772 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, A0) const, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 773 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 774 }
dkato 0:f782d9c66c49 775
dkato 0:f782d9c66c49 776 /** Create an event
dkato 0:f782d9c66c49 777 * @see Event::Event
dkato 0:f782d9c66c49 778 */
dkato 0:f782d9c66c49 779 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 780 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 781 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 782 }
dkato 0:f782d9c66c49 783
dkato 0:f782d9c66c49 784 /** Create an event
dkato 0:f782d9c66c49 785 * @see Event::Event
dkato 0:f782d9c66c49 786 */
dkato 0:f782d9c66c49 787 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 788 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0) const volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 789 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 790 }
dkato 0:f782d9c66c49 791
dkato 0:f782d9c66c49 792 /** Create an event
dkato 0:f782d9c66c49 793 * @see Event::Event
dkato 0:f782d9c66c49 794 */
dkato 0:f782d9c66c49 795 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 796 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 797 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 798 }
dkato 0:f782d9c66c49 799
dkato 0:f782d9c66c49 800 /** Create an event
dkato 0:f782d9c66c49 801 * @see Event::Event
dkato 0:f782d9c66c49 802 */
dkato 0:f782d9c66c49 803 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 804 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0) const, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 805 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 806 }
dkato 0:f782d9c66c49 807
dkato 0:f782d9c66c49 808 /** Create an event
dkato 0:f782d9c66c49 809 * @see Event::Event
dkato 0:f782d9c66c49 810 */
dkato 0:f782d9c66c49 811 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 812 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0) volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 813 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 814 }
dkato 0:f782d9c66c49 815
dkato 0:f782d9c66c49 816 /** Create an event
dkato 0:f782d9c66c49 817 * @see Event::Event
dkato 0:f782d9c66c49 818 */
dkato 0:f782d9c66c49 819 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 820 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0) const volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 821 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 822 }
dkato 0:f782d9c66c49 823 };
dkato 0:f782d9c66c49 824
dkato 0:f782d9c66c49 825 /** Event
dkato 0:f782d9c66c49 826 *
dkato 0:f782d9c66c49 827 * Representation of an event for fine-grain dispatch control
dkato 0:f782d9c66c49 828 */
dkato 0:f782d9c66c49 829 template <typename A0, typename A1>
dkato 0:f782d9c66c49 830 class Event<void(A0, A1)> {
dkato 0:f782d9c66c49 831 public:
dkato 0:f782d9c66c49 832 /** Create an event
dkato 0:f782d9c66c49 833 *
dkato 0:f782d9c66c49 834 * Constructs an event bound to the specified event queue. The specified
dkato 0:f782d9c66c49 835 * callback acts as the target for the event and is executed in the
dkato 0:f782d9c66c49 836 * context of the event queue's dispatch loop once posted.
dkato 0:f782d9c66c49 837 *
dkato 0:f782d9c66c49 838 * @param q Event queue to dispatch on
dkato 0:f782d9c66c49 839 * @param f Function to execute when the event is dispatched
dkato 0:f782d9c66c49 840 * @param c0..c4 Arguments to bind to the callback, these arguments are
dkato 0:f782d9c66c49 841 * allocated on an irq-safe allocator from the event queue's
dkato 0:f782d9c66c49 842 * memory pool. Must be type-compatible with b0..b4, the
dkato 0:f782d9c66c49 843 * arguments to the underlying callback.
dkato 0:f782d9c66c49 844 */
dkato 0:f782d9c66c49 845 template <typename F>
dkato 0:f782d9c66c49 846 Event(EventQueue *q, F f) {
dkato 0:f782d9c66c49 847 _event = static_cast<struct event *>(
dkato 0:f782d9c66c49 848 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
dkato 0:f782d9c66c49 849
dkato 0:f782d9c66c49 850 if (_event) {
dkato 0:f782d9c66c49 851 _event->equeue = &q->_equeue;
dkato 0:f782d9c66c49 852 _event->id = 0;
dkato 0:f782d9c66c49 853 _event->delay = 0;
dkato 0:f782d9c66c49 854 _event->period = -1;
dkato 0:f782d9c66c49 855
dkato 0:f782d9c66c49 856 _event->post = &Event::event_post<F>;
dkato 0:f782d9c66c49 857 _event->dtor = &Event::event_dtor<F>;
dkato 0:f782d9c66c49 858
dkato 0:f782d9c66c49 859 new (_event+1) F(f);
dkato 0:f782d9c66c49 860
dkato 0:f782d9c66c49 861 _event->ref = 1;
dkato 0:f782d9c66c49 862 }
dkato 0:f782d9c66c49 863 }
dkato 0:f782d9c66c49 864
dkato 0:f782d9c66c49 865 /** Copy constructor for events
dkato 0:f782d9c66c49 866 */
dkato 0:f782d9c66c49 867 Event(const Event &e) {
dkato 0:f782d9c66c49 868 _event = 0;
dkato 0:f782d9c66c49 869 if (e._event) {
dkato 0:f782d9c66c49 870 _event = e._event;
dkato 0:f782d9c66c49 871 _event->ref += 1;
dkato 0:f782d9c66c49 872 }
dkato 0:f782d9c66c49 873 }
dkato 0:f782d9c66c49 874
dkato 0:f782d9c66c49 875 /** Assignment operator for events
dkato 0:f782d9c66c49 876 */
dkato 0:f782d9c66c49 877 Event &operator=(const Event &that) {
dkato 0:f782d9c66c49 878 if (this != &that) {
dkato 0:f782d9c66c49 879 this->~Event();
dkato 0:f782d9c66c49 880 new (this) Event(that);
dkato 0:f782d9c66c49 881 }
dkato 0:f782d9c66c49 882
dkato 0:f782d9c66c49 883 return *this;
dkato 0:f782d9c66c49 884 }
dkato 0:f782d9c66c49 885
dkato 0:f782d9c66c49 886 /** Destructor for events
dkato 0:f782d9c66c49 887 */
dkato 0:f782d9c66c49 888 ~Event() {
dkato 0:f782d9c66c49 889 if (_event) {
dkato 0:f782d9c66c49 890 _event->ref -= 1;
dkato 0:f782d9c66c49 891 if (_event->ref == 0) {
dkato 0:f782d9c66c49 892 _event->dtor(_event);
dkato 0:f782d9c66c49 893 equeue_dealloc(_event->equeue, _event);
dkato 0:f782d9c66c49 894 }
dkato 0:f782d9c66c49 895 }
dkato 0:f782d9c66c49 896 }
dkato 0:f782d9c66c49 897
dkato 0:f782d9c66c49 898 /** Configure the delay of an event
dkato 0:f782d9c66c49 899 *
dkato 0:f782d9c66c49 900 * @param delay Millisecond delay before dispatching the event
dkato 0:f782d9c66c49 901 */
dkato 0:f782d9c66c49 902 void delay(int delay) {
dkato 0:f782d9c66c49 903 if (_event) {
dkato 0:f782d9c66c49 904 _event->delay = delay;
dkato 0:f782d9c66c49 905 }
dkato 0:f782d9c66c49 906 }
dkato 0:f782d9c66c49 907
dkato 0:f782d9c66c49 908 /** Configure the period of an event
dkato 0:f782d9c66c49 909 *
dkato 0:f782d9c66c49 910 * @param period Millisecond period for repeatedly dispatching an event
dkato 0:f782d9c66c49 911 */
dkato 0:f782d9c66c49 912 void period(int period) {
dkato 0:f782d9c66c49 913 if (_event) {
dkato 0:f782d9c66c49 914 _event->period = period;
dkato 0:f782d9c66c49 915 }
dkato 0:f782d9c66c49 916 }
dkato 0:f782d9c66c49 917
dkato 0:f782d9c66c49 918 /** Posts an event onto the underlying event queue
dkato 0:f782d9c66c49 919 *
dkato 0:f782d9c66c49 920 * The event is posted to the underlying queue and is executed in the
dkato 0:f782d9c66c49 921 * context of the event queue's dispatch loop.
dkato 0:f782d9c66c49 922 *
dkato 0:f782d9c66c49 923 * The post function is irq safe and can act as a mechanism for moving
dkato 0:f782d9c66c49 924 * events out of irq contexts.
dkato 0:f782d9c66c49 925 *
dkato 0:f782d9c66c49 926 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 927 * @return A unique id that represents the posted event and can
dkato 0:f782d9c66c49 928 * be passed to EventQueue::cancel, or an id of 0 if
dkato 0:f782d9c66c49 929 * there is not enough memory to allocate the event.
dkato 0:f782d9c66c49 930 */
dkato 0:f782d9c66c49 931 int post(A0 a0, A1 a1) const {
dkato 0:f782d9c66c49 932 if (!_event) {
dkato 0:f782d9c66c49 933 return 0;
dkato 0:f782d9c66c49 934 }
dkato 0:f782d9c66c49 935
dkato 0:f782d9c66c49 936 _event->id = _event->post(_event, a0, a1);
dkato 0:f782d9c66c49 937 return _event->id;
dkato 0:f782d9c66c49 938 }
dkato 0:f782d9c66c49 939
dkato 0:f782d9c66c49 940 /** Posts an event onto the underlying event queue, returning void
dkato 0:f782d9c66c49 941 *
dkato 0:f782d9c66c49 942 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 943 */
dkato 0:f782d9c66c49 944 void call(A0 a0, A1 a1) const {
dkato 0:f782d9c66c49 945 MBED_UNUSED int id = post(a0, a1);
dkato 0:f782d9c66c49 946 MBED_ASSERT(id);
dkato 0:f782d9c66c49 947 }
dkato 0:f782d9c66c49 948
dkato 0:f782d9c66c49 949 /** Posts an event onto the underlying event queue, returning void
dkato 0:f782d9c66c49 950 *
dkato 0:f782d9c66c49 951 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 952 */
dkato 0:f782d9c66c49 953 void operator()(A0 a0, A1 a1) const {
dkato 0:f782d9c66c49 954 return call(a0, a1);
dkato 0:f782d9c66c49 955 }
dkato 0:f782d9c66c49 956
dkato 0:f782d9c66c49 957 /** Static thunk for passing as C-style function
dkato 0:f782d9c66c49 958 *
dkato 0:f782d9c66c49 959 * @param func Event to call passed as a void pointer
dkato 0:f782d9c66c49 960 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 961 */
dkato 0:f782d9c66c49 962 static void thunk(void *func, A0 a0, A1 a1) {
dkato 0:f782d9c66c49 963 return static_cast<Event*>(func)->call(a0, a1);
dkato 0:f782d9c66c49 964 }
dkato 0:f782d9c66c49 965
dkato 0:f782d9c66c49 966 /** Cancels the most recently posted event
dkato 0:f782d9c66c49 967 *
dkato 0:f782d9c66c49 968 * Attempts to cancel the most recently posted event. It is safe to call
dkato 0:f782d9c66c49 969 * cancel after an event has already been dispatched.
dkato 0:f782d9c66c49 970 *
dkato 0:f782d9c66c49 971 * The cancel function is irq safe.
dkato 0:f782d9c66c49 972 *
dkato 0:f782d9c66c49 973 * If called while the event queue's dispatch loop is active, the cancel
dkato 0:f782d9c66c49 974 * function does not garuntee that the event will not execute after it
dkato 0:f782d9c66c49 975 * returns, as the event may have already begun executing.
dkato 0:f782d9c66c49 976 */
dkato 0:f782d9c66c49 977 void cancel() const {
dkato 0:f782d9c66c49 978 if (_event) {
dkato 0:f782d9c66c49 979 equeue_cancel(_event->equeue, _event->id);
dkato 0:f782d9c66c49 980 }
dkato 0:f782d9c66c49 981 }
dkato 0:f782d9c66c49 982
dkato 0:f782d9c66c49 983 private:
dkato 0:f782d9c66c49 984 struct event {
dkato 0:f782d9c66c49 985 unsigned ref;
dkato 0:f782d9c66c49 986 equeue_t *equeue;
dkato 0:f782d9c66c49 987 int id;
dkato 0:f782d9c66c49 988
dkato 0:f782d9c66c49 989 int delay;
dkato 0:f782d9c66c49 990 int period;
dkato 0:f782d9c66c49 991
dkato 0:f782d9c66c49 992 int (*post)(struct event *, A0 a0, A1 a1);
dkato 0:f782d9c66c49 993 void (*dtor)(struct event *);
dkato 0:f782d9c66c49 994
dkato 0:f782d9c66c49 995 // F follows
dkato 0:f782d9c66c49 996 } *_event;
dkato 0:f782d9c66c49 997
dkato 0:f782d9c66c49 998 // Event attributes
dkato 0:f782d9c66c49 999 template <typename F>
dkato 0:f782d9c66c49 1000 static int event_post(struct event *e, A0 a0, A1 a1) {
dkato 0:f782d9c66c49 1001 typedef EventQueue::context20<F, A0, A1> C;
dkato 0:f782d9c66c49 1002 void *p = equeue_alloc(e->equeue, sizeof(C));
dkato 0:f782d9c66c49 1003 if (!p) {
dkato 0:f782d9c66c49 1004 return 0;
dkato 0:f782d9c66c49 1005 }
dkato 0:f782d9c66c49 1006
dkato 0:f782d9c66c49 1007 new (p) C(*(F*)(e + 1), a0, a1);
dkato 0:f782d9c66c49 1008 equeue_event_delay(p, e->delay);
dkato 0:f782d9c66c49 1009 equeue_event_period(p, e->period);
dkato 0:f782d9c66c49 1010 equeue_event_dtor(p, &EventQueue::function_dtor<C>);
dkato 0:f782d9c66c49 1011 return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
dkato 0:f782d9c66c49 1012 }
dkato 0:f782d9c66c49 1013
dkato 0:f782d9c66c49 1014 template <typename F>
dkato 0:f782d9c66c49 1015 static void event_dtor(struct event *e) {
dkato 0:f782d9c66c49 1016 ((F*)(e + 1))->~F();
dkato 0:f782d9c66c49 1017 }
dkato 0:f782d9c66c49 1018
dkato 0:f782d9c66c49 1019 public:
dkato 0:f782d9c66c49 1020 /** Create an event
dkato 0:f782d9c66c49 1021 * @see Event::Event
dkato 0:f782d9c66c49 1022 */
dkato 0:f782d9c66c49 1023 template <typename F, typename C0>
dkato 0:f782d9c66c49 1024 Event(EventQueue *q, F f, C0 c0) {
dkato 0:f782d9c66c49 1025 new (this) Event(q, EventQueue::context12<F, C0, A0, A1>(f, c0));
dkato 0:f782d9c66c49 1026 }
dkato 0:f782d9c66c49 1027
dkato 0:f782d9c66c49 1028 /** Create an event
dkato 0:f782d9c66c49 1029 * @see Event::Event
dkato 0:f782d9c66c49 1030 */
dkato 0:f782d9c66c49 1031 template <typename F, typename C0, typename C1>
dkato 0:f782d9c66c49 1032 Event(EventQueue *q, F f, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 1033 new (this) Event(q, EventQueue::context22<F, C0, C1, A0, A1>(f, c0, c1));
dkato 0:f782d9c66c49 1034 }
dkato 0:f782d9c66c49 1035
dkato 0:f782d9c66c49 1036 /** Create an event
dkato 0:f782d9c66c49 1037 * @see Event::Event
dkato 0:f782d9c66c49 1038 */
dkato 0:f782d9c66c49 1039 template <typename F, typename C0, typename C1, typename C2>
dkato 0:f782d9c66c49 1040 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 1041 new (this) Event(q, EventQueue::context32<F, C0, C1, C2, A0, A1>(f, c0, c1, c2));
dkato 0:f782d9c66c49 1042 }
dkato 0:f782d9c66c49 1043
dkato 0:f782d9c66c49 1044 /** Create an event
dkato 0:f782d9c66c49 1045 * @see Event::Event
dkato 0:f782d9c66c49 1046 */
dkato 0:f782d9c66c49 1047 template <typename F, typename C0, typename C1, typename C2, typename C3>
dkato 0:f782d9c66c49 1048 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 1049 new (this) Event(q, EventQueue::context42<F, C0, C1, C2, C3, A0, A1>(f, c0, c1, c2, c3));
dkato 0:f782d9c66c49 1050 }
dkato 0:f782d9c66c49 1051
dkato 0:f782d9c66c49 1052 /** Create an event
dkato 0:f782d9c66c49 1053 * @see Event::Event
dkato 0:f782d9c66c49 1054 */
dkato 0:f782d9c66c49 1055 template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
dkato 0:f782d9c66c49 1056 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 1057 new (this) Event(q, EventQueue::context52<F, C0, C1, C2, C3, C4, A0, A1>(f, c0, c1, c2, c3, c4));
dkato 0:f782d9c66c49 1058 }
dkato 0:f782d9c66c49 1059
dkato 0:f782d9c66c49 1060 /** Create an event
dkato 0:f782d9c66c49 1061 * @see Event::Event
dkato 0:f782d9c66c49 1062 */
dkato 0:f782d9c66c49 1063 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 1064 Event(EventQueue *q, T *obj, R (T::*method)(B0, A0, A1), B0 b0) {
dkato 0:f782d9c66c49 1065 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 1066 }
dkato 0:f782d9c66c49 1067
dkato 0:f782d9c66c49 1068 /** Create an event
dkato 0:f782d9c66c49 1069 * @see Event::Event
dkato 0:f782d9c66c49 1070 */
dkato 0:f782d9c66c49 1071 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 1072 Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0, A1) const, B0 b0) {
dkato 0:f782d9c66c49 1073 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 1074 }
dkato 0:f782d9c66c49 1075
dkato 0:f782d9c66c49 1076 /** Create an event
dkato 0:f782d9c66c49 1077 * @see Event::Event
dkato 0:f782d9c66c49 1078 */
dkato 0:f782d9c66c49 1079 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 1080 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0, A1) volatile, B0 b0) {
dkato 0:f782d9c66c49 1081 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 1082 }
dkato 0:f782d9c66c49 1083
dkato 0:f782d9c66c49 1084 /** Create an event
dkato 0:f782d9c66c49 1085 * @see Event::Event
dkato 0:f782d9c66c49 1086 */
dkato 0:f782d9c66c49 1087 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 1088 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0, A1) const volatile, B0 b0) {
dkato 0:f782d9c66c49 1089 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 1090 }
dkato 0:f782d9c66c49 1091
dkato 0:f782d9c66c49 1092 /** Create an event
dkato 0:f782d9c66c49 1093 * @see Event::Event
dkato 0:f782d9c66c49 1094 */
dkato 0:f782d9c66c49 1095 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 1096 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0, A1), B0 b0, B1 b1) {
dkato 0:f782d9c66c49 1097 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 1098 }
dkato 0:f782d9c66c49 1099
dkato 0:f782d9c66c49 1100 /** Create an event
dkato 0:f782d9c66c49 1101 * @see Event::Event
dkato 0:f782d9c66c49 1102 */
dkato 0:f782d9c66c49 1103 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 1104 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0, A1) const, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 1105 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 1106 }
dkato 0:f782d9c66c49 1107
dkato 0:f782d9c66c49 1108 /** Create an event
dkato 0:f782d9c66c49 1109 * @see Event::Event
dkato 0:f782d9c66c49 1110 */
dkato 0:f782d9c66c49 1111 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 1112 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0, A1) volatile, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 1113 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 1114 }
dkato 0:f782d9c66c49 1115
dkato 0:f782d9c66c49 1116 /** Create an event
dkato 0:f782d9c66c49 1117 * @see Event::Event
dkato 0:f782d9c66c49 1118 */
dkato 0:f782d9c66c49 1119 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 1120 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0, A1) const volatile, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 1121 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 1122 }
dkato 0:f782d9c66c49 1123
dkato 0:f782d9c66c49 1124 /** Create an event
dkato 0:f782d9c66c49 1125 * @see Event::Event
dkato 0:f782d9c66c49 1126 */
dkato 0:f782d9c66c49 1127 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 1128 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0, A1), B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 1129 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 1130 }
dkato 0:f782d9c66c49 1131
dkato 0:f782d9c66c49 1132 /** Create an event
dkato 0:f782d9c66c49 1133 * @see Event::Event
dkato 0:f782d9c66c49 1134 */
dkato 0:f782d9c66c49 1135 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 1136 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0, A1) const, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 1137 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 1138 }
dkato 0:f782d9c66c49 1139
dkato 0:f782d9c66c49 1140 /** Create an event
dkato 0:f782d9c66c49 1141 * @see Event::Event
dkato 0:f782d9c66c49 1142 */
dkato 0:f782d9c66c49 1143 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 1144 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1) volatile, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 1145 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 1146 }
dkato 0:f782d9c66c49 1147
dkato 0:f782d9c66c49 1148 /** Create an event
dkato 0:f782d9c66c49 1149 * @see Event::Event
dkato 0:f782d9c66c49 1150 */
dkato 0:f782d9c66c49 1151 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 1152 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1) const volatile, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 1153 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 1154 }
dkato 0:f782d9c66c49 1155
dkato 0:f782d9c66c49 1156 /** Create an event
dkato 0:f782d9c66c49 1157 * @see Event::Event
dkato 0:f782d9c66c49 1158 */
dkato 0:f782d9c66c49 1159 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 1160 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1), B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 1161 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 1162 }
dkato 0:f782d9c66c49 1163
dkato 0:f782d9c66c49 1164 /** Create an event
dkato 0:f782d9c66c49 1165 * @see Event::Event
dkato 0:f782d9c66c49 1166 */
dkato 0:f782d9c66c49 1167 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 1168 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) const, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 1169 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 1170 }
dkato 0:f782d9c66c49 1171
dkato 0:f782d9c66c49 1172 /** Create an event
dkato 0:f782d9c66c49 1173 * @see Event::Event
dkato 0:f782d9c66c49 1174 */
dkato 0:f782d9c66c49 1175 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 1176 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 1177 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 1178 }
dkato 0:f782d9c66c49 1179
dkato 0:f782d9c66c49 1180 /** Create an event
dkato 0:f782d9c66c49 1181 * @see Event::Event
dkato 0:f782d9c66c49 1182 */
dkato 0:f782d9c66c49 1183 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 1184 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) const volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 1185 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 1186 }
dkato 0:f782d9c66c49 1187
dkato 0:f782d9c66c49 1188 /** Create an event
dkato 0:f782d9c66c49 1189 * @see Event::Event
dkato 0:f782d9c66c49 1190 */
dkato 0:f782d9c66c49 1191 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 1192 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 1193 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 1194 }
dkato 0:f782d9c66c49 1195
dkato 0:f782d9c66c49 1196 /** Create an event
dkato 0:f782d9c66c49 1197 * @see Event::Event
dkato 0:f782d9c66c49 1198 */
dkato 0:f782d9c66c49 1199 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 1200 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1) const, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 1201 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 1202 }
dkato 0:f782d9c66c49 1203
dkato 0:f782d9c66c49 1204 /** Create an event
dkato 0:f782d9c66c49 1205 * @see Event::Event
dkato 0:f782d9c66c49 1206 */
dkato 0:f782d9c66c49 1207 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 1208 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1) volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 1209 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 1210 }
dkato 0:f782d9c66c49 1211
dkato 0:f782d9c66c49 1212 /** Create an event
dkato 0:f782d9c66c49 1213 * @see Event::Event
dkato 0:f782d9c66c49 1214 */
dkato 0:f782d9c66c49 1215 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 1216 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1) const volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 1217 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 1218 }
dkato 0:f782d9c66c49 1219 };
dkato 0:f782d9c66c49 1220
dkato 0:f782d9c66c49 1221 /** Event
dkato 0:f782d9c66c49 1222 *
dkato 0:f782d9c66c49 1223 * Representation of an event for fine-grain dispatch control
dkato 0:f782d9c66c49 1224 */
dkato 0:f782d9c66c49 1225 template <typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 1226 class Event<void(A0, A1, A2)> {
dkato 0:f782d9c66c49 1227 public:
dkato 0:f782d9c66c49 1228 /** Create an event
dkato 0:f782d9c66c49 1229 *
dkato 0:f782d9c66c49 1230 * Constructs an event bound to the specified event queue. The specified
dkato 0:f782d9c66c49 1231 * callback acts as the target for the event and is executed in the
dkato 0:f782d9c66c49 1232 * context of the event queue's dispatch loop once posted.
dkato 0:f782d9c66c49 1233 *
dkato 0:f782d9c66c49 1234 * @param q Event queue to dispatch on
dkato 0:f782d9c66c49 1235 * @param f Function to execute when the event is dispatched
dkato 0:f782d9c66c49 1236 * @param c0..c4 Arguments to bind to the callback, these arguments are
dkato 0:f782d9c66c49 1237 * allocated on an irq-safe allocator from the event queue's
dkato 0:f782d9c66c49 1238 * memory pool. Must be type-compatible with b0..b4, the
dkato 0:f782d9c66c49 1239 * arguments to the underlying callback.
dkato 0:f782d9c66c49 1240 */
dkato 0:f782d9c66c49 1241 template <typename F>
dkato 0:f782d9c66c49 1242 Event(EventQueue *q, F f) {
dkato 0:f782d9c66c49 1243 _event = static_cast<struct event *>(
dkato 0:f782d9c66c49 1244 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
dkato 0:f782d9c66c49 1245
dkato 0:f782d9c66c49 1246 if (_event) {
dkato 0:f782d9c66c49 1247 _event->equeue = &q->_equeue;
dkato 0:f782d9c66c49 1248 _event->id = 0;
dkato 0:f782d9c66c49 1249 _event->delay = 0;
dkato 0:f782d9c66c49 1250 _event->period = -1;
dkato 0:f782d9c66c49 1251
dkato 0:f782d9c66c49 1252 _event->post = &Event::event_post<F>;
dkato 0:f782d9c66c49 1253 _event->dtor = &Event::event_dtor<F>;
dkato 0:f782d9c66c49 1254
dkato 0:f782d9c66c49 1255 new (_event+1) F(f);
dkato 0:f782d9c66c49 1256
dkato 0:f782d9c66c49 1257 _event->ref = 1;
dkato 0:f782d9c66c49 1258 }
dkato 0:f782d9c66c49 1259 }
dkato 0:f782d9c66c49 1260
dkato 0:f782d9c66c49 1261 /** Copy constructor for events
dkato 0:f782d9c66c49 1262 */
dkato 0:f782d9c66c49 1263 Event(const Event &e) {
dkato 0:f782d9c66c49 1264 _event = 0;
dkato 0:f782d9c66c49 1265 if (e._event) {
dkato 0:f782d9c66c49 1266 _event = e._event;
dkato 0:f782d9c66c49 1267 _event->ref += 1;
dkato 0:f782d9c66c49 1268 }
dkato 0:f782d9c66c49 1269 }
dkato 0:f782d9c66c49 1270
dkato 0:f782d9c66c49 1271 /** Assignment operator for events
dkato 0:f782d9c66c49 1272 */
dkato 0:f782d9c66c49 1273 Event &operator=(const Event &that) {
dkato 0:f782d9c66c49 1274 if (this != &that) {
dkato 0:f782d9c66c49 1275 this->~Event();
dkato 0:f782d9c66c49 1276 new (this) Event(that);
dkato 0:f782d9c66c49 1277 }
dkato 0:f782d9c66c49 1278
dkato 0:f782d9c66c49 1279 return *this;
dkato 0:f782d9c66c49 1280 }
dkato 0:f782d9c66c49 1281
dkato 0:f782d9c66c49 1282 /** Destructor for events
dkato 0:f782d9c66c49 1283 */
dkato 0:f782d9c66c49 1284 ~Event() {
dkato 0:f782d9c66c49 1285 if (_event) {
dkato 0:f782d9c66c49 1286 _event->ref -= 1;
dkato 0:f782d9c66c49 1287 if (_event->ref == 0) {
dkato 0:f782d9c66c49 1288 _event->dtor(_event);
dkato 0:f782d9c66c49 1289 equeue_dealloc(_event->equeue, _event);
dkato 0:f782d9c66c49 1290 }
dkato 0:f782d9c66c49 1291 }
dkato 0:f782d9c66c49 1292 }
dkato 0:f782d9c66c49 1293
dkato 0:f782d9c66c49 1294 /** Configure the delay of an event
dkato 0:f782d9c66c49 1295 *
dkato 0:f782d9c66c49 1296 * @param delay Millisecond delay before dispatching the event
dkato 0:f782d9c66c49 1297 */
dkato 0:f782d9c66c49 1298 void delay(int delay) {
dkato 0:f782d9c66c49 1299 if (_event) {
dkato 0:f782d9c66c49 1300 _event->delay = delay;
dkato 0:f782d9c66c49 1301 }
dkato 0:f782d9c66c49 1302 }
dkato 0:f782d9c66c49 1303
dkato 0:f782d9c66c49 1304 /** Configure the period of an event
dkato 0:f782d9c66c49 1305 *
dkato 0:f782d9c66c49 1306 * @param period Millisecond period for repeatedly dispatching an event
dkato 0:f782d9c66c49 1307 */
dkato 0:f782d9c66c49 1308 void period(int period) {
dkato 0:f782d9c66c49 1309 if (_event) {
dkato 0:f782d9c66c49 1310 _event->period = period;
dkato 0:f782d9c66c49 1311 }
dkato 0:f782d9c66c49 1312 }
dkato 0:f782d9c66c49 1313
dkato 0:f782d9c66c49 1314 /** Posts an event onto the underlying event queue
dkato 0:f782d9c66c49 1315 *
dkato 0:f782d9c66c49 1316 * The event is posted to the underlying queue and is executed in the
dkato 0:f782d9c66c49 1317 * context of the event queue's dispatch loop.
dkato 0:f782d9c66c49 1318 *
dkato 0:f782d9c66c49 1319 * The post function is irq safe and can act as a mechanism for moving
dkato 0:f782d9c66c49 1320 * events out of irq contexts.
dkato 0:f782d9c66c49 1321 *
dkato 0:f782d9c66c49 1322 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 1323 * @return A unique id that represents the posted event and can
dkato 0:f782d9c66c49 1324 * be passed to EventQueue::cancel, or an id of 0 if
dkato 0:f782d9c66c49 1325 * there is not enough memory to allocate the event.
dkato 0:f782d9c66c49 1326 */
dkato 0:f782d9c66c49 1327 int post(A0 a0, A1 a1, A2 a2) const {
dkato 0:f782d9c66c49 1328 if (!_event) {
dkato 0:f782d9c66c49 1329 return 0;
dkato 0:f782d9c66c49 1330 }
dkato 0:f782d9c66c49 1331
dkato 0:f782d9c66c49 1332 _event->id = _event->post(_event, a0, a1, a2);
dkato 0:f782d9c66c49 1333 return _event->id;
dkato 0:f782d9c66c49 1334 }
dkato 0:f782d9c66c49 1335
dkato 0:f782d9c66c49 1336 /** Posts an event onto the underlying event queue, returning void
dkato 0:f782d9c66c49 1337 *
dkato 0:f782d9c66c49 1338 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 1339 */
dkato 0:f782d9c66c49 1340 void call(A0 a0, A1 a1, A2 a2) const {
dkato 0:f782d9c66c49 1341 MBED_UNUSED int id = post(a0, a1, a2);
dkato 0:f782d9c66c49 1342 MBED_ASSERT(id);
dkato 0:f782d9c66c49 1343 }
dkato 0:f782d9c66c49 1344
dkato 0:f782d9c66c49 1345 /** Posts an event onto the underlying event queue, returning void
dkato 0:f782d9c66c49 1346 *
dkato 0:f782d9c66c49 1347 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 1348 */
dkato 0:f782d9c66c49 1349 void operator()(A0 a0, A1 a1, A2 a2) const {
dkato 0:f782d9c66c49 1350 return call(a0, a1, a2);
dkato 0:f782d9c66c49 1351 }
dkato 0:f782d9c66c49 1352
dkato 0:f782d9c66c49 1353 /** Static thunk for passing as C-style function
dkato 0:f782d9c66c49 1354 *
dkato 0:f782d9c66c49 1355 * @param func Event to call passed as a void pointer
dkato 0:f782d9c66c49 1356 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 1357 */
dkato 0:f782d9c66c49 1358 static void thunk(void *func, A0 a0, A1 a1, A2 a2) {
dkato 0:f782d9c66c49 1359 return static_cast<Event*>(func)->call(a0, a1, a2);
dkato 0:f782d9c66c49 1360 }
dkato 0:f782d9c66c49 1361
dkato 0:f782d9c66c49 1362 /** Cancels the most recently posted event
dkato 0:f782d9c66c49 1363 *
dkato 0:f782d9c66c49 1364 * Attempts to cancel the most recently posted event. It is safe to call
dkato 0:f782d9c66c49 1365 * cancel after an event has already been dispatched.
dkato 0:f782d9c66c49 1366 *
dkato 0:f782d9c66c49 1367 * The cancel function is irq safe.
dkato 0:f782d9c66c49 1368 *
dkato 0:f782d9c66c49 1369 * If called while the event queue's dispatch loop is active, the cancel
dkato 0:f782d9c66c49 1370 * function does not garuntee that the event will not execute after it
dkato 0:f782d9c66c49 1371 * returns, as the event may have already begun executing.
dkato 0:f782d9c66c49 1372 */
dkato 0:f782d9c66c49 1373 void cancel() const {
dkato 0:f782d9c66c49 1374 if (_event) {
dkato 0:f782d9c66c49 1375 equeue_cancel(_event->equeue, _event->id);
dkato 0:f782d9c66c49 1376 }
dkato 0:f782d9c66c49 1377 }
dkato 0:f782d9c66c49 1378
dkato 0:f782d9c66c49 1379 private:
dkato 0:f782d9c66c49 1380 struct event {
dkato 0:f782d9c66c49 1381 unsigned ref;
dkato 0:f782d9c66c49 1382 equeue_t *equeue;
dkato 0:f782d9c66c49 1383 int id;
dkato 0:f782d9c66c49 1384
dkato 0:f782d9c66c49 1385 int delay;
dkato 0:f782d9c66c49 1386 int period;
dkato 0:f782d9c66c49 1387
dkato 0:f782d9c66c49 1388 int (*post)(struct event *, A0 a0, A1 a1, A2 a2);
dkato 0:f782d9c66c49 1389 void (*dtor)(struct event *);
dkato 0:f782d9c66c49 1390
dkato 0:f782d9c66c49 1391 // F follows
dkato 0:f782d9c66c49 1392 } *_event;
dkato 0:f782d9c66c49 1393
dkato 0:f782d9c66c49 1394 // Event attributes
dkato 0:f782d9c66c49 1395 template <typename F>
dkato 0:f782d9c66c49 1396 static int event_post(struct event *e, A0 a0, A1 a1, A2 a2) {
dkato 0:f782d9c66c49 1397 typedef EventQueue::context30<F, A0, A1, A2> C;
dkato 0:f782d9c66c49 1398 void *p = equeue_alloc(e->equeue, sizeof(C));
dkato 0:f782d9c66c49 1399 if (!p) {
dkato 0:f782d9c66c49 1400 return 0;
dkato 0:f782d9c66c49 1401 }
dkato 0:f782d9c66c49 1402
dkato 0:f782d9c66c49 1403 new (p) C(*(F*)(e + 1), a0, a1, a2);
dkato 0:f782d9c66c49 1404 equeue_event_delay(p, e->delay);
dkato 0:f782d9c66c49 1405 equeue_event_period(p, e->period);
dkato 0:f782d9c66c49 1406 equeue_event_dtor(p, &EventQueue::function_dtor<C>);
dkato 0:f782d9c66c49 1407 return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
dkato 0:f782d9c66c49 1408 }
dkato 0:f782d9c66c49 1409
dkato 0:f782d9c66c49 1410 template <typename F>
dkato 0:f782d9c66c49 1411 static void event_dtor(struct event *e) {
dkato 0:f782d9c66c49 1412 ((F*)(e + 1))->~F();
dkato 0:f782d9c66c49 1413 }
dkato 0:f782d9c66c49 1414
dkato 0:f782d9c66c49 1415 public:
dkato 0:f782d9c66c49 1416 /** Create an event
dkato 0:f782d9c66c49 1417 * @see Event::Event
dkato 0:f782d9c66c49 1418 */
dkato 0:f782d9c66c49 1419 template <typename F, typename C0>
dkato 0:f782d9c66c49 1420 Event(EventQueue *q, F f, C0 c0) {
dkato 0:f782d9c66c49 1421 new (this) Event(q, EventQueue::context13<F, C0, A0, A1, A2>(f, c0));
dkato 0:f782d9c66c49 1422 }
dkato 0:f782d9c66c49 1423
dkato 0:f782d9c66c49 1424 /** Create an event
dkato 0:f782d9c66c49 1425 * @see Event::Event
dkato 0:f782d9c66c49 1426 */
dkato 0:f782d9c66c49 1427 template <typename F, typename C0, typename C1>
dkato 0:f782d9c66c49 1428 Event(EventQueue *q, F f, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 1429 new (this) Event(q, EventQueue::context23<F, C0, C1, A0, A1, A2>(f, c0, c1));
dkato 0:f782d9c66c49 1430 }
dkato 0:f782d9c66c49 1431
dkato 0:f782d9c66c49 1432 /** Create an event
dkato 0:f782d9c66c49 1433 * @see Event::Event
dkato 0:f782d9c66c49 1434 */
dkato 0:f782d9c66c49 1435 template <typename F, typename C0, typename C1, typename C2>
dkato 0:f782d9c66c49 1436 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 1437 new (this) Event(q, EventQueue::context33<F, C0, C1, C2, A0, A1, A2>(f, c0, c1, c2));
dkato 0:f782d9c66c49 1438 }
dkato 0:f782d9c66c49 1439
dkato 0:f782d9c66c49 1440 /** Create an event
dkato 0:f782d9c66c49 1441 * @see Event::Event
dkato 0:f782d9c66c49 1442 */
dkato 0:f782d9c66c49 1443 template <typename F, typename C0, typename C1, typename C2, typename C3>
dkato 0:f782d9c66c49 1444 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 1445 new (this) Event(q, EventQueue::context43<F, C0, C1, C2, C3, A0, A1, A2>(f, c0, c1, c2, c3));
dkato 0:f782d9c66c49 1446 }
dkato 0:f782d9c66c49 1447
dkato 0:f782d9c66c49 1448 /** Create an event
dkato 0:f782d9c66c49 1449 * @see Event::Event
dkato 0:f782d9c66c49 1450 */
dkato 0:f782d9c66c49 1451 template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
dkato 0:f782d9c66c49 1452 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 1453 new (this) Event(q, EventQueue::context53<F, C0, C1, C2, C3, C4, A0, A1, A2>(f, c0, c1, c2, c3, c4));
dkato 0:f782d9c66c49 1454 }
dkato 0:f782d9c66c49 1455
dkato 0:f782d9c66c49 1456 /** Create an event
dkato 0:f782d9c66c49 1457 * @see Event::Event
dkato 0:f782d9c66c49 1458 */
dkato 0:f782d9c66c49 1459 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 1460 Event(EventQueue *q, T *obj, R (T::*method)(B0, A0, A1, A2), B0 b0) {
dkato 0:f782d9c66c49 1461 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 1462 }
dkato 0:f782d9c66c49 1463
dkato 0:f782d9c66c49 1464 /** Create an event
dkato 0:f782d9c66c49 1465 * @see Event::Event
dkato 0:f782d9c66c49 1466 */
dkato 0:f782d9c66c49 1467 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 1468 Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0, A1, A2) const, B0 b0) {
dkato 0:f782d9c66c49 1469 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 1470 }
dkato 0:f782d9c66c49 1471
dkato 0:f782d9c66c49 1472 /** Create an event
dkato 0:f782d9c66c49 1473 * @see Event::Event
dkato 0:f782d9c66c49 1474 */
dkato 0:f782d9c66c49 1475 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 1476 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0, A1, A2) volatile, B0 b0) {
dkato 0:f782d9c66c49 1477 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 1478 }
dkato 0:f782d9c66c49 1479
dkato 0:f782d9c66c49 1480 /** Create an event
dkato 0:f782d9c66c49 1481 * @see Event::Event
dkato 0:f782d9c66c49 1482 */
dkato 0:f782d9c66c49 1483 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 1484 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0, A1, A2) const volatile, B0 b0) {
dkato 0:f782d9c66c49 1485 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 1486 }
dkato 0:f782d9c66c49 1487
dkato 0:f782d9c66c49 1488 /** Create an event
dkato 0:f782d9c66c49 1489 * @see Event::Event
dkato 0:f782d9c66c49 1490 */
dkato 0:f782d9c66c49 1491 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 1492 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0, A1, A2), B0 b0, B1 b1) {
dkato 0:f782d9c66c49 1493 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 1494 }
dkato 0:f782d9c66c49 1495
dkato 0:f782d9c66c49 1496 /** Create an event
dkato 0:f782d9c66c49 1497 * @see Event::Event
dkato 0:f782d9c66c49 1498 */
dkato 0:f782d9c66c49 1499 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 1500 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0, A1, A2) const, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 1501 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 1502 }
dkato 0:f782d9c66c49 1503
dkato 0:f782d9c66c49 1504 /** Create an event
dkato 0:f782d9c66c49 1505 * @see Event::Event
dkato 0:f782d9c66c49 1506 */
dkato 0:f782d9c66c49 1507 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 1508 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2) volatile, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 1509 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 1510 }
dkato 0:f782d9c66c49 1511
dkato 0:f782d9c66c49 1512 /** Create an event
dkato 0:f782d9c66c49 1513 * @see Event::Event
dkato 0:f782d9c66c49 1514 */
dkato 0:f782d9c66c49 1515 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 1516 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2) const volatile, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 1517 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 1518 }
dkato 0:f782d9c66c49 1519
dkato 0:f782d9c66c49 1520 /** Create an event
dkato 0:f782d9c66c49 1521 * @see Event::Event
dkato 0:f782d9c66c49 1522 */
dkato 0:f782d9c66c49 1523 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 1524 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2), B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 1525 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 1526 }
dkato 0:f782d9c66c49 1527
dkato 0:f782d9c66c49 1528 /** Create an event
dkato 0:f782d9c66c49 1529 * @see Event::Event
dkato 0:f782d9c66c49 1530 */
dkato 0:f782d9c66c49 1531 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 1532 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) const, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 1533 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 1534 }
dkato 0:f782d9c66c49 1535
dkato 0:f782d9c66c49 1536 /** Create an event
dkato 0:f782d9c66c49 1537 * @see Event::Event
dkato 0:f782d9c66c49 1538 */
dkato 0:f782d9c66c49 1539 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 1540 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) volatile, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 1541 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 1542 }
dkato 0:f782d9c66c49 1543
dkato 0:f782d9c66c49 1544 /** Create an event
dkato 0:f782d9c66c49 1545 * @see Event::Event
dkato 0:f782d9c66c49 1546 */
dkato 0:f782d9c66c49 1547 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 1548 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) const volatile, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 1549 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 1550 }
dkato 0:f782d9c66c49 1551
dkato 0:f782d9c66c49 1552 /** Create an event
dkato 0:f782d9c66c49 1553 * @see Event::Event
dkato 0:f782d9c66c49 1554 */
dkato 0:f782d9c66c49 1555 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 1556 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2), B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 1557 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 1558 }
dkato 0:f782d9c66c49 1559
dkato 0:f782d9c66c49 1560 /** Create an event
dkato 0:f782d9c66c49 1561 * @see Event::Event
dkato 0:f782d9c66c49 1562 */
dkato 0:f782d9c66c49 1563 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 1564 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2) const, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 1565 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 1566 }
dkato 0:f782d9c66c49 1567
dkato 0:f782d9c66c49 1568 /** Create an event
dkato 0:f782d9c66c49 1569 * @see Event::Event
dkato 0:f782d9c66c49 1570 */
dkato 0:f782d9c66c49 1571 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 1572 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 1573 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 1574 }
dkato 0:f782d9c66c49 1575
dkato 0:f782d9c66c49 1576 /** Create an event
dkato 0:f782d9c66c49 1577 * @see Event::Event
dkato 0:f782d9c66c49 1578 */
dkato 0:f782d9c66c49 1579 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 1580 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2) const volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 1581 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 1582 }
dkato 0:f782d9c66c49 1583
dkato 0:f782d9c66c49 1584 /** Create an event
dkato 0:f782d9c66c49 1585 * @see Event::Event
dkato 0:f782d9c66c49 1586 */
dkato 0:f782d9c66c49 1587 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 1588 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 1589 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 1590 }
dkato 0:f782d9c66c49 1591
dkato 0:f782d9c66c49 1592 /** Create an event
dkato 0:f782d9c66c49 1593 * @see Event::Event
dkato 0:f782d9c66c49 1594 */
dkato 0:f782d9c66c49 1595 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 1596 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2) const, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 1597 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 1598 }
dkato 0:f782d9c66c49 1599
dkato 0:f782d9c66c49 1600 /** Create an event
dkato 0:f782d9c66c49 1601 * @see Event::Event
dkato 0:f782d9c66c49 1602 */
dkato 0:f782d9c66c49 1603 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 1604 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2) volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 1605 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 1606 }
dkato 0:f782d9c66c49 1607
dkato 0:f782d9c66c49 1608 /** Create an event
dkato 0:f782d9c66c49 1609 * @see Event::Event
dkato 0:f782d9c66c49 1610 */
dkato 0:f782d9c66c49 1611 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 1612 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2) const volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 1613 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 1614 }
dkato 0:f782d9c66c49 1615 };
dkato 0:f782d9c66c49 1616
dkato 0:f782d9c66c49 1617 /** Event
dkato 0:f782d9c66c49 1618 *
dkato 0:f782d9c66c49 1619 * Representation of an event for fine-grain dispatch control
dkato 0:f782d9c66c49 1620 */
dkato 0:f782d9c66c49 1621 template <typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 1622 class Event<void(A0, A1, A2, A3)> {
dkato 0:f782d9c66c49 1623 public:
dkato 0:f782d9c66c49 1624 /** Create an event
dkato 0:f782d9c66c49 1625 *
dkato 0:f782d9c66c49 1626 * Constructs an event bound to the specified event queue. The specified
dkato 0:f782d9c66c49 1627 * callback acts as the target for the event and is executed in the
dkato 0:f782d9c66c49 1628 * context of the event queue's dispatch loop once posted.
dkato 0:f782d9c66c49 1629 *
dkato 0:f782d9c66c49 1630 * @param q Event queue to dispatch on
dkato 0:f782d9c66c49 1631 * @param f Function to execute when the event is dispatched
dkato 0:f782d9c66c49 1632 * @param c0..c4 Arguments to bind to the callback, these arguments are
dkato 0:f782d9c66c49 1633 * allocated on an irq-safe allocator from the event queue's
dkato 0:f782d9c66c49 1634 * memory pool. Must be type-compatible with b0..b4, the
dkato 0:f782d9c66c49 1635 * arguments to the underlying callback.
dkato 0:f782d9c66c49 1636 */
dkato 0:f782d9c66c49 1637 template <typename F>
dkato 0:f782d9c66c49 1638 Event(EventQueue *q, F f) {
dkato 0:f782d9c66c49 1639 _event = static_cast<struct event *>(
dkato 0:f782d9c66c49 1640 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
dkato 0:f782d9c66c49 1641
dkato 0:f782d9c66c49 1642 if (_event) {
dkato 0:f782d9c66c49 1643 _event->equeue = &q->_equeue;
dkato 0:f782d9c66c49 1644 _event->id = 0;
dkato 0:f782d9c66c49 1645 _event->delay = 0;
dkato 0:f782d9c66c49 1646 _event->period = -1;
dkato 0:f782d9c66c49 1647
dkato 0:f782d9c66c49 1648 _event->post = &Event::event_post<F>;
dkato 0:f782d9c66c49 1649 _event->dtor = &Event::event_dtor<F>;
dkato 0:f782d9c66c49 1650
dkato 0:f782d9c66c49 1651 new (_event+1) F(f);
dkato 0:f782d9c66c49 1652
dkato 0:f782d9c66c49 1653 _event->ref = 1;
dkato 0:f782d9c66c49 1654 }
dkato 0:f782d9c66c49 1655 }
dkato 0:f782d9c66c49 1656
dkato 0:f782d9c66c49 1657 /** Copy constructor for events
dkato 0:f782d9c66c49 1658 */
dkato 0:f782d9c66c49 1659 Event(const Event &e) {
dkato 0:f782d9c66c49 1660 _event = 0;
dkato 0:f782d9c66c49 1661 if (e._event) {
dkato 0:f782d9c66c49 1662 _event = e._event;
dkato 0:f782d9c66c49 1663 _event->ref += 1;
dkato 0:f782d9c66c49 1664 }
dkato 0:f782d9c66c49 1665 }
dkato 0:f782d9c66c49 1666
dkato 0:f782d9c66c49 1667 /** Assignment operator for events
dkato 0:f782d9c66c49 1668 */
dkato 0:f782d9c66c49 1669 Event &operator=(const Event &that) {
dkato 0:f782d9c66c49 1670 if (this != &that) {
dkato 0:f782d9c66c49 1671 this->~Event();
dkato 0:f782d9c66c49 1672 new (this) Event(that);
dkato 0:f782d9c66c49 1673 }
dkato 0:f782d9c66c49 1674
dkato 0:f782d9c66c49 1675 return *this;
dkato 0:f782d9c66c49 1676 }
dkato 0:f782d9c66c49 1677
dkato 0:f782d9c66c49 1678 /** Destructor for events
dkato 0:f782d9c66c49 1679 */
dkato 0:f782d9c66c49 1680 ~Event() {
dkato 0:f782d9c66c49 1681 if (_event) {
dkato 0:f782d9c66c49 1682 _event->ref -= 1;
dkato 0:f782d9c66c49 1683 if (_event->ref == 0) {
dkato 0:f782d9c66c49 1684 _event->dtor(_event);
dkato 0:f782d9c66c49 1685 equeue_dealloc(_event->equeue, _event);
dkato 0:f782d9c66c49 1686 }
dkato 0:f782d9c66c49 1687 }
dkato 0:f782d9c66c49 1688 }
dkato 0:f782d9c66c49 1689
dkato 0:f782d9c66c49 1690 /** Configure the delay of an event
dkato 0:f782d9c66c49 1691 *
dkato 0:f782d9c66c49 1692 * @param delay Millisecond delay before dispatching the event
dkato 0:f782d9c66c49 1693 */
dkato 0:f782d9c66c49 1694 void delay(int delay) {
dkato 0:f782d9c66c49 1695 if (_event) {
dkato 0:f782d9c66c49 1696 _event->delay = delay;
dkato 0:f782d9c66c49 1697 }
dkato 0:f782d9c66c49 1698 }
dkato 0:f782d9c66c49 1699
dkato 0:f782d9c66c49 1700 /** Configure the period of an event
dkato 0:f782d9c66c49 1701 *
dkato 0:f782d9c66c49 1702 * @param period Millisecond period for repeatedly dispatching an event
dkato 0:f782d9c66c49 1703 */
dkato 0:f782d9c66c49 1704 void period(int period) {
dkato 0:f782d9c66c49 1705 if (_event) {
dkato 0:f782d9c66c49 1706 _event->period = period;
dkato 0:f782d9c66c49 1707 }
dkato 0:f782d9c66c49 1708 }
dkato 0:f782d9c66c49 1709
dkato 0:f782d9c66c49 1710 /** Posts an event onto the underlying event queue
dkato 0:f782d9c66c49 1711 *
dkato 0:f782d9c66c49 1712 * The event is posted to the underlying queue and is executed in the
dkato 0:f782d9c66c49 1713 * context of the event queue's dispatch loop.
dkato 0:f782d9c66c49 1714 *
dkato 0:f782d9c66c49 1715 * The post function is irq safe and can act as a mechanism for moving
dkato 0:f782d9c66c49 1716 * events out of irq contexts.
dkato 0:f782d9c66c49 1717 *
dkato 0:f782d9c66c49 1718 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 1719 * @return A unique id that represents the posted event and can
dkato 0:f782d9c66c49 1720 * be passed to EventQueue::cancel, or an id of 0 if
dkato 0:f782d9c66c49 1721 * there is not enough memory to allocate the event.
dkato 0:f782d9c66c49 1722 */
dkato 0:f782d9c66c49 1723 int post(A0 a0, A1 a1, A2 a2, A3 a3) const {
dkato 0:f782d9c66c49 1724 if (!_event) {
dkato 0:f782d9c66c49 1725 return 0;
dkato 0:f782d9c66c49 1726 }
dkato 0:f782d9c66c49 1727
dkato 0:f782d9c66c49 1728 _event->id = _event->post(_event, a0, a1, a2, a3);
dkato 0:f782d9c66c49 1729 return _event->id;
dkato 0:f782d9c66c49 1730 }
dkato 0:f782d9c66c49 1731
dkato 0:f782d9c66c49 1732 /** Posts an event onto the underlying event queue, returning void
dkato 0:f782d9c66c49 1733 *
dkato 0:f782d9c66c49 1734 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 1735 */
dkato 0:f782d9c66c49 1736 void call(A0 a0, A1 a1, A2 a2, A3 a3) const {
dkato 0:f782d9c66c49 1737 MBED_UNUSED int id = post(a0, a1, a2, a3);
dkato 0:f782d9c66c49 1738 MBED_ASSERT(id);
dkato 0:f782d9c66c49 1739 }
dkato 0:f782d9c66c49 1740
dkato 0:f782d9c66c49 1741 /** Posts an event onto the underlying event queue, returning void
dkato 0:f782d9c66c49 1742 *
dkato 0:f782d9c66c49 1743 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 1744 */
dkato 0:f782d9c66c49 1745 void operator()(A0 a0, A1 a1, A2 a2, A3 a3) const {
dkato 0:f782d9c66c49 1746 return call(a0, a1, a2, a3);
dkato 0:f782d9c66c49 1747 }
dkato 0:f782d9c66c49 1748
dkato 0:f782d9c66c49 1749 /** Static thunk for passing as C-style function
dkato 0:f782d9c66c49 1750 *
dkato 0:f782d9c66c49 1751 * @param func Event to call passed as a void pointer
dkato 0:f782d9c66c49 1752 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 1753 */
dkato 0:f782d9c66c49 1754 static void thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3) {
dkato 0:f782d9c66c49 1755 return static_cast<Event*>(func)->call(a0, a1, a2, a3);
dkato 0:f782d9c66c49 1756 }
dkato 0:f782d9c66c49 1757
dkato 0:f782d9c66c49 1758 /** Cancels the most recently posted event
dkato 0:f782d9c66c49 1759 *
dkato 0:f782d9c66c49 1760 * Attempts to cancel the most recently posted event. It is safe to call
dkato 0:f782d9c66c49 1761 * cancel after an event has already been dispatched.
dkato 0:f782d9c66c49 1762 *
dkato 0:f782d9c66c49 1763 * The cancel function is irq safe.
dkato 0:f782d9c66c49 1764 *
dkato 0:f782d9c66c49 1765 * If called while the event queue's dispatch loop is active, the cancel
dkato 0:f782d9c66c49 1766 * function does not garuntee that the event will not execute after it
dkato 0:f782d9c66c49 1767 * returns, as the event may have already begun executing.
dkato 0:f782d9c66c49 1768 */
dkato 0:f782d9c66c49 1769 void cancel() const {
dkato 0:f782d9c66c49 1770 if (_event) {
dkato 0:f782d9c66c49 1771 equeue_cancel(_event->equeue, _event->id);
dkato 0:f782d9c66c49 1772 }
dkato 0:f782d9c66c49 1773 }
dkato 0:f782d9c66c49 1774
dkato 0:f782d9c66c49 1775 private:
dkato 0:f782d9c66c49 1776 struct event {
dkato 0:f782d9c66c49 1777 unsigned ref;
dkato 0:f782d9c66c49 1778 equeue_t *equeue;
dkato 0:f782d9c66c49 1779 int id;
dkato 0:f782d9c66c49 1780
dkato 0:f782d9c66c49 1781 int delay;
dkato 0:f782d9c66c49 1782 int period;
dkato 0:f782d9c66c49 1783
dkato 0:f782d9c66c49 1784 int (*post)(struct event *, A0 a0, A1 a1, A2 a2, A3 a3);
dkato 0:f782d9c66c49 1785 void (*dtor)(struct event *);
dkato 0:f782d9c66c49 1786
dkato 0:f782d9c66c49 1787 // F follows
dkato 0:f782d9c66c49 1788 } *_event;
dkato 0:f782d9c66c49 1789
dkato 0:f782d9c66c49 1790 // Event attributes
dkato 0:f782d9c66c49 1791 template <typename F>
dkato 0:f782d9c66c49 1792 static int event_post(struct event *e, A0 a0, A1 a1, A2 a2, A3 a3) {
dkato 0:f782d9c66c49 1793 typedef EventQueue::context40<F, A0, A1, A2, A3> C;
dkato 0:f782d9c66c49 1794 void *p = equeue_alloc(e->equeue, sizeof(C));
dkato 0:f782d9c66c49 1795 if (!p) {
dkato 0:f782d9c66c49 1796 return 0;
dkato 0:f782d9c66c49 1797 }
dkato 0:f782d9c66c49 1798
dkato 0:f782d9c66c49 1799 new (p) C(*(F*)(e + 1), a0, a1, a2, a3);
dkato 0:f782d9c66c49 1800 equeue_event_delay(p, e->delay);
dkato 0:f782d9c66c49 1801 equeue_event_period(p, e->period);
dkato 0:f782d9c66c49 1802 equeue_event_dtor(p, &EventQueue::function_dtor<C>);
dkato 0:f782d9c66c49 1803 return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
dkato 0:f782d9c66c49 1804 }
dkato 0:f782d9c66c49 1805
dkato 0:f782d9c66c49 1806 template <typename F>
dkato 0:f782d9c66c49 1807 static void event_dtor(struct event *e) {
dkato 0:f782d9c66c49 1808 ((F*)(e + 1))->~F();
dkato 0:f782d9c66c49 1809 }
dkato 0:f782d9c66c49 1810
dkato 0:f782d9c66c49 1811 public:
dkato 0:f782d9c66c49 1812 /** Create an event
dkato 0:f782d9c66c49 1813 * @see Event::Event
dkato 0:f782d9c66c49 1814 */
dkato 0:f782d9c66c49 1815 template <typename F, typename C0>
dkato 0:f782d9c66c49 1816 Event(EventQueue *q, F f, C0 c0) {
dkato 0:f782d9c66c49 1817 new (this) Event(q, EventQueue::context14<F, C0, A0, A1, A2, A3>(f, c0));
dkato 0:f782d9c66c49 1818 }
dkato 0:f782d9c66c49 1819
dkato 0:f782d9c66c49 1820 /** Create an event
dkato 0:f782d9c66c49 1821 * @see Event::Event
dkato 0:f782d9c66c49 1822 */
dkato 0:f782d9c66c49 1823 template <typename F, typename C0, typename C1>
dkato 0:f782d9c66c49 1824 Event(EventQueue *q, F f, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 1825 new (this) Event(q, EventQueue::context24<F, C0, C1, A0, A1, A2, A3>(f, c0, c1));
dkato 0:f782d9c66c49 1826 }
dkato 0:f782d9c66c49 1827
dkato 0:f782d9c66c49 1828 /** Create an event
dkato 0:f782d9c66c49 1829 * @see Event::Event
dkato 0:f782d9c66c49 1830 */
dkato 0:f782d9c66c49 1831 template <typename F, typename C0, typename C1, typename C2>
dkato 0:f782d9c66c49 1832 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 1833 new (this) Event(q, EventQueue::context34<F, C0, C1, C2, A0, A1, A2, A3>(f, c0, c1, c2));
dkato 0:f782d9c66c49 1834 }
dkato 0:f782d9c66c49 1835
dkato 0:f782d9c66c49 1836 /** Create an event
dkato 0:f782d9c66c49 1837 * @see Event::Event
dkato 0:f782d9c66c49 1838 */
dkato 0:f782d9c66c49 1839 template <typename F, typename C0, typename C1, typename C2, typename C3>
dkato 0:f782d9c66c49 1840 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 1841 new (this) Event(q, EventQueue::context44<F, C0, C1, C2, C3, A0, A1, A2, A3>(f, c0, c1, c2, c3));
dkato 0:f782d9c66c49 1842 }
dkato 0:f782d9c66c49 1843
dkato 0:f782d9c66c49 1844 /** Create an event
dkato 0:f782d9c66c49 1845 * @see Event::Event
dkato 0:f782d9c66c49 1846 */
dkato 0:f782d9c66c49 1847 template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
dkato 0:f782d9c66c49 1848 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 1849 new (this) Event(q, EventQueue::context54<F, C0, C1, C2, C3, C4, A0, A1, A2, A3>(f, c0, c1, c2, c3, c4));
dkato 0:f782d9c66c49 1850 }
dkato 0:f782d9c66c49 1851
dkato 0:f782d9c66c49 1852 /** Create an event
dkato 0:f782d9c66c49 1853 * @see Event::Event
dkato 0:f782d9c66c49 1854 */
dkato 0:f782d9c66c49 1855 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 1856 Event(EventQueue *q, T *obj, R (T::*method)(B0, A0, A1, A2, A3), B0 b0) {
dkato 0:f782d9c66c49 1857 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 1858 }
dkato 0:f782d9c66c49 1859
dkato 0:f782d9c66c49 1860 /** Create an event
dkato 0:f782d9c66c49 1861 * @see Event::Event
dkato 0:f782d9c66c49 1862 */
dkato 0:f782d9c66c49 1863 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 1864 Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0, A1, A2, A3) const, B0 b0) {
dkato 0:f782d9c66c49 1865 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 1866 }
dkato 0:f782d9c66c49 1867
dkato 0:f782d9c66c49 1868 /** Create an event
dkato 0:f782d9c66c49 1869 * @see Event::Event
dkato 0:f782d9c66c49 1870 */
dkato 0:f782d9c66c49 1871 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 1872 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3) volatile, B0 b0) {
dkato 0:f782d9c66c49 1873 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 1874 }
dkato 0:f782d9c66c49 1875
dkato 0:f782d9c66c49 1876 /** Create an event
dkato 0:f782d9c66c49 1877 * @see Event::Event
dkato 0:f782d9c66c49 1878 */
dkato 0:f782d9c66c49 1879 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 1880 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3) const volatile, B0 b0) {
dkato 0:f782d9c66c49 1881 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 1882 }
dkato 0:f782d9c66c49 1883
dkato 0:f782d9c66c49 1884 /** Create an event
dkato 0:f782d9c66c49 1885 * @see Event::Event
dkato 0:f782d9c66c49 1886 */
dkato 0:f782d9c66c49 1887 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 1888 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3), B0 b0, B1 b1) {
dkato 0:f782d9c66c49 1889 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 1890 }
dkato 0:f782d9c66c49 1891
dkato 0:f782d9c66c49 1892 /** Create an event
dkato 0:f782d9c66c49 1893 * @see Event::Event
dkato 0:f782d9c66c49 1894 */
dkato 0:f782d9c66c49 1895 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 1896 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) const, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 1897 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 1898 }
dkato 0:f782d9c66c49 1899
dkato 0:f782d9c66c49 1900 /** Create an event
dkato 0:f782d9c66c49 1901 * @see Event::Event
dkato 0:f782d9c66c49 1902 */
dkato 0:f782d9c66c49 1903 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 1904 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) volatile, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 1905 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 1906 }
dkato 0:f782d9c66c49 1907
dkato 0:f782d9c66c49 1908 /** Create an event
dkato 0:f782d9c66c49 1909 * @see Event::Event
dkato 0:f782d9c66c49 1910 */
dkato 0:f782d9c66c49 1911 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 1912 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) const volatile, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 1913 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 1914 }
dkato 0:f782d9c66c49 1915
dkato 0:f782d9c66c49 1916 /** Create an event
dkato 0:f782d9c66c49 1917 * @see Event::Event
dkato 0:f782d9c66c49 1918 */
dkato 0:f782d9c66c49 1919 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 1920 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3), B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 1921 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 1922 }
dkato 0:f782d9c66c49 1923
dkato 0:f782d9c66c49 1924 /** Create an event
dkato 0:f782d9c66c49 1925 * @see Event::Event
dkato 0:f782d9c66c49 1926 */
dkato 0:f782d9c66c49 1927 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 1928 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) const, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 1929 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 1930 }
dkato 0:f782d9c66c49 1931
dkato 0:f782d9c66c49 1932 /** Create an event
dkato 0:f782d9c66c49 1933 * @see Event::Event
dkato 0:f782d9c66c49 1934 */
dkato 0:f782d9c66c49 1935 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 1936 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) volatile, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 1937 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 1938 }
dkato 0:f782d9c66c49 1939
dkato 0:f782d9c66c49 1940 /** Create an event
dkato 0:f782d9c66c49 1941 * @see Event::Event
dkato 0:f782d9c66c49 1942 */
dkato 0:f782d9c66c49 1943 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 1944 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) const volatile, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 1945 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 1946 }
dkato 0:f782d9c66c49 1947
dkato 0:f782d9c66c49 1948 /** Create an event
dkato 0:f782d9c66c49 1949 * @see Event::Event
dkato 0:f782d9c66c49 1950 */
dkato 0:f782d9c66c49 1951 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 1952 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3), B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 1953 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 1954 }
dkato 0:f782d9c66c49 1955
dkato 0:f782d9c66c49 1956 /** Create an event
dkato 0:f782d9c66c49 1957 * @see Event::Event
dkato 0:f782d9c66c49 1958 */
dkato 0:f782d9c66c49 1959 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 1960 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3) const, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 1961 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 1962 }
dkato 0:f782d9c66c49 1963
dkato 0:f782d9c66c49 1964 /** Create an event
dkato 0:f782d9c66c49 1965 * @see Event::Event
dkato 0:f782d9c66c49 1966 */
dkato 0:f782d9c66c49 1967 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 1968 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 1969 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 1970 }
dkato 0:f782d9c66c49 1971
dkato 0:f782d9c66c49 1972 /** Create an event
dkato 0:f782d9c66c49 1973 * @see Event::Event
dkato 0:f782d9c66c49 1974 */
dkato 0:f782d9c66c49 1975 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 1976 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3) const volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 1977 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 1978 }
dkato 0:f782d9c66c49 1979
dkato 0:f782d9c66c49 1980 /** Create an event
dkato 0:f782d9c66c49 1981 * @see Event::Event
dkato 0:f782d9c66c49 1982 */
dkato 0:f782d9c66c49 1983 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 1984 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 1985 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 1986 }
dkato 0:f782d9c66c49 1987
dkato 0:f782d9c66c49 1988 /** Create an event
dkato 0:f782d9c66c49 1989 * @see Event::Event
dkato 0:f782d9c66c49 1990 */
dkato 0:f782d9c66c49 1991 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 1992 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3) const, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 1993 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 1994 }
dkato 0:f782d9c66c49 1995
dkato 0:f782d9c66c49 1996 /** Create an event
dkato 0:f782d9c66c49 1997 * @see Event::Event
dkato 0:f782d9c66c49 1998 */
dkato 0:f782d9c66c49 1999 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 2000 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3) volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 2001 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 2002 }
dkato 0:f782d9c66c49 2003
dkato 0:f782d9c66c49 2004 /** Create an event
dkato 0:f782d9c66c49 2005 * @see Event::Event
dkato 0:f782d9c66c49 2006 */
dkato 0:f782d9c66c49 2007 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 2008 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3) const volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 2009 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 2010 }
dkato 0:f782d9c66c49 2011 };
dkato 0:f782d9c66c49 2012
dkato 0:f782d9c66c49 2013 /** Event
dkato 0:f782d9c66c49 2014 *
dkato 0:f782d9c66c49 2015 * Representation of an event for fine-grain dispatch control
dkato 0:f782d9c66c49 2016 */
dkato 0:f782d9c66c49 2017 template <typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 2018 class Event<void(A0, A1, A2, A3, A4)> {
dkato 0:f782d9c66c49 2019 public:
dkato 0:f782d9c66c49 2020 /** Create an event
dkato 0:f782d9c66c49 2021 *
dkato 0:f782d9c66c49 2022 * Constructs an event bound to the specified event queue. The specified
dkato 0:f782d9c66c49 2023 * callback acts as the target for the event and is executed in the
dkato 0:f782d9c66c49 2024 * context of the event queue's dispatch loop once posted.
dkato 0:f782d9c66c49 2025 *
dkato 0:f782d9c66c49 2026 * @param q Event queue to dispatch on
dkato 0:f782d9c66c49 2027 * @param f Function to execute when the event is dispatched
dkato 0:f782d9c66c49 2028 * @param c0..c4 Arguments to bind to the callback, these arguments are
dkato 0:f782d9c66c49 2029 * allocated on an irq-safe allocator from the event queue's
dkato 0:f782d9c66c49 2030 * memory pool. Must be type-compatible with b0..b4, the
dkato 0:f782d9c66c49 2031 * arguments to the underlying callback.
dkato 0:f782d9c66c49 2032 */
dkato 0:f782d9c66c49 2033 template <typename F>
dkato 0:f782d9c66c49 2034 Event(EventQueue *q, F f) {
dkato 0:f782d9c66c49 2035 _event = static_cast<struct event *>(
dkato 0:f782d9c66c49 2036 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
dkato 0:f782d9c66c49 2037
dkato 0:f782d9c66c49 2038 if (_event) {
dkato 0:f782d9c66c49 2039 _event->equeue = &q->_equeue;
dkato 0:f782d9c66c49 2040 _event->id = 0;
dkato 0:f782d9c66c49 2041 _event->delay = 0;
dkato 0:f782d9c66c49 2042 _event->period = -1;
dkato 0:f782d9c66c49 2043
dkato 0:f782d9c66c49 2044 _event->post = &Event::event_post<F>;
dkato 0:f782d9c66c49 2045 _event->dtor = &Event::event_dtor<F>;
dkato 0:f782d9c66c49 2046
dkato 0:f782d9c66c49 2047 new (_event+1) F(f);
dkato 0:f782d9c66c49 2048
dkato 0:f782d9c66c49 2049 _event->ref = 1;
dkato 0:f782d9c66c49 2050 }
dkato 0:f782d9c66c49 2051 }
dkato 0:f782d9c66c49 2052
dkato 0:f782d9c66c49 2053 /** Copy constructor for events
dkato 0:f782d9c66c49 2054 */
dkato 0:f782d9c66c49 2055 Event(const Event &e) {
dkato 0:f782d9c66c49 2056 _event = 0;
dkato 0:f782d9c66c49 2057 if (e._event) {
dkato 0:f782d9c66c49 2058 _event = e._event;
dkato 0:f782d9c66c49 2059 _event->ref += 1;
dkato 0:f782d9c66c49 2060 }
dkato 0:f782d9c66c49 2061 }
dkato 0:f782d9c66c49 2062
dkato 0:f782d9c66c49 2063 /** Assignment operator for events
dkato 0:f782d9c66c49 2064 */
dkato 0:f782d9c66c49 2065 Event &operator=(const Event &that) {
dkato 0:f782d9c66c49 2066 if (this != &that) {
dkato 0:f782d9c66c49 2067 this->~Event();
dkato 0:f782d9c66c49 2068 new (this) Event(that);
dkato 0:f782d9c66c49 2069 }
dkato 0:f782d9c66c49 2070
dkato 0:f782d9c66c49 2071 return *this;
dkato 0:f782d9c66c49 2072 }
dkato 0:f782d9c66c49 2073
dkato 0:f782d9c66c49 2074 /** Destructor for events
dkato 0:f782d9c66c49 2075 */
dkato 0:f782d9c66c49 2076 ~Event() {
dkato 0:f782d9c66c49 2077 if (_event) {
dkato 0:f782d9c66c49 2078 _event->ref -= 1;
dkato 0:f782d9c66c49 2079 if (_event->ref == 0) {
dkato 0:f782d9c66c49 2080 _event->dtor(_event);
dkato 0:f782d9c66c49 2081 equeue_dealloc(_event->equeue, _event);
dkato 0:f782d9c66c49 2082 }
dkato 0:f782d9c66c49 2083 }
dkato 0:f782d9c66c49 2084 }
dkato 0:f782d9c66c49 2085
dkato 0:f782d9c66c49 2086 /** Configure the delay of an event
dkato 0:f782d9c66c49 2087 *
dkato 0:f782d9c66c49 2088 * @param delay Millisecond delay before dispatching the event
dkato 0:f782d9c66c49 2089 */
dkato 0:f782d9c66c49 2090 void delay(int delay) {
dkato 0:f782d9c66c49 2091 if (_event) {
dkato 0:f782d9c66c49 2092 _event->delay = delay;
dkato 0:f782d9c66c49 2093 }
dkato 0:f782d9c66c49 2094 }
dkato 0:f782d9c66c49 2095
dkato 0:f782d9c66c49 2096 /** Configure the period of an event
dkato 0:f782d9c66c49 2097 *
dkato 0:f782d9c66c49 2098 * @param period Millisecond period for repeatedly dispatching an event
dkato 0:f782d9c66c49 2099 */
dkato 0:f782d9c66c49 2100 void period(int period) {
dkato 0:f782d9c66c49 2101 if (_event) {
dkato 0:f782d9c66c49 2102 _event->period = period;
dkato 0:f782d9c66c49 2103 }
dkato 0:f782d9c66c49 2104 }
dkato 0:f782d9c66c49 2105
dkato 0:f782d9c66c49 2106 /** Posts an event onto the underlying event queue
dkato 0:f782d9c66c49 2107 *
dkato 0:f782d9c66c49 2108 * The event is posted to the underlying queue and is executed in the
dkato 0:f782d9c66c49 2109 * context of the event queue's dispatch loop.
dkato 0:f782d9c66c49 2110 *
dkato 0:f782d9c66c49 2111 * The post function is irq safe and can act as a mechanism for moving
dkato 0:f782d9c66c49 2112 * events out of irq contexts.
dkato 0:f782d9c66c49 2113 *
dkato 0:f782d9c66c49 2114 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 2115 * @return A unique id that represents the posted event and can
dkato 0:f782d9c66c49 2116 * be passed to EventQueue::cancel, or an id of 0 if
dkato 0:f782d9c66c49 2117 * there is not enough memory to allocate the event.
dkato 0:f782d9c66c49 2118 */
dkato 0:f782d9c66c49 2119 int post(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
dkato 0:f782d9c66c49 2120 if (!_event) {
dkato 0:f782d9c66c49 2121 return 0;
dkato 0:f782d9c66c49 2122 }
dkato 0:f782d9c66c49 2123
dkato 0:f782d9c66c49 2124 _event->id = _event->post(_event, a0, a1, a2, a3, a4);
dkato 0:f782d9c66c49 2125 return _event->id;
dkato 0:f782d9c66c49 2126 }
dkato 0:f782d9c66c49 2127
dkato 0:f782d9c66c49 2128 /** Posts an event onto the underlying event queue, returning void
dkato 0:f782d9c66c49 2129 *
dkato 0:f782d9c66c49 2130 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 2131 */
dkato 0:f782d9c66c49 2132 void call(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
dkato 0:f782d9c66c49 2133 MBED_UNUSED int id = post(a0, a1, a2, a3, a4);
dkato 0:f782d9c66c49 2134 MBED_ASSERT(id);
dkato 0:f782d9c66c49 2135 }
dkato 0:f782d9c66c49 2136
dkato 0:f782d9c66c49 2137 /** Posts an event onto the underlying event queue, returning void
dkato 0:f782d9c66c49 2138 *
dkato 0:f782d9c66c49 2139 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 2140 */
dkato 0:f782d9c66c49 2141 void operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
dkato 0:f782d9c66c49 2142 return call(a0, a1, a2, a3, a4);
dkato 0:f782d9c66c49 2143 }
dkato 0:f782d9c66c49 2144
dkato 0:f782d9c66c49 2145 /** Static thunk for passing as C-style function
dkato 0:f782d9c66c49 2146 *
dkato 0:f782d9c66c49 2147 * @param func Event to call passed as a void pointer
dkato 0:f782d9c66c49 2148 * @param a0..a4 Arguments to pass to the event
dkato 0:f782d9c66c49 2149 */
dkato 0:f782d9c66c49 2150 static void thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
dkato 0:f782d9c66c49 2151 return static_cast<Event*>(func)->call(a0, a1, a2, a3, a4);
dkato 0:f782d9c66c49 2152 }
dkato 0:f782d9c66c49 2153
dkato 0:f782d9c66c49 2154 /** Cancels the most recently posted event
dkato 0:f782d9c66c49 2155 *
dkato 0:f782d9c66c49 2156 * Attempts to cancel the most recently posted event. It is safe to call
dkato 0:f782d9c66c49 2157 * cancel after an event has already been dispatched.
dkato 0:f782d9c66c49 2158 *
dkato 0:f782d9c66c49 2159 * The cancel function is irq safe.
dkato 0:f782d9c66c49 2160 *
dkato 0:f782d9c66c49 2161 * If called while the event queue's dispatch loop is active, the cancel
dkato 0:f782d9c66c49 2162 * function does not garuntee that the event will not execute after it
dkato 0:f782d9c66c49 2163 * returns, as the event may have already begun executing.
dkato 0:f782d9c66c49 2164 */
dkato 0:f782d9c66c49 2165 void cancel() const {
dkato 0:f782d9c66c49 2166 if (_event) {
dkato 0:f782d9c66c49 2167 equeue_cancel(_event->equeue, _event->id);
dkato 0:f782d9c66c49 2168 }
dkato 0:f782d9c66c49 2169 }
dkato 0:f782d9c66c49 2170
dkato 0:f782d9c66c49 2171 private:
dkato 0:f782d9c66c49 2172 struct event {
dkato 0:f782d9c66c49 2173 unsigned ref;
dkato 0:f782d9c66c49 2174 equeue_t *equeue;
dkato 0:f782d9c66c49 2175 int id;
dkato 0:f782d9c66c49 2176
dkato 0:f782d9c66c49 2177 int delay;
dkato 0:f782d9c66c49 2178 int period;
dkato 0:f782d9c66c49 2179
dkato 0:f782d9c66c49 2180 int (*post)(struct event *, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4);
dkato 0:f782d9c66c49 2181 void (*dtor)(struct event *);
dkato 0:f782d9c66c49 2182
dkato 0:f782d9c66c49 2183 // F follows
dkato 0:f782d9c66c49 2184 } *_event;
dkato 0:f782d9c66c49 2185
dkato 0:f782d9c66c49 2186 // Event attributes
dkato 0:f782d9c66c49 2187 template <typename F>
dkato 0:f782d9c66c49 2188 static int event_post(struct event *e, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
dkato 0:f782d9c66c49 2189 typedef EventQueue::context50<F, A0, A1, A2, A3, A4> C;
dkato 0:f782d9c66c49 2190 void *p = equeue_alloc(e->equeue, sizeof(C));
dkato 0:f782d9c66c49 2191 if (!p) {
dkato 0:f782d9c66c49 2192 return 0;
dkato 0:f782d9c66c49 2193 }
dkato 0:f782d9c66c49 2194
dkato 0:f782d9c66c49 2195 new (p) C(*(F*)(e + 1), a0, a1, a2, a3, a4);
dkato 0:f782d9c66c49 2196 equeue_event_delay(p, e->delay);
dkato 0:f782d9c66c49 2197 equeue_event_period(p, e->period);
dkato 0:f782d9c66c49 2198 equeue_event_dtor(p, &EventQueue::function_dtor<C>);
dkato 0:f782d9c66c49 2199 return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
dkato 0:f782d9c66c49 2200 }
dkato 0:f782d9c66c49 2201
dkato 0:f782d9c66c49 2202 template <typename F>
dkato 0:f782d9c66c49 2203 static void event_dtor(struct event *e) {
dkato 0:f782d9c66c49 2204 ((F*)(e + 1))->~F();
dkato 0:f782d9c66c49 2205 }
dkato 0:f782d9c66c49 2206
dkato 0:f782d9c66c49 2207 public:
dkato 0:f782d9c66c49 2208 /** Create an event
dkato 0:f782d9c66c49 2209 * @see Event::Event
dkato 0:f782d9c66c49 2210 */
dkato 0:f782d9c66c49 2211 template <typename F, typename C0>
dkato 0:f782d9c66c49 2212 Event(EventQueue *q, F f, C0 c0) {
dkato 0:f782d9c66c49 2213 new (this) Event(q, EventQueue::context15<F, C0, A0, A1, A2, A3, A4>(f, c0));
dkato 0:f782d9c66c49 2214 }
dkato 0:f782d9c66c49 2215
dkato 0:f782d9c66c49 2216 /** Create an event
dkato 0:f782d9c66c49 2217 * @see Event::Event
dkato 0:f782d9c66c49 2218 */
dkato 0:f782d9c66c49 2219 template <typename F, typename C0, typename C1>
dkato 0:f782d9c66c49 2220 Event(EventQueue *q, F f, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2221 new (this) Event(q, EventQueue::context25<F, C0, C1, A0, A1, A2, A3, A4>(f, c0, c1));
dkato 0:f782d9c66c49 2222 }
dkato 0:f782d9c66c49 2223
dkato 0:f782d9c66c49 2224 /** Create an event
dkato 0:f782d9c66c49 2225 * @see Event::Event
dkato 0:f782d9c66c49 2226 */
dkato 0:f782d9c66c49 2227 template <typename F, typename C0, typename C1, typename C2>
dkato 0:f782d9c66c49 2228 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2229 new (this) Event(q, EventQueue::context35<F, C0, C1, C2, A0, A1, A2, A3, A4>(f, c0, c1, c2));
dkato 0:f782d9c66c49 2230 }
dkato 0:f782d9c66c49 2231
dkato 0:f782d9c66c49 2232 /** Create an event
dkato 0:f782d9c66c49 2233 * @see Event::Event
dkato 0:f782d9c66c49 2234 */
dkato 0:f782d9c66c49 2235 template <typename F, typename C0, typename C1, typename C2, typename C3>
dkato 0:f782d9c66c49 2236 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2237 new (this) Event(q, EventQueue::context45<F, C0, C1, C2, C3, A0, A1, A2, A3, A4>(f, c0, c1, c2, c3));
dkato 0:f782d9c66c49 2238 }
dkato 0:f782d9c66c49 2239
dkato 0:f782d9c66c49 2240 /** Create an event
dkato 0:f782d9c66c49 2241 * @see Event::Event
dkato 0:f782d9c66c49 2242 */
dkato 0:f782d9c66c49 2243 template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
dkato 0:f782d9c66c49 2244 Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2245 new (this) Event(q, EventQueue::context55<F, C0, C1, C2, C3, C4, A0, A1, A2, A3, A4>(f, c0, c1, c2, c3, c4));
dkato 0:f782d9c66c49 2246 }
dkato 0:f782d9c66c49 2247
dkato 0:f782d9c66c49 2248 /** Create an event
dkato 0:f782d9c66c49 2249 * @see Event::Event
dkato 0:f782d9c66c49 2250 */
dkato 0:f782d9c66c49 2251 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 2252 Event(EventQueue *q, T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4), B0 b0) {
dkato 0:f782d9c66c49 2253 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 2254 }
dkato 0:f782d9c66c49 2255
dkato 0:f782d9c66c49 2256 /** Create an event
dkato 0:f782d9c66c49 2257 * @see Event::Event
dkato 0:f782d9c66c49 2258 */
dkato 0:f782d9c66c49 2259 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 2260 Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) const, B0 b0) {
dkato 0:f782d9c66c49 2261 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 2262 }
dkato 0:f782d9c66c49 2263
dkato 0:f782d9c66c49 2264 /** Create an event
dkato 0:f782d9c66c49 2265 * @see Event::Event
dkato 0:f782d9c66c49 2266 */
dkato 0:f782d9c66c49 2267 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 2268 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) volatile, B0 b0) {
dkato 0:f782d9c66c49 2269 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 2270 }
dkato 0:f782d9c66c49 2271
dkato 0:f782d9c66c49 2272 /** Create an event
dkato 0:f782d9c66c49 2273 * @see Event::Event
dkato 0:f782d9c66c49 2274 */
dkato 0:f782d9c66c49 2275 template <typename T, typename R, typename B0>
dkato 0:f782d9c66c49 2276 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) const volatile, B0 b0) {
dkato 0:f782d9c66c49 2277 new (this) Event(q, mbed::callback(obj, method), b0);
dkato 0:f782d9c66c49 2278 }
dkato 0:f782d9c66c49 2279
dkato 0:f782d9c66c49 2280 /** Create an event
dkato 0:f782d9c66c49 2281 * @see Event::Event
dkato 0:f782d9c66c49 2282 */
dkato 0:f782d9c66c49 2283 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 2284 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4), B0 b0, B1 b1) {
dkato 0:f782d9c66c49 2285 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 2286 }
dkato 0:f782d9c66c49 2287
dkato 0:f782d9c66c49 2288 /** Create an event
dkato 0:f782d9c66c49 2289 * @see Event::Event
dkato 0:f782d9c66c49 2290 */
dkato 0:f782d9c66c49 2291 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 2292 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) const, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 2293 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 2294 }
dkato 0:f782d9c66c49 2295
dkato 0:f782d9c66c49 2296 /** Create an event
dkato 0:f782d9c66c49 2297 * @see Event::Event
dkato 0:f782d9c66c49 2298 */
dkato 0:f782d9c66c49 2299 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 2300 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) volatile, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 2301 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 2302 }
dkato 0:f782d9c66c49 2303
dkato 0:f782d9c66c49 2304 /** Create an event
dkato 0:f782d9c66c49 2305 * @see Event::Event
dkato 0:f782d9c66c49 2306 */
dkato 0:f782d9c66c49 2307 template <typename T, typename R, typename B0, typename B1>
dkato 0:f782d9c66c49 2308 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) const volatile, B0 b0, B1 b1) {
dkato 0:f782d9c66c49 2309 new (this) Event(q, mbed::callback(obj, method), b0, b1);
dkato 0:f782d9c66c49 2310 }
dkato 0:f782d9c66c49 2311
dkato 0:f782d9c66c49 2312 /** Create an event
dkato 0:f782d9c66c49 2313 * @see Event::Event
dkato 0:f782d9c66c49 2314 */
dkato 0:f782d9c66c49 2315 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 2316 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4), B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 2317 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 2318 }
dkato 0:f782d9c66c49 2319
dkato 0:f782d9c66c49 2320 /** Create an event
dkato 0:f782d9c66c49 2321 * @see Event::Event
dkato 0:f782d9c66c49 2322 */
dkato 0:f782d9c66c49 2323 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 2324 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) const, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 2325 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 2326 }
dkato 0:f782d9c66c49 2327
dkato 0:f782d9c66c49 2328 /** Create an event
dkato 0:f782d9c66c49 2329 * @see Event::Event
dkato 0:f782d9c66c49 2330 */
dkato 0:f782d9c66c49 2331 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 2332 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) volatile, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 2333 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 2334 }
dkato 0:f782d9c66c49 2335
dkato 0:f782d9c66c49 2336 /** Create an event
dkato 0:f782d9c66c49 2337 * @see Event::Event
dkato 0:f782d9c66c49 2338 */
dkato 0:f782d9c66c49 2339 template <typename T, typename R, typename B0, typename B1, typename B2>
dkato 0:f782d9c66c49 2340 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) const volatile, B0 b0, B1 b1, B2 b2) {
dkato 0:f782d9c66c49 2341 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
dkato 0:f782d9c66c49 2342 }
dkato 0:f782d9c66c49 2343
dkato 0:f782d9c66c49 2344 /** Create an event
dkato 0:f782d9c66c49 2345 * @see Event::Event
dkato 0:f782d9c66c49 2346 */
dkato 0:f782d9c66c49 2347 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 2348 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4), B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 2349 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 2350 }
dkato 0:f782d9c66c49 2351
dkato 0:f782d9c66c49 2352 /** Create an event
dkato 0:f782d9c66c49 2353 * @see Event::Event
dkato 0:f782d9c66c49 2354 */
dkato 0:f782d9c66c49 2355 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 2356 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4) const, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 2357 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 2358 }
dkato 0:f782d9c66c49 2359
dkato 0:f782d9c66c49 2360 /** Create an event
dkato 0:f782d9c66c49 2361 * @see Event::Event
dkato 0:f782d9c66c49 2362 */
dkato 0:f782d9c66c49 2363 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 2364 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 2365 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 2366 }
dkato 0:f782d9c66c49 2367
dkato 0:f782d9c66c49 2368 /** Create an event
dkato 0:f782d9c66c49 2369 * @see Event::Event
dkato 0:f782d9c66c49 2370 */
dkato 0:f782d9c66c49 2371 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
dkato 0:f782d9c66c49 2372 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4) const volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
dkato 0:f782d9c66c49 2373 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
dkato 0:f782d9c66c49 2374 }
dkato 0:f782d9c66c49 2375
dkato 0:f782d9c66c49 2376 /** Create an event
dkato 0:f782d9c66c49 2377 * @see Event::Event
dkato 0:f782d9c66c49 2378 */
dkato 0:f782d9c66c49 2379 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 2380 Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 2381 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 2382 }
dkato 0:f782d9c66c49 2383
dkato 0:f782d9c66c49 2384 /** Create an event
dkato 0:f782d9c66c49 2385 * @see Event::Event
dkato 0:f782d9c66c49 2386 */
dkato 0:f782d9c66c49 2387 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 2388 Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4) const, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 2389 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 2390 }
dkato 0:f782d9c66c49 2391
dkato 0:f782d9c66c49 2392 /** Create an event
dkato 0:f782d9c66c49 2393 * @see Event::Event
dkato 0:f782d9c66c49 2394 */
dkato 0:f782d9c66c49 2395 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 2396 Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4) volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 2397 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 2398 }
dkato 0:f782d9c66c49 2399
dkato 0:f782d9c66c49 2400 /** Create an event
dkato 0:f782d9c66c49 2401 * @see Event::Event
dkato 0:f782d9c66c49 2402 */
dkato 0:f782d9c66c49 2403 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
dkato 0:f782d9c66c49 2404 Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4) const volatile, B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
dkato 0:f782d9c66c49 2405 new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
dkato 0:f782d9c66c49 2406 }
dkato 0:f782d9c66c49 2407 };
dkato 0:f782d9c66c49 2408
dkato 0:f782d9c66c49 2409
dkato 0:f782d9c66c49 2410
dkato 0:f782d9c66c49 2411 // Convenience functions declared here to avoid cyclic
dkato 0:f782d9c66c49 2412 // dependency between Event and EventQueue
dkato 0:f782d9c66c49 2413 template <typename R>
dkato 0:f782d9c66c49 2414 Event<void()> EventQueue::event(R (*func)()) {
dkato 0:f782d9c66c49 2415 return Event<void()>(this, func);
dkato 0:f782d9c66c49 2416 }
dkato 0:f782d9c66c49 2417
dkato 0:f782d9c66c49 2418 template <typename T, typename R>
dkato 0:f782d9c66c49 2419 Event<void()> EventQueue::event(T *obj, R (T::*method)()) {
dkato 0:f782d9c66c49 2420 return Event<void()>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2421 }
dkato 0:f782d9c66c49 2422
dkato 0:f782d9c66c49 2423 template <typename T, typename R>
dkato 0:f782d9c66c49 2424 Event<void()> EventQueue::event(const T *obj, R (T::*method)() const) {
dkato 0:f782d9c66c49 2425 return Event<void()>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2426 }
dkato 0:f782d9c66c49 2427
dkato 0:f782d9c66c49 2428 template <typename T, typename R>
dkato 0:f782d9c66c49 2429 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)() volatile) {
dkato 0:f782d9c66c49 2430 return Event<void()>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2431 }
dkato 0:f782d9c66c49 2432
dkato 0:f782d9c66c49 2433 template <typename T, typename R>
dkato 0:f782d9c66c49 2434 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)() const volatile) {
dkato 0:f782d9c66c49 2435 return Event<void()>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2436 }
dkato 0:f782d9c66c49 2437
dkato 0:f782d9c66c49 2438 template <typename R>
dkato 0:f782d9c66c49 2439 Event<void()> EventQueue::event(mbed::Callback<R()> cb) {
dkato 0:f782d9c66c49 2440 return Event<void()>(this, cb);
dkato 0:f782d9c66c49 2441 }
dkato 0:f782d9c66c49 2442
dkato 0:f782d9c66c49 2443 template <typename R, typename B0, typename C0>
dkato 0:f782d9c66c49 2444 Event<void()> EventQueue::event(R (*func)(B0), C0 c0) {
dkato 0:f782d9c66c49 2445 return Event<void()>(this, func, c0);
dkato 0:f782d9c66c49 2446 }
dkato 0:f782d9c66c49 2447
dkato 0:f782d9c66c49 2448 template <typename T, typename R, typename B0, typename C0>
dkato 0:f782d9c66c49 2449 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0), C0 c0) {
dkato 0:f782d9c66c49 2450 return Event<void()>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2451 }
dkato 0:f782d9c66c49 2452
dkato 0:f782d9c66c49 2453 template <typename T, typename R, typename B0, typename C0>
dkato 0:f782d9c66c49 2454 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0) const, C0 c0) {
dkato 0:f782d9c66c49 2455 return Event<void()>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2456 }
dkato 0:f782d9c66c49 2457
dkato 0:f782d9c66c49 2458 template <typename T, typename R, typename B0, typename C0>
dkato 0:f782d9c66c49 2459 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0) volatile, C0 c0) {
dkato 0:f782d9c66c49 2460 return Event<void()>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2461 }
dkato 0:f782d9c66c49 2462
dkato 0:f782d9c66c49 2463 template <typename T, typename R, typename B0, typename C0>
dkato 0:f782d9c66c49 2464 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)(B0) const volatile, C0 c0) {
dkato 0:f782d9c66c49 2465 return Event<void()>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2466 }
dkato 0:f782d9c66c49 2467
dkato 0:f782d9c66c49 2468 template <typename R, typename B0, typename C0>
dkato 0:f782d9c66c49 2469 Event<void()> EventQueue::event(mbed::Callback<R(B0)> cb, C0 c0) {
dkato 0:f782d9c66c49 2470 return Event<void()>(this, cb, c0);
dkato 0:f782d9c66c49 2471 }
dkato 0:f782d9c66c49 2472
dkato 0:f782d9c66c49 2473 template <typename R, typename B0, typename B1, typename C0, typename C1>
dkato 0:f782d9c66c49 2474 Event<void()> EventQueue::event(R (*func)(B0, B1), C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2475 return Event<void()>(this, func, c0, c1);
dkato 0:f782d9c66c49 2476 }
dkato 0:f782d9c66c49 2477
dkato 0:f782d9c66c49 2478 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1>
dkato 0:f782d9c66c49 2479 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0, B1), C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2480 return Event<void()>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 2481 }
dkato 0:f782d9c66c49 2482
dkato 0:f782d9c66c49 2483 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1>
dkato 0:f782d9c66c49 2484 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0, B1) const, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2485 return Event<void()>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 2486 }
dkato 0:f782d9c66c49 2487
dkato 0:f782d9c66c49 2488 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1>
dkato 0:f782d9c66c49 2489 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1) volatile, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2490 return Event<void()>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 2491 }
dkato 0:f782d9c66c49 2492
dkato 0:f782d9c66c49 2493 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1>
dkato 0:f782d9c66c49 2494 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1) const volatile, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2495 return Event<void()>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 2496 }
dkato 0:f782d9c66c49 2497
dkato 0:f782d9c66c49 2498 template <typename R, typename B0, typename B1, typename C0, typename C1>
dkato 0:f782d9c66c49 2499 Event<void()> EventQueue::event(mbed::Callback<R(B0, B1)> cb, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2500 return Event<void()>(this, cb, c0, c1);
dkato 0:f782d9c66c49 2501 }
dkato 0:f782d9c66c49 2502
dkato 0:f782d9c66c49 2503 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
dkato 0:f782d9c66c49 2504 Event<void()> EventQueue::event(R (*func)(B0, B1, B2), C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2505 return Event<void()>(this, func, c0, c1, c2);
dkato 0:f782d9c66c49 2506 }
dkato 0:f782d9c66c49 2507
dkato 0:f782d9c66c49 2508 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
dkato 0:f782d9c66c49 2509 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2), C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2510 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 2511 }
dkato 0:f782d9c66c49 2512
dkato 0:f782d9c66c49 2513 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
dkato 0:f782d9c66c49 2514 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2) const, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2515 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 2516 }
dkato 0:f782d9c66c49 2517
dkato 0:f782d9c66c49 2518 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
dkato 0:f782d9c66c49 2519 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2) volatile, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2520 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 2521 }
dkato 0:f782d9c66c49 2522
dkato 0:f782d9c66c49 2523 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
dkato 0:f782d9c66c49 2524 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2) const volatile, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2525 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 2526 }
dkato 0:f782d9c66c49 2527
dkato 0:f782d9c66c49 2528 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
dkato 0:f782d9c66c49 2529 Event<void()> EventQueue::event(mbed::Callback<R(B0, B1, B2)> cb, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2530 return Event<void()>(this, cb, c0, c1, c2);
dkato 0:f782d9c66c49 2531 }
dkato 0:f782d9c66c49 2532
dkato 0:f782d9c66c49 2533 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
dkato 0:f782d9c66c49 2534 Event<void()> EventQueue::event(R (*func)(B0, B1, B2, B3), C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2535 return Event<void()>(this, func, c0, c1, c2, c3);
dkato 0:f782d9c66c49 2536 }
dkato 0:f782d9c66c49 2537
dkato 0:f782d9c66c49 2538 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
dkato 0:f782d9c66c49 2539 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3), C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2540 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 2541 }
dkato 0:f782d9c66c49 2542
dkato 0:f782d9c66c49 2543 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
dkato 0:f782d9c66c49 2544 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3) const, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2545 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 2546 }
dkato 0:f782d9c66c49 2547
dkato 0:f782d9c66c49 2548 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
dkato 0:f782d9c66c49 2549 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3) volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2550 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 2551 }
dkato 0:f782d9c66c49 2552
dkato 0:f782d9c66c49 2553 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
dkato 0:f782d9c66c49 2554 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3) const volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2555 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 2556 }
dkato 0:f782d9c66c49 2557
dkato 0:f782d9c66c49 2558 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
dkato 0:f782d9c66c49 2559 Event<void()> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2560 return Event<void()>(this, cb, c0, c1, c2, c3);
dkato 0:f782d9c66c49 2561 }
dkato 0:f782d9c66c49 2562
dkato 0:f782d9c66c49 2563 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
dkato 0:f782d9c66c49 2564 Event<void()> EventQueue::event(R (*func)(B0, B1, B2, B3, B4), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2565 return Event<void()>(this, func, c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2566 }
dkato 0:f782d9c66c49 2567
dkato 0:f782d9c66c49 2568 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
dkato 0:f782d9c66c49 2569 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, B4), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2570 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2571 }
dkato 0:f782d9c66c49 2572
dkato 0:f782d9c66c49 2573 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
dkato 0:f782d9c66c49 2574 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, B4) const, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2575 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2576 }
dkato 0:f782d9c66c49 2577
dkato 0:f782d9c66c49 2578 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
dkato 0:f782d9c66c49 2579 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4) volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2580 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2581 }
dkato 0:f782d9c66c49 2582
dkato 0:f782d9c66c49 2583 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
dkato 0:f782d9c66c49 2584 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4) const volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2585 return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2586 }
dkato 0:f782d9c66c49 2587
dkato 0:f782d9c66c49 2588 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
dkato 0:f782d9c66c49 2589 Event<void()> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, B4)> cb, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2590 return Event<void()>(this, cb, c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2591 }
dkato 0:f782d9c66c49 2592
dkato 0:f782d9c66c49 2593 template <typename R, typename A0>
dkato 0:f782d9c66c49 2594 Event<void(A0)> EventQueue::event(R (*func)(A0)) {
dkato 0:f782d9c66c49 2595 return Event<void(A0)>(this, func);
dkato 0:f782d9c66c49 2596 }
dkato 0:f782d9c66c49 2597
dkato 0:f782d9c66c49 2598 template <typename T, typename R, typename A0>
dkato 0:f782d9c66c49 2599 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(A0)) {
dkato 0:f782d9c66c49 2600 return Event<void(A0)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2601 }
dkato 0:f782d9c66c49 2602
dkato 0:f782d9c66c49 2603 template <typename T, typename R, typename A0>
dkato 0:f782d9c66c49 2604 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(A0) const) {
dkato 0:f782d9c66c49 2605 return Event<void(A0)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2606 }
dkato 0:f782d9c66c49 2607
dkato 0:f782d9c66c49 2608 template <typename T, typename R, typename A0>
dkato 0:f782d9c66c49 2609 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(A0) volatile) {
dkato 0:f782d9c66c49 2610 return Event<void(A0)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2611 }
dkato 0:f782d9c66c49 2612
dkato 0:f782d9c66c49 2613 template <typename T, typename R, typename A0>
dkato 0:f782d9c66c49 2614 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(A0) const volatile) {
dkato 0:f782d9c66c49 2615 return Event<void(A0)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2616 }
dkato 0:f782d9c66c49 2617
dkato 0:f782d9c66c49 2618 template <typename R, typename A0>
dkato 0:f782d9c66c49 2619 Event<void(A0)> EventQueue::event(mbed::Callback<R(A0)> cb) {
dkato 0:f782d9c66c49 2620 return Event<void(A0)>(this, cb);
dkato 0:f782d9c66c49 2621 }
dkato 0:f782d9c66c49 2622
dkato 0:f782d9c66c49 2623 template <typename R, typename B0, typename C0, typename A0>
dkato 0:f782d9c66c49 2624 Event<void(A0)> EventQueue::event(R (*func)(B0, A0), C0 c0) {
dkato 0:f782d9c66c49 2625 return Event<void(A0)>(this, func, c0);
dkato 0:f782d9c66c49 2626 }
dkato 0:f782d9c66c49 2627
dkato 0:f782d9c66c49 2628 template <typename T, typename R, typename B0, typename C0, typename A0>
dkato 0:f782d9c66c49 2629 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, A0), C0 c0) {
dkato 0:f782d9c66c49 2630 return Event<void(A0)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2631 }
dkato 0:f782d9c66c49 2632
dkato 0:f782d9c66c49 2633 template <typename T, typename R, typename B0, typename C0, typename A0>
dkato 0:f782d9c66c49 2634 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(B0, A0) const, C0 c0) {
dkato 0:f782d9c66c49 2635 return Event<void(A0)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2636 }
dkato 0:f782d9c66c49 2637
dkato 0:f782d9c66c49 2638 template <typename T, typename R, typename B0, typename C0, typename A0>
dkato 0:f782d9c66c49 2639 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0) volatile, C0 c0) {
dkato 0:f782d9c66c49 2640 return Event<void(A0)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2641 }
dkato 0:f782d9c66c49 2642
dkato 0:f782d9c66c49 2643 template <typename T, typename R, typename B0, typename C0, typename A0>
dkato 0:f782d9c66c49 2644 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0) const volatile, C0 c0) {
dkato 0:f782d9c66c49 2645 return Event<void(A0)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2646 }
dkato 0:f782d9c66c49 2647
dkato 0:f782d9c66c49 2648 template <typename R, typename B0, typename C0, typename A0>
dkato 0:f782d9c66c49 2649 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, A0)> cb, C0 c0) {
dkato 0:f782d9c66c49 2650 return Event<void(A0)>(this, cb, c0);
dkato 0:f782d9c66c49 2651 }
dkato 0:f782d9c66c49 2652
dkato 0:f782d9c66c49 2653 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
dkato 0:f782d9c66c49 2654 Event<void(A0)> EventQueue::event(R (*func)(B0, B1, A0), C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2655 return Event<void(A0)>(this, func, c0, c1);
dkato 0:f782d9c66c49 2656 }
dkato 0:f782d9c66c49 2657
dkato 0:f782d9c66c49 2658 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
dkato 0:f782d9c66c49 2659 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0), C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2660 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 2661 }
dkato 0:f782d9c66c49 2662
dkato 0:f782d9c66c49 2663 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
dkato 0:f782d9c66c49 2664 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, A0) const, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2665 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 2666 }
dkato 0:f782d9c66c49 2667
dkato 0:f782d9c66c49 2668 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
dkato 0:f782d9c66c49 2669 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, A0) volatile, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2670 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 2671 }
dkato 0:f782d9c66c49 2672
dkato 0:f782d9c66c49 2673 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
dkato 0:f782d9c66c49 2674 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, A0) const volatile, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2675 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 2676 }
dkato 0:f782d9c66c49 2677
dkato 0:f782d9c66c49 2678 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
dkato 0:f782d9c66c49 2679 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, B1, A0)> cb, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2680 return Event<void(A0)>(this, cb, c0, c1);
dkato 0:f782d9c66c49 2681 }
dkato 0:f782d9c66c49 2682
dkato 0:f782d9c66c49 2683 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
dkato 0:f782d9c66c49 2684 Event<void(A0)> EventQueue::event(R (*func)(B0, B1, B2, A0), C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2685 return Event<void(A0)>(this, func, c0, c1, c2);
dkato 0:f782d9c66c49 2686 }
dkato 0:f782d9c66c49 2687
dkato 0:f782d9c66c49 2688 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
dkato 0:f782d9c66c49 2689 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, A0), C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2690 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 2691 }
dkato 0:f782d9c66c49 2692
dkato 0:f782d9c66c49 2693 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
dkato 0:f782d9c66c49 2694 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, A0) const, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2695 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 2696 }
dkato 0:f782d9c66c49 2697
dkato 0:f782d9c66c49 2698 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
dkato 0:f782d9c66c49 2699 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, A0) volatile, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2700 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 2701 }
dkato 0:f782d9c66c49 2702
dkato 0:f782d9c66c49 2703 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
dkato 0:f782d9c66c49 2704 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, A0) const volatile, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2705 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 2706 }
dkato 0:f782d9c66c49 2707
dkato 0:f782d9c66c49 2708 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
dkato 0:f782d9c66c49 2709 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, B1, B2, A0)> cb, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2710 return Event<void(A0)>(this, cb, c0, c1, c2);
dkato 0:f782d9c66c49 2711 }
dkato 0:f782d9c66c49 2712
dkato 0:f782d9c66c49 2713 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
dkato 0:f782d9c66c49 2714 Event<void(A0)> EventQueue::event(R (*func)(B0, B1, B2, B3, A0), C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2715 return Event<void(A0)>(this, func, c0, c1, c2, c3);
dkato 0:f782d9c66c49 2716 }
dkato 0:f782d9c66c49 2717
dkato 0:f782d9c66c49 2718 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
dkato 0:f782d9c66c49 2719 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, A0), C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2720 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 2721 }
dkato 0:f782d9c66c49 2722
dkato 0:f782d9c66c49 2723 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
dkato 0:f782d9c66c49 2724 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, A0) const, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2725 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 2726 }
dkato 0:f782d9c66c49 2727
dkato 0:f782d9c66c49 2728 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
dkato 0:f782d9c66c49 2729 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0) volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2730 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 2731 }
dkato 0:f782d9c66c49 2732
dkato 0:f782d9c66c49 2733 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
dkato 0:f782d9c66c49 2734 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0) const volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2735 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 2736 }
dkato 0:f782d9c66c49 2737
dkato 0:f782d9c66c49 2738 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
dkato 0:f782d9c66c49 2739 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, A0)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2740 return Event<void(A0)>(this, cb, c0, c1, c2, c3);
dkato 0:f782d9c66c49 2741 }
dkato 0:f782d9c66c49 2742
dkato 0:f782d9c66c49 2743 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0>
dkato 0:f782d9c66c49 2744 Event<void(A0)> EventQueue::event(R (*func)(B0, B1, B2, B3, B4, A0), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2745 return Event<void(A0)>(this, func, c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2746 }
dkato 0:f782d9c66c49 2747
dkato 0:f782d9c66c49 2748 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0>
dkato 0:f782d9c66c49 2749 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2750 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2751 }
dkato 0:f782d9c66c49 2752
dkato 0:f782d9c66c49 2753 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0>
dkato 0:f782d9c66c49 2754 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0) const, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2755 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2756 }
dkato 0:f782d9c66c49 2757
dkato 0:f782d9c66c49 2758 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0>
dkato 0:f782d9c66c49 2759 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0) volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2760 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2761 }
dkato 0:f782d9c66c49 2762
dkato 0:f782d9c66c49 2763 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0>
dkato 0:f782d9c66c49 2764 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0) const volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2765 return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2766 }
dkato 0:f782d9c66c49 2767
dkato 0:f782d9c66c49 2768 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0>
dkato 0:f782d9c66c49 2769 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, B4, A0)> cb, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2770 return Event<void(A0)>(this, cb, c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2771 }
dkato 0:f782d9c66c49 2772
dkato 0:f782d9c66c49 2773 template <typename R, typename A0, typename A1>
dkato 0:f782d9c66c49 2774 Event<void(A0, A1)> EventQueue::event(R (*func)(A0, A1)) {
dkato 0:f782d9c66c49 2775 return Event<void(A0, A1)>(this, func);
dkato 0:f782d9c66c49 2776 }
dkato 0:f782d9c66c49 2777
dkato 0:f782d9c66c49 2778 template <typename T, typename R, typename A0, typename A1>
dkato 0:f782d9c66c49 2779 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(A0, A1)) {
dkato 0:f782d9c66c49 2780 return Event<void(A0, A1)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2781 }
dkato 0:f782d9c66c49 2782
dkato 0:f782d9c66c49 2783 template <typename T, typename R, typename A0, typename A1>
dkato 0:f782d9c66c49 2784 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(A0, A1) const) {
dkato 0:f782d9c66c49 2785 return Event<void(A0, A1)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2786 }
dkato 0:f782d9c66c49 2787
dkato 0:f782d9c66c49 2788 template <typename T, typename R, typename A0, typename A1>
dkato 0:f782d9c66c49 2789 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(A0, A1) volatile) {
dkato 0:f782d9c66c49 2790 return Event<void(A0, A1)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2791 }
dkato 0:f782d9c66c49 2792
dkato 0:f782d9c66c49 2793 template <typename T, typename R, typename A0, typename A1>
dkato 0:f782d9c66c49 2794 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(A0, A1) const volatile) {
dkato 0:f782d9c66c49 2795 return Event<void(A0, A1)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2796 }
dkato 0:f782d9c66c49 2797
dkato 0:f782d9c66c49 2798 template <typename R, typename A0, typename A1>
dkato 0:f782d9c66c49 2799 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(A0, A1)> cb) {
dkato 0:f782d9c66c49 2800 return Event<void(A0, A1)>(this, cb);
dkato 0:f782d9c66c49 2801 }
dkato 0:f782d9c66c49 2802
dkato 0:f782d9c66c49 2803 template <typename R, typename B0, typename C0, typename A0, typename A1>
dkato 0:f782d9c66c49 2804 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, A0, A1), C0 c0) {
dkato 0:f782d9c66c49 2805 return Event<void(A0, A1)>(this, func, c0);
dkato 0:f782d9c66c49 2806 }
dkato 0:f782d9c66c49 2807
dkato 0:f782d9c66c49 2808 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1>
dkato 0:f782d9c66c49 2809 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(B0, A0, A1), C0 c0) {
dkato 0:f782d9c66c49 2810 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2811 }
dkato 0:f782d9c66c49 2812
dkato 0:f782d9c66c49 2813 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1>
dkato 0:f782d9c66c49 2814 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(B0, A0, A1) const, C0 c0) {
dkato 0:f782d9c66c49 2815 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2816 }
dkato 0:f782d9c66c49 2817
dkato 0:f782d9c66c49 2818 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1>
dkato 0:f782d9c66c49 2819 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0, A1) volatile, C0 c0) {
dkato 0:f782d9c66c49 2820 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2821 }
dkato 0:f782d9c66c49 2822
dkato 0:f782d9c66c49 2823 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1>
dkato 0:f782d9c66c49 2824 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0, A1) const volatile, C0 c0) {
dkato 0:f782d9c66c49 2825 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2826 }
dkato 0:f782d9c66c49 2827
dkato 0:f782d9c66c49 2828 template <typename R, typename B0, typename C0, typename A0, typename A1>
dkato 0:f782d9c66c49 2829 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, A0, A1)> cb, C0 c0) {
dkato 0:f782d9c66c49 2830 return Event<void(A0, A1)>(this, cb, c0);
dkato 0:f782d9c66c49 2831 }
dkato 0:f782d9c66c49 2832
dkato 0:f782d9c66c49 2833 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
dkato 0:f782d9c66c49 2834 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, B1, A0, A1), C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2835 return Event<void(A0, A1)>(this, func, c0, c1);
dkato 0:f782d9c66c49 2836 }
dkato 0:f782d9c66c49 2837
dkato 0:f782d9c66c49 2838 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
dkato 0:f782d9c66c49 2839 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0, A1), C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2840 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 2841 }
dkato 0:f782d9c66c49 2842
dkato 0:f782d9c66c49 2843 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
dkato 0:f782d9c66c49 2844 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, A0, A1) const, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2845 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 2846 }
dkato 0:f782d9c66c49 2847
dkato 0:f782d9c66c49 2848 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
dkato 0:f782d9c66c49 2849 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, A0, A1) volatile, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2850 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 2851 }
dkato 0:f782d9c66c49 2852
dkato 0:f782d9c66c49 2853 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
dkato 0:f782d9c66c49 2854 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, A0, A1) const volatile, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2855 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 2856 }
dkato 0:f782d9c66c49 2857
dkato 0:f782d9c66c49 2858 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
dkato 0:f782d9c66c49 2859 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, B1, A0, A1)> cb, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 2860 return Event<void(A0, A1)>(this, cb, c0, c1);
dkato 0:f782d9c66c49 2861 }
dkato 0:f782d9c66c49 2862
dkato 0:f782d9c66c49 2863 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
dkato 0:f782d9c66c49 2864 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, B1, B2, A0, A1), C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2865 return Event<void(A0, A1)>(this, func, c0, c1, c2);
dkato 0:f782d9c66c49 2866 }
dkato 0:f782d9c66c49 2867
dkato 0:f782d9c66c49 2868 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
dkato 0:f782d9c66c49 2869 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, A0, A1), C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2870 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 2871 }
dkato 0:f782d9c66c49 2872
dkato 0:f782d9c66c49 2873 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
dkato 0:f782d9c66c49 2874 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, A0, A1) const, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2875 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 2876 }
dkato 0:f782d9c66c49 2877
dkato 0:f782d9c66c49 2878 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
dkato 0:f782d9c66c49 2879 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1) volatile, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2880 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 2881 }
dkato 0:f782d9c66c49 2882
dkato 0:f782d9c66c49 2883 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
dkato 0:f782d9c66c49 2884 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1) const volatile, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2885 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 2886 }
dkato 0:f782d9c66c49 2887
dkato 0:f782d9c66c49 2888 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
dkato 0:f782d9c66c49 2889 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, B1, B2, A0, A1)> cb, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 2890 return Event<void(A0, A1)>(this, cb, c0, c1, c2);
dkato 0:f782d9c66c49 2891 }
dkato 0:f782d9c66c49 2892
dkato 0:f782d9c66c49 2893 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
dkato 0:f782d9c66c49 2894 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, B1, B2, B3, A0, A1), C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2895 return Event<void(A0, A1)>(this, func, c0, c1, c2, c3);
dkato 0:f782d9c66c49 2896 }
dkato 0:f782d9c66c49 2897
dkato 0:f782d9c66c49 2898 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
dkato 0:f782d9c66c49 2899 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1), C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2900 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 2901 }
dkato 0:f782d9c66c49 2902
dkato 0:f782d9c66c49 2903 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
dkato 0:f782d9c66c49 2904 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) const, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2905 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 2906 }
dkato 0:f782d9c66c49 2907
dkato 0:f782d9c66c49 2908 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
dkato 0:f782d9c66c49 2909 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2910 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 2911 }
dkato 0:f782d9c66c49 2912
dkato 0:f782d9c66c49 2913 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
dkato 0:f782d9c66c49 2914 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) const volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2915 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 2916 }
dkato 0:f782d9c66c49 2917
dkato 0:f782d9c66c49 2918 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
dkato 0:f782d9c66c49 2919 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, A0, A1)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 2920 return Event<void(A0, A1)>(this, cb, c0, c1, c2, c3);
dkato 0:f782d9c66c49 2921 }
dkato 0:f782d9c66c49 2922
dkato 0:f782d9c66c49 2923 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1>
dkato 0:f782d9c66c49 2924 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, B1, B2, B3, B4, A0, A1), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2925 return Event<void(A0, A1)>(this, func, c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2926 }
dkato 0:f782d9c66c49 2927
dkato 0:f782d9c66c49 2928 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1>
dkato 0:f782d9c66c49 2929 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2930 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2931 }
dkato 0:f782d9c66c49 2932
dkato 0:f782d9c66c49 2933 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1>
dkato 0:f782d9c66c49 2934 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1) const, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2935 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2936 }
dkato 0:f782d9c66c49 2937
dkato 0:f782d9c66c49 2938 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1>
dkato 0:f782d9c66c49 2939 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1) volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2940 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2941 }
dkato 0:f782d9c66c49 2942
dkato 0:f782d9c66c49 2943 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1>
dkato 0:f782d9c66c49 2944 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1) const volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2945 return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2946 }
dkato 0:f782d9c66c49 2947
dkato 0:f782d9c66c49 2948 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1>
dkato 0:f782d9c66c49 2949 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, B4, A0, A1)> cb, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 2950 return Event<void(A0, A1)>(this, cb, c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 2951 }
dkato 0:f782d9c66c49 2952
dkato 0:f782d9c66c49 2953 template <typename R, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 2954 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(A0, A1, A2)) {
dkato 0:f782d9c66c49 2955 return Event<void(A0, A1, A2)>(this, func);
dkato 0:f782d9c66c49 2956 }
dkato 0:f782d9c66c49 2957
dkato 0:f782d9c66c49 2958 template <typename T, typename R, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 2959 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(A0, A1, A2)) {
dkato 0:f782d9c66c49 2960 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2961 }
dkato 0:f782d9c66c49 2962
dkato 0:f782d9c66c49 2963 template <typename T, typename R, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 2964 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(A0, A1, A2) const) {
dkato 0:f782d9c66c49 2965 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2966 }
dkato 0:f782d9c66c49 2967
dkato 0:f782d9c66c49 2968 template <typename T, typename R, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 2969 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(A0, A1, A2) volatile) {
dkato 0:f782d9c66c49 2970 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2971 }
dkato 0:f782d9c66c49 2972
dkato 0:f782d9c66c49 2973 template <typename T, typename R, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 2974 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(A0, A1, A2) const volatile) {
dkato 0:f782d9c66c49 2975 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 2976 }
dkato 0:f782d9c66c49 2977
dkato 0:f782d9c66c49 2978 template <typename R, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 2979 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(A0, A1, A2)> cb) {
dkato 0:f782d9c66c49 2980 return Event<void(A0, A1, A2)>(this, cb);
dkato 0:f782d9c66c49 2981 }
dkato 0:f782d9c66c49 2982
dkato 0:f782d9c66c49 2983 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 2984 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, A0, A1, A2), C0 c0) {
dkato 0:f782d9c66c49 2985 return Event<void(A0, A1, A2)>(this, func, c0);
dkato 0:f782d9c66c49 2986 }
dkato 0:f782d9c66c49 2987
dkato 0:f782d9c66c49 2988 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 2989 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(B0, A0, A1, A2), C0 c0) {
dkato 0:f782d9c66c49 2990 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2991 }
dkato 0:f782d9c66c49 2992
dkato 0:f782d9c66c49 2993 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 2994 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(B0, A0, A1, A2) const, C0 c0) {
dkato 0:f782d9c66c49 2995 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 2996 }
dkato 0:f782d9c66c49 2997
dkato 0:f782d9c66c49 2998 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 2999 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0, A1, A2) volatile, C0 c0) {
dkato 0:f782d9c66c49 3000 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 3001 }
dkato 0:f782d9c66c49 3002
dkato 0:f782d9c66c49 3003 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3004 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0, A1, A2) const volatile, C0 c0) {
dkato 0:f782d9c66c49 3005 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 3006 }
dkato 0:f782d9c66c49 3007
dkato 0:f782d9c66c49 3008 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3009 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(B0, A0, A1, A2)> cb, C0 c0) {
dkato 0:f782d9c66c49 3010 return Event<void(A0, A1, A2)>(this, cb, c0);
dkato 0:f782d9c66c49 3011 }
dkato 0:f782d9c66c49 3012
dkato 0:f782d9c66c49 3013 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3014 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, B1, A0, A1, A2), C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3015 return Event<void(A0, A1, A2)>(this, func, c0, c1);
dkato 0:f782d9c66c49 3016 }
dkato 0:f782d9c66c49 3017
dkato 0:f782d9c66c49 3018 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3019 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0, A1, A2), C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3020 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 3021 }
dkato 0:f782d9c66c49 3022
dkato 0:f782d9c66c49 3023 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3024 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, A0, A1, A2) const, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3025 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 3026 }
dkato 0:f782d9c66c49 3027
dkato 0:f782d9c66c49 3028 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3029 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2) volatile, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3030 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 3031 }
dkato 0:f782d9c66c49 3032
dkato 0:f782d9c66c49 3033 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3034 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2) const volatile, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3035 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 3036 }
dkato 0:f782d9c66c49 3037
dkato 0:f782d9c66c49 3038 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3039 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(B0, B1, A0, A1, A2)> cb, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3040 return Event<void(A0, A1, A2)>(this, cb, c0, c1);
dkato 0:f782d9c66c49 3041 }
dkato 0:f782d9c66c49 3042
dkato 0:f782d9c66c49 3043 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3044 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, B1, B2, A0, A1, A2), C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3045 return Event<void(A0, A1, A2)>(this, func, c0, c1, c2);
dkato 0:f782d9c66c49 3046 }
dkato 0:f782d9c66c49 3047
dkato 0:f782d9c66c49 3048 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3049 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2), C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3050 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 3051 }
dkato 0:f782d9c66c49 3052
dkato 0:f782d9c66c49 3053 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3054 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) const, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3055 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 3056 }
dkato 0:f782d9c66c49 3057
dkato 0:f782d9c66c49 3058 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3059 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) volatile, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3060 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 3061 }
dkato 0:f782d9c66c49 3062
dkato 0:f782d9c66c49 3063 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3064 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) const volatile, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3065 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 3066 }
dkato 0:f782d9c66c49 3067
dkato 0:f782d9c66c49 3068 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3069 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(B0, B1, B2, A0, A1, A2)> cb, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3070 return Event<void(A0, A1, A2)>(this, cb, c0, c1, c2);
dkato 0:f782d9c66c49 3071 }
dkato 0:f782d9c66c49 3072
dkato 0:f782d9c66c49 3073 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3074 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, B1, B2, B3, A0, A1, A2), C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3075 return Event<void(A0, A1, A2)>(this, func, c0, c1, c2, c3);
dkato 0:f782d9c66c49 3076 }
dkato 0:f782d9c66c49 3077
dkato 0:f782d9c66c49 3078 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3079 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2), C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3080 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 3081 }
dkato 0:f782d9c66c49 3082
dkato 0:f782d9c66c49 3083 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3084 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2) const, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3085 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 3086 }
dkato 0:f782d9c66c49 3087
dkato 0:f782d9c66c49 3088 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3089 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2) volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3090 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 3091 }
dkato 0:f782d9c66c49 3092
dkato 0:f782d9c66c49 3093 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3094 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2) const volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3095 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 3096 }
dkato 0:f782d9c66c49 3097
dkato 0:f782d9c66c49 3098 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3099 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, A0, A1, A2)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3100 return Event<void(A0, A1, A2)>(this, cb, c0, c1, c2, c3);
dkato 0:f782d9c66c49 3101 }
dkato 0:f782d9c66c49 3102
dkato 0:f782d9c66c49 3103 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3104 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, B1, B2, B3, B4, A0, A1, A2), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3105 return Event<void(A0, A1, A2)>(this, func, c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3106 }
dkato 0:f782d9c66c49 3107
dkato 0:f782d9c66c49 3108 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3109 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3110 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3111 }
dkato 0:f782d9c66c49 3112
dkato 0:f782d9c66c49 3113 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3114 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2) const, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3115 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3116 }
dkato 0:f782d9c66c49 3117
dkato 0:f782d9c66c49 3118 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3119 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2) volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3120 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3121 }
dkato 0:f782d9c66c49 3122
dkato 0:f782d9c66c49 3123 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3124 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2) const volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3125 return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3126 }
dkato 0:f782d9c66c49 3127
dkato 0:f782d9c66c49 3128 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2>
dkato 0:f782d9c66c49 3129 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, B4, A0, A1, A2)> cb, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3130 return Event<void(A0, A1, A2)>(this, cb, c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3131 }
dkato 0:f782d9c66c49 3132
dkato 0:f782d9c66c49 3133 template <typename R, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3134 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(A0, A1, A2, A3)) {
dkato 0:f782d9c66c49 3135 return Event<void(A0, A1, A2, A3)>(this, func);
dkato 0:f782d9c66c49 3136 }
dkato 0:f782d9c66c49 3137
dkato 0:f782d9c66c49 3138 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3139 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(A0, A1, A2, A3)) {
dkato 0:f782d9c66c49 3140 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 3141 }
dkato 0:f782d9c66c49 3142
dkato 0:f782d9c66c49 3143 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3144 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(A0, A1, A2, A3) const) {
dkato 0:f782d9c66c49 3145 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 3146 }
dkato 0:f782d9c66c49 3147
dkato 0:f782d9c66c49 3148 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3149 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(A0, A1, A2, A3) volatile) {
dkato 0:f782d9c66c49 3150 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 3151 }
dkato 0:f782d9c66c49 3152
dkato 0:f782d9c66c49 3153 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3154 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(A0, A1, A2, A3) const volatile) {
dkato 0:f782d9c66c49 3155 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 3156 }
dkato 0:f782d9c66c49 3157
dkato 0:f782d9c66c49 3158 template <typename R, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3159 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(A0, A1, A2, A3)> cb) {
dkato 0:f782d9c66c49 3160 return Event<void(A0, A1, A2, A3)>(this, cb);
dkato 0:f782d9c66c49 3161 }
dkato 0:f782d9c66c49 3162
dkato 0:f782d9c66c49 3163 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3164 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(B0, A0, A1, A2, A3), C0 c0) {
dkato 0:f782d9c66c49 3165 return Event<void(A0, A1, A2, A3)>(this, func, c0);
dkato 0:f782d9c66c49 3166 }
dkato 0:f782d9c66c49 3167
dkato 0:f782d9c66c49 3168 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3169 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(B0, A0, A1, A2, A3), C0 c0) {
dkato 0:f782d9c66c49 3170 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 3171 }
dkato 0:f782d9c66c49 3172
dkato 0:f782d9c66c49 3173 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3174 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(B0, A0, A1, A2, A3) const, C0 c0) {
dkato 0:f782d9c66c49 3175 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 3176 }
dkato 0:f782d9c66c49 3177
dkato 0:f782d9c66c49 3178 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3179 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3) volatile, C0 c0) {
dkato 0:f782d9c66c49 3180 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 3181 }
dkato 0:f782d9c66c49 3182
dkato 0:f782d9c66c49 3183 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3184 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3) const volatile, C0 c0) {
dkato 0:f782d9c66c49 3185 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 3186 }
dkato 0:f782d9c66c49 3187
dkato 0:f782d9c66c49 3188 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3189 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(B0, A0, A1, A2, A3)> cb, C0 c0) {
dkato 0:f782d9c66c49 3190 return Event<void(A0, A1, A2, A3)>(this, cb, c0);
dkato 0:f782d9c66c49 3191 }
dkato 0:f782d9c66c49 3192
dkato 0:f782d9c66c49 3193 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3194 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(B0, B1, A0, A1, A2, A3), C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3195 return Event<void(A0, A1, A2, A3)>(this, func, c0, c1);
dkato 0:f782d9c66c49 3196 }
dkato 0:f782d9c66c49 3197
dkato 0:f782d9c66c49 3198 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3199 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3), C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3200 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 3201 }
dkato 0:f782d9c66c49 3202
dkato 0:f782d9c66c49 3203 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3204 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) const, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3205 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 3206 }
dkato 0:f782d9c66c49 3207
dkato 0:f782d9c66c49 3208 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3209 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) volatile, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3210 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 3211 }
dkato 0:f782d9c66c49 3212
dkato 0:f782d9c66c49 3213 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3214 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) const volatile, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3215 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 3216 }
dkato 0:f782d9c66c49 3217
dkato 0:f782d9c66c49 3218 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3219 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(B0, B1, A0, A1, A2, A3)> cb, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3220 return Event<void(A0, A1, A2, A3)>(this, cb, c0, c1);
dkato 0:f782d9c66c49 3221 }
dkato 0:f782d9c66c49 3222
dkato 0:f782d9c66c49 3223 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3224 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(B0, B1, B2, A0, A1, A2, A3), C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3225 return Event<void(A0, A1, A2, A3)>(this, func, c0, c1, c2);
dkato 0:f782d9c66c49 3226 }
dkato 0:f782d9c66c49 3227
dkato 0:f782d9c66c49 3228 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3229 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3), C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3230 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 3231 }
dkato 0:f782d9c66c49 3232
dkato 0:f782d9c66c49 3233 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3234 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) const, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3235 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 3236 }
dkato 0:f782d9c66c49 3237
dkato 0:f782d9c66c49 3238 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3239 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) volatile, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3240 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 3241 }
dkato 0:f782d9c66c49 3242
dkato 0:f782d9c66c49 3243 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3244 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) const volatile, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3245 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 3246 }
dkato 0:f782d9c66c49 3247
dkato 0:f782d9c66c49 3248 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3249 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(B0, B1, B2, A0, A1, A2, A3)> cb, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3250 return Event<void(A0, A1, A2, A3)>(this, cb, c0, c1, c2);
dkato 0:f782d9c66c49 3251 }
dkato 0:f782d9c66c49 3252
dkato 0:f782d9c66c49 3253 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3254 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(B0, B1, B2, B3, A0, A1, A2, A3), C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3255 return Event<void(A0, A1, A2, A3)>(this, func, c0, c1, c2, c3);
dkato 0:f782d9c66c49 3256 }
dkato 0:f782d9c66c49 3257
dkato 0:f782d9c66c49 3258 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3259 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3), C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3260 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 3261 }
dkato 0:f782d9c66c49 3262
dkato 0:f782d9c66c49 3263 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3264 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3) const, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3265 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 3266 }
dkato 0:f782d9c66c49 3267
dkato 0:f782d9c66c49 3268 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3269 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3) volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3270 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 3271 }
dkato 0:f782d9c66c49 3272
dkato 0:f782d9c66c49 3273 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3274 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3) const volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3275 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 3276 }
dkato 0:f782d9c66c49 3277
dkato 0:f782d9c66c49 3278 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3279 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, A0, A1, A2, A3)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3280 return Event<void(A0, A1, A2, A3)>(this, cb, c0, c1, c2, c3);
dkato 0:f782d9c66c49 3281 }
dkato 0:f782d9c66c49 3282
dkato 0:f782d9c66c49 3283 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3284 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(B0, B1, B2, B3, B4, A0, A1, A2, A3), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3285 return Event<void(A0, A1, A2, A3)>(this, func, c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3286 }
dkato 0:f782d9c66c49 3287
dkato 0:f782d9c66c49 3288 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3289 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3290 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3291 }
dkato 0:f782d9c66c49 3292
dkato 0:f782d9c66c49 3293 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3294 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3) const, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3295 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3296 }
dkato 0:f782d9c66c49 3297
dkato 0:f782d9c66c49 3298 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3299 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3) volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3300 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3301 }
dkato 0:f782d9c66c49 3302
dkato 0:f782d9c66c49 3303 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3304 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3) const volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3305 return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3306 }
dkato 0:f782d9c66c49 3307
dkato 0:f782d9c66c49 3308 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3>
dkato 0:f782d9c66c49 3309 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, B4, A0, A1, A2, A3)> cb, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3310 return Event<void(A0, A1, A2, A3)>(this, cb, c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3311 }
dkato 0:f782d9c66c49 3312
dkato 0:f782d9c66c49 3313 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3314 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(A0, A1, A2, A3, A4)) {
dkato 0:f782d9c66c49 3315 return Event<void(A0, A1, A2, A3, A4)>(this, func);
dkato 0:f782d9c66c49 3316 }
dkato 0:f782d9c66c49 3317
dkato 0:f782d9c66c49 3318 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3319 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(A0, A1, A2, A3, A4)) {
dkato 0:f782d9c66c49 3320 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 3321 }
dkato 0:f782d9c66c49 3322
dkato 0:f782d9c66c49 3323 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3324 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(A0, A1, A2, A3, A4) const) {
dkato 0:f782d9c66c49 3325 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 3326 }
dkato 0:f782d9c66c49 3327
dkato 0:f782d9c66c49 3328 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3329 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(A0, A1, A2, A3, A4) volatile) {
dkato 0:f782d9c66c49 3330 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 3331 }
dkato 0:f782d9c66c49 3332
dkato 0:f782d9c66c49 3333 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3334 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const volatile T *obj, R (T::*method)(A0, A1, A2, A3, A4) const volatile) {
dkato 0:f782d9c66c49 3335 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method));
dkato 0:f782d9c66c49 3336 }
dkato 0:f782d9c66c49 3337
dkato 0:f782d9c66c49 3338 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3339 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(A0, A1, A2, A3, A4)> cb) {
dkato 0:f782d9c66c49 3340 return Event<void(A0, A1, A2, A3, A4)>(this, cb);
dkato 0:f782d9c66c49 3341 }
dkato 0:f782d9c66c49 3342
dkato 0:f782d9c66c49 3343 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3344 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(B0, A0, A1, A2, A3, A4), C0 c0) {
dkato 0:f782d9c66c49 3345 return Event<void(A0, A1, A2, A3, A4)>(this, func, c0);
dkato 0:f782d9c66c49 3346 }
dkato 0:f782d9c66c49 3347
dkato 0:f782d9c66c49 3348 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3349 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4), C0 c0) {
dkato 0:f782d9c66c49 3350 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 3351 }
dkato 0:f782d9c66c49 3352
dkato 0:f782d9c66c49 3353 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3354 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) const, C0 c0) {
dkato 0:f782d9c66c49 3355 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 3356 }
dkato 0:f782d9c66c49 3357
dkato 0:f782d9c66c49 3358 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3359 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) volatile, C0 c0) {
dkato 0:f782d9c66c49 3360 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 3361 }
dkato 0:f782d9c66c49 3362
dkato 0:f782d9c66c49 3363 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3364 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) const volatile, C0 c0) {
dkato 0:f782d9c66c49 3365 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0);
dkato 0:f782d9c66c49 3366 }
dkato 0:f782d9c66c49 3367
dkato 0:f782d9c66c49 3368 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3369 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(B0, A0, A1, A2, A3, A4)> cb, C0 c0) {
dkato 0:f782d9c66c49 3370 return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0);
dkato 0:f782d9c66c49 3371 }
dkato 0:f782d9c66c49 3372
dkato 0:f782d9c66c49 3373 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3374 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(B0, B1, A0, A1, A2, A3, A4), C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3375 return Event<void(A0, A1, A2, A3, A4)>(this, func, c0, c1);
dkato 0:f782d9c66c49 3376 }
dkato 0:f782d9c66c49 3377
dkato 0:f782d9c66c49 3378 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3379 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4), C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3380 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 3381 }
dkato 0:f782d9c66c49 3382
dkato 0:f782d9c66c49 3383 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3384 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) const, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3385 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 3386 }
dkato 0:f782d9c66c49 3387
dkato 0:f782d9c66c49 3388 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3389 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) volatile, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3390 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 3391 }
dkato 0:f782d9c66c49 3392
dkato 0:f782d9c66c49 3393 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3394 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) const volatile, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3395 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1);
dkato 0:f782d9c66c49 3396 }
dkato 0:f782d9c66c49 3397
dkato 0:f782d9c66c49 3398 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3399 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(B0, B1, A0, A1, A2, A3, A4)> cb, C0 c0, C1 c1) {
dkato 0:f782d9c66c49 3400 return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0, c1);
dkato 0:f782d9c66c49 3401 }
dkato 0:f782d9c66c49 3402
dkato 0:f782d9c66c49 3403 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3404 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(B0, B1, B2, A0, A1, A2, A3, A4), C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3405 return Event<void(A0, A1, A2, A3, A4)>(this, func, c0, c1, c2);
dkato 0:f782d9c66c49 3406 }
dkato 0:f782d9c66c49 3407
dkato 0:f782d9c66c49 3408 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3409 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4), C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3410 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 3411 }
dkato 0:f782d9c66c49 3412
dkato 0:f782d9c66c49 3413 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3414 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) const, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3415 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 3416 }
dkato 0:f782d9c66c49 3417
dkato 0:f782d9c66c49 3418 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3419 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) volatile, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3420 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 3421 }
dkato 0:f782d9c66c49 3422
dkato 0:f782d9c66c49 3423 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3424 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) const volatile, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3425 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2);
dkato 0:f782d9c66c49 3426 }
dkato 0:f782d9c66c49 3427
dkato 0:f782d9c66c49 3428 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3429 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(B0, B1, B2, A0, A1, A2, A3, A4)> cb, C0 c0, C1 c1, C2 c2) {
dkato 0:f782d9c66c49 3430 return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0, c1, c2);
dkato 0:f782d9c66c49 3431 }
dkato 0:f782d9c66c49 3432
dkato 0:f782d9c66c49 3433 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3434 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(B0, B1, B2, B3, A0, A1, A2, A3, A4), C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3435 return Event<void(A0, A1, A2, A3, A4)>(this, func, c0, c1, c2, c3);
dkato 0:f782d9c66c49 3436 }
dkato 0:f782d9c66c49 3437
dkato 0:f782d9c66c49 3438 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3439 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4), C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3440 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 3441 }
dkato 0:f782d9c66c49 3442
dkato 0:f782d9c66c49 3443 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3444 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4) const, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3445 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 3446 }
dkato 0:f782d9c66c49 3447
dkato 0:f782d9c66c49 3448 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3449 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4) volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3450 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 3451 }
dkato 0:f782d9c66c49 3452
dkato 0:f782d9c66c49 3453 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3454 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3, A4) const volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3455 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
dkato 0:f782d9c66c49 3456 }
dkato 0:f782d9c66c49 3457
dkato 0:f782d9c66c49 3458 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3459 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, A0, A1, A2, A3, A4)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
dkato 0:f782d9c66c49 3460 return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0, c1, c2, c3);
dkato 0:f782d9c66c49 3461 }
dkato 0:f782d9c66c49 3462
dkato 0:f782d9c66c49 3463 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3464 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3465 return Event<void(A0, A1, A2, A3, A4)>(this, func, c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3466 }
dkato 0:f782d9c66c49 3467
dkato 0:f782d9c66c49 3468 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3469 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3470 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3471 }
dkato 0:f782d9c66c49 3472
dkato 0:f782d9c66c49 3473 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3474 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4) const, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3475 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3476 }
dkato 0:f782d9c66c49 3477
dkato 0:f782d9c66c49 3478 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3479 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4) volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3480 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3481 }
dkato 0:f782d9c66c49 3482
dkato 0:f782d9c66c49 3483 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3484 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4) const volatile, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3485 return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3486 }
dkato 0:f782d9c66c49 3487
dkato 0:f782d9c66c49 3488 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4, typename A0, typename A1, typename A2, typename A3, typename A4>
dkato 0:f782d9c66c49 3489 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, B4, A0, A1, A2, A3, A4)> cb, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
dkato 0:f782d9c66c49 3490 return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0, c1, c2, c3, c4);
dkato 0:f782d9c66c49 3491 }
dkato 0:f782d9c66c49 3492
dkato 0:f782d9c66c49 3493 }
dkato 0:f782d9c66c49 3494
dkato 0:f782d9c66c49 3495 #endif
dkato 0:f782d9c66c49 3496
dkato 0:f782d9c66c49 3497 /** @}*/