Kev Mann / mbed-dev-OS5_10_4
Committer:
kevman
Date:
Wed Nov 28 15:10:15 2018 +0000
Revision:
0:38ceb79fef03
RTC modified

Who changed what in which revision?

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