Rtos API example

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Event.h Source File

Event.h

00001 /* events
00002  * Copyright (c) 2016 ARM Limited
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *     http://www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  */
00016 #ifndef EVENT_H
00017 #define EVENT_H
00018 
00019 #include "events/EventQueue.h"
00020 #include "platform/mbed_assert.h"
00021 
00022 namespace events {
00023 /** \addtogroup events */
00024 
00025 /** Event
00026  *
00027  *  Representation of an event for fine-grain dispatch control
00028  * @ingroup events
00029  */
00030 template <typename F>
00031 class Event;
00032 
00033 /** Event
00034  *
00035  *  Representation of an event for fine-grain dispatch control
00036  * @ingroup events
00037  */
00038 template <>
00039 class Event<void()> {
00040 public:
00041     /** Create an event
00042      *
00043      *  Constructs an event bound to the specified event queue. The specified
00044      *  callback acts as the target for the event and is executed in the
00045      *  context of the event queue's dispatch loop once posted.
00046      *
00047      *  @param q                Event queue to dispatch on
00048      *  @param f                Function to execute when the event is dispatched
00049      */
00050     template <typename F>
00051     Event(EventQueue *q, F f) {
00052         _event = static_cast<struct event *>(
00053                 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
00054 
00055         if (_event) {
00056             _event->equeue = &q->_equeue;
00057             _event->id = 0;
00058             _event->delay = 0;
00059             _event->period = -1;
00060 
00061             _event->post = &Event::event_post<F>;
00062             _event->dtor = &Event::event_dtor<F>;
00063 
00064             new (_event+1) F(f);
00065 
00066             _event->ref = 1;
00067         }
00068     }
00069 
00070     /** Copy constructor for events
00071      */
00072     Event(const Event &e) {
00073         _event = 0;
00074         if (e._event) {
00075             _event = e._event;
00076             _event->ref += 1;
00077         }
00078     }
00079 
00080     /** Assignment operator for events
00081      */
00082     Event &operator=(const Event &that) {
00083         if (this != &that) {
00084             this->~Event();
00085             new (this) Event(that);
00086         }
00087 
00088         return *this;
00089     }
00090 
00091     /** Destructor for events
00092      */
00093     ~Event() {
00094         if (_event) {
00095             _event->ref -= 1;
00096             if (_event->ref == 0) {
00097                 _event->dtor(_event);
00098                 equeue_dealloc(_event->equeue, _event);
00099             }
00100         }
00101     }
00102 
00103     /** Configure the delay of an event
00104      *
00105      *  @param delay    Millisecond delay before dispatching the event
00106      */
00107     void delay(int delay) {
00108         if (_event) {
00109             _event->delay = delay;
00110         }
00111     }
00112 
00113     /** Configure the period of an event
00114      *
00115      *  @param period   Millisecond period for repeatedly dispatching an event
00116      */
00117     void period(int period) {
00118         if (_event) {
00119             _event->period = period;
00120         }
00121     }
00122 
00123     /** Posts an event onto the underlying event queue
00124      *
00125      *  The event is posted to the underlying queue and is executed in the
00126      *  context of the event queue's dispatch loop.
00127      *
00128      *  The post function is irq safe and can act as a mechanism for moving
00129      *  events out of irq contexts.
00130      *
00131      *  @return         A unique id that represents the posted event and can
00132      *                  be passed to EventQueue::cancel, or an id of 0 if
00133      *                  there is not enough memory to allocate the event.
00134      */
00135     int post() const {
00136         if (!_event) {
00137             return 0;
00138         }
00139 
00140         _event->id = _event->post(_event);
00141         return _event->id;
00142     }
00143 
00144     /** Posts an event onto the underlying event queue, returning void
00145      *
00146      */
00147     void call() const {
00148         MBED_UNUSED int id = post();
00149         MBED_ASSERT(id);
00150     }
00151 
00152     /** Posts an event onto the underlying event queue, returning void
00153      *
00154      */
00155     void operator()() const {
00156         return call();
00157     }
00158 
00159     /** Static thunk for passing as C-style function
00160      *
00161      *  @param func     Event to call passed as a void pointer
00162      */
00163     static void thunk(void *func) {
00164         return static_cast<Event*>(func)->call();
00165     }
00166 
00167     /** Cancels the most recently posted event
00168      *
00169      *  Attempts to cancel the most recently posted event. It is safe to call
00170      *  cancel after an event has already been dispatched.
00171      *
00172      *  The cancel function is irq safe.
00173      *
00174      *  If called while the event queue's dispatch loop is active, the cancel
00175      *  function does not garuntee that the event will not execute after it
00176      *  returns, as the event may have already begun executing.
00177      */
00178     void cancel() const {
00179         if (_event) {
00180             equeue_cancel(_event->equeue, _event->id);
00181         }
00182     }
00183 
00184 private:
00185     struct event {
00186         unsigned ref;
00187         equeue_t *equeue;
00188         int id;
00189 
00190         int delay;
00191         int period;
00192 
00193         int (*post)(struct event *);
00194         void (*dtor)(struct event *);
00195 
00196         // F follows
00197     } *_event;
00198 
00199     // Event attributes
00200     template <typename F>
00201     static int event_post(struct event *e) {
00202         typedef EventQueue::context00<F> C;
00203         void *p = equeue_alloc(e->equeue, sizeof(C));
00204         if (!p) {
00205             return 0;
00206         }
00207 
00208         new (p) C(*(F*)(e + 1));
00209         equeue_event_delay(p, e->delay);
00210         equeue_event_period(p, e->period);
00211         equeue_event_dtor(p, &EventQueue::function_dtor<C>);
00212         return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
00213     }
00214 
00215     template <typename F>
00216     static void event_dtor(struct event *e) {
00217         ((F*)(e + 1))->~F();
00218     }
00219 
00220 public:
00221     /** Create an event
00222      *  @param q                Event queue to dispatch on
00223      *  @param f                Function to execute when the event is dispatched
00224      *  @param c0               Argument to bind to the callback, these arguments are
00225      *                          allocated on an irq-safe allocator from the event queue's
00226      *                          memory pool. Must be type-compatible with b0, the
00227      *                          arguments to the underlying callback.
00228      */
00229     template <typename F, typename C0>
00230     Event(EventQueue *q, F f, C0 c0) {
00231         new (this) Event(q, EventQueue::context10<F, C0>(f, c0));
00232     }
00233 
00234     /** Create an event
00235      *  @param q                Event queue to dispatch on
00236      *  @param f                Function to execute when the event is dispatched
00237      *  @param c0,c1            Arguments to bind to the callback, these arguments are
00238      *                          allocated on an irq-safe allocator from the event queue's
00239      *                          memory pool. Must be type-compatible with b0..b1, the
00240      *                          arguments to the underlying callback.
00241      */
00242     template <typename F, typename C0, typename C1>
00243     Event(EventQueue *q, F f, C0 c0, C1 c1) {
00244         new (this) Event(q, EventQueue::context20<F, C0, C1>(f, c0, c1));
00245     }
00246 
00247     /** Create an event
00248      *  @param q                Event queue to dispatch on
00249      *  @param f                Function to execute when the event is dispatched
00250      *  @param c0,c1,c2         Arguments to bind to the callback, these arguments are
00251      *                          allocated on an irq-safe allocator from the event queue's
00252      *                          memory pool. Must be type-compatible with b0..b2, the
00253      *                          arguments to the underlying callback.
00254      */
00255     template <typename F, typename C0, typename C1, typename C2>
00256     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
00257         new (this) Event(q, EventQueue::context30<F, C0, C1, C2>(f, c0, c1, c2));
00258     }
00259 
00260     /** Create an event
00261      *  @param q                Event queue to dispatch on
00262      *  @param f                Function to execute when the event is dispatched
00263      *  @param c0,c1,c2,c3      Arguments to bind to the callback, these arguments are
00264      *                          allocated on an irq-safe allocator from the event queue's
00265      *                          memory pool. Must be type-compatible with b0..b3, the
00266      *                          arguments to the underlying callback.
00267      */
00268     template <typename F, typename C0, typename C1, typename C2, typename C3>
00269     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
00270         new (this) Event(q, EventQueue::context40<F, C0, C1, C2, C3>(f, c0, c1, c2, c3));
00271     }
00272 
00273     /** Create an event
00274      *  @param q                Event queue to dispatch on
00275      *  @param f                Function to execute when the event is dispatched
00276      *  @param c0,c1,c2,c3,c4   Arguments to bind to the callback, these arguments are
00277      *                          allocated on an irq-safe allocator from the event queue's
00278      *                          memory pool. Must be type-compatible with b0..b4, the
00279      *                          arguments to the underlying callback.
00280      */
00281     template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
00282     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
00283         new (this) Event(q, EventQueue::context50<F, C0, C1, C2, C3, C4>(f, c0, c1, c2, c3, c4));
00284     }
00285 
00286     /** Create an event
00287      *  @see Event::Event
00288      */
00289     template <typename T, typename R, typename B0>
00290     Event(EventQueue *q, T *obj, R (T::*method)(B0), B0 b0) {
00291         new (this) Event(q, mbed::callback(obj, method), b0);
00292     }
00293 
00294     /** Create an event
00295      *  @see Event::Event
00296      */
00297     template <typename T, typename R, typename B0>
00298     Event(EventQueue *q, const T *obj, R (T::*method)(B0) const, B0 b0) {
00299         new (this) Event(q, mbed::callback(obj, method), b0);
00300     }
00301 
00302     /** Create an event
00303      *  @see Event::Event
00304      */
00305     template <typename T, typename R, typename B0>
00306     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0) volatile, B0 b0) {
00307         new (this) Event(q, mbed::callback(obj, method), b0);
00308     }
00309 
00310     /** Create an event
00311      *  @see Event::Event
00312      */
00313     template <typename T, typename R, typename B0>
00314     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0) const volatile, B0 b0) {
00315         new (this) Event(q, mbed::callback(obj, method), b0);
00316     }
00317 
00318     /** Create an event
00319      *  @see Event::Event
00320      */
00321     template <typename T, typename R, typename B0, typename B1>
00322     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1), B0 b0, B1 b1) {
00323         new (this) Event(q, mbed::callback(obj, method), b0, b1);
00324     }
00325 
00326     /** Create an event
00327      *  @see Event::Event
00328      */
00329     template <typename T, typename R, typename B0, typename B1>
00330     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1) const, B0 b0, B1 b1) {
00331         new (this) Event(q, mbed::callback(obj, method), b0, b1);
00332     }
00333 
00334     /** Create an event
00335      *  @see Event::Event
00336      */
00337     template <typename T, typename R, typename B0, typename B1>
00338     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1) volatile, B0 b0, B1 b1) {
00339         new (this) Event(q, mbed::callback(obj, method), b0, b1);
00340     }
00341 
00342     /** Create an event
00343      *  @see Event::Event
00344      */
00345     template <typename T, typename R, typename B0, typename B1>
00346     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1) const volatile, B0 b0, B1 b1) {
00347         new (this) Event(q, mbed::callback(obj, method), b0, b1);
00348     }
00349 
00350     /** Create an event
00351      *  @see Event::Event
00352      */
00353     template <typename T, typename R, typename B0, typename B1, typename B2>
00354     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2), B0 b0, B1 b1, B2 b2) {
00355         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
00356     }
00357 
00358     /** Create an event
00359      *  @see Event::Event
00360      */
00361     template <typename T, typename R, typename B0, typename B1, typename B2>
00362     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2) const, B0 b0, B1 b1, B2 b2) {
00363         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
00364     }
00365 
00366     /** Create an event
00367      *  @see Event::Event
00368      */
00369     template <typename T, typename R, typename B0, typename B1, typename B2>
00370     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2) volatile, B0 b0, B1 b1, B2 b2) {
00371         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
00372     }
00373 
00374     /** Create an event
00375      *  @see Event::Event
00376      */
00377     template <typename T, typename R, typename B0, typename B1, typename B2>
00378     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2) const volatile, B0 b0, B1 b1, B2 b2) {
00379         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
00380     }
00381 
00382     /** Create an event
00383      *  @see Event::Event
00384      */
00385     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
00386     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3), B0 b0, B1 b1, B2 b2, B3 b3) {
00387         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
00388     }
00389 
00390     /** Create an event
00391      *  @see Event::Event
00392      */
00393     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
00394     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3) const, B0 b0, B1 b1, B2 b2, B3 b3) {
00395         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
00396     }
00397 
00398     /** Create an event
00399      *  @see Event::Event
00400      */
00401     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
00402     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
00403         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
00404     }
00405 
00406     /** Create an event
00407      *  @see Event::Event
00408      */
00409     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
00410     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, B3) const volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
00411         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
00412     }
00413 
00414     /** Create an event
00415      *  @see Event::Event
00416      */
00417     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
00418     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
00419         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
00420     }
00421 
00422     /** Create an event
00423      *  @see Event::Event
00424      */
00425     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
00426     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) {
00427         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
00428     }
00429 
00430     /** Create an event
00431      *  @see Event::Event
00432      */
00433     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
00434     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) {
00435         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
00436     }
00437 
00438     /** Create an event
00439      *  @see Event::Event
00440      */
00441     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
00442     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) {
00443         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
00444     }
00445 };
00446 
00447 /** Event
00448  *
00449  *  Representation of an event for fine-grain dispatch control
00450  * @ingroup events
00451  */
00452 template <typename A0>
00453 class Event<void(A0)> {
00454 public:
00455     /** Create an event
00456      *
00457      *  Constructs an event bound to the specified event queue. The specified
00458      *  callback acts as the target for the event and is executed in the
00459      *  context of the event queue's dispatch loop once posted.
00460      *
00461      *  @param q        Event queue to dispatch on
00462      *  @param f        Function to execute when the event is dispatched
00463      */
00464     template <typename F>
00465     Event(EventQueue *q, F f) {
00466         _event = static_cast<struct event *>(
00467                 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
00468 
00469         if (_event) {
00470             _event->equeue = &q->_equeue;
00471             _event->id = 0;
00472             _event->delay = 0;
00473             _event->period = -1;
00474 
00475             _event->post = &Event::event_post<F>;
00476             _event->dtor = &Event::event_dtor<F>;
00477 
00478             new (_event+1) F(f);
00479 
00480             _event->ref = 1;
00481         }
00482     }
00483 
00484     /** Copy constructor for events
00485      */
00486     Event(const Event &e) {
00487         _event = 0;
00488         if (e._event) {
00489             _event = e._event;
00490             _event->ref += 1;
00491         }
00492     }
00493 
00494     /** Assignment operator for events
00495      */
00496     Event &operator=(const Event &that) {
00497         if (this != &that) {
00498             this->~Event();
00499             new (this) Event(that);
00500         }
00501 
00502         return *this;
00503     }
00504 
00505     /** Destructor for events
00506      */
00507     ~Event() {
00508         if (_event) {
00509             _event->ref -= 1;
00510             if (_event->ref == 0) {
00511                 _event->dtor(_event);
00512                 equeue_dealloc(_event->equeue, _event);
00513             }
00514         }
00515     }
00516 
00517     /** Configure the delay of an event
00518      *
00519      *  @param delay    Millisecond delay before dispatching the event
00520      */
00521     void delay(int delay) {
00522         if (_event) {
00523             _event->delay = delay;
00524         }
00525     }
00526 
00527     /** Configure the period of an event
00528      *
00529      *  @param period   Millisecond period for repeatedly dispatching an event
00530      */
00531     void period(int period) {
00532         if (_event) {
00533             _event->period = period;
00534         }
00535     }
00536 
00537     /** Posts an event onto the underlying event queue
00538      *
00539      *  The event is posted to the underlying queue and is executed in the
00540      *  context of the event queue's dispatch loop.
00541      *
00542      *  The post function is irq safe and can act as a mechanism for moving
00543      *  events out of irq contexts.
00544      *
00545      *  @param a0       Argument to pass to the event
00546      *  @return         A unique id that represents the posted event and can
00547      *                  be passed to EventQueue::cancel, or an id of 0 if
00548      *                  there is not enough memory to allocate the event.
00549      */
00550     int post(A0 a0) const {
00551         if (!_event) {
00552             return 0;
00553         }
00554 
00555         _event->id = _event->post(_event, a0);
00556         return _event->id;
00557     }
00558 
00559     /** Posts an event onto the underlying event queue, returning void
00560      *
00561      *  @param a0       Argument to pass to the event
00562      */
00563     void call(A0 a0) const {
00564         MBED_UNUSED int id = post(a0);
00565         MBED_ASSERT(id);
00566     }
00567 
00568     /** Posts an event onto the underlying event queue, returning void
00569      *
00570      *  @param a0      Argument to pass to the event
00571      */
00572     void operator()(A0 a0) const {
00573         return call(a0);
00574     }
00575 
00576     /** Static thunk for passing as C-style function
00577      *
00578      *  @param func     Event to call passed as a void pointer
00579      *  @param a0       Argument to pass to the event
00580      */
00581     static void thunk(void *func, A0 a0) {
00582         return static_cast<Event*>(func)->call(a0);
00583     }
00584 
00585     /** Cancels the most recently posted event
00586      *
00587      *  Attempts to cancel the most recently posted event. It is safe to call
00588      *  cancel after an event has already been dispatched.
00589      *
00590      *  The cancel function is irq safe.
00591      *
00592      *  If called while the event queue's dispatch loop is active, the cancel
00593      *  function does not garuntee that the event will not execute after it
00594      *  returns, as the event may have already begun executing.
00595      */
00596     void cancel() const {
00597         if (_event) {
00598             equeue_cancel(_event->equeue, _event->id);
00599         }
00600     }
00601 
00602 private:
00603     struct event {
00604         unsigned ref;
00605         equeue_t *equeue;
00606         int id;
00607 
00608         int delay;
00609         int period;
00610 
00611         int (*post)(struct event *, A0 a0);
00612         void (*dtor)(struct event *);
00613 
00614         // F follows
00615     } *_event;
00616 
00617     // Event attributes
00618     template <typename F>
00619     static int event_post(struct event *e, A0 a0) {
00620         typedef EventQueue::context10<F, A0> C;
00621         void *p = equeue_alloc(e->equeue, sizeof(C));
00622         if (!p) {
00623             return 0;
00624         }
00625 
00626         new (p) C(*(F*)(e + 1), a0);
00627         equeue_event_delay(p, e->delay);
00628         equeue_event_period(p, e->period);
00629         equeue_event_dtor(p, &EventQueue::function_dtor<C>);
00630         return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
00631     }
00632 
00633     template <typename F>
00634     static void event_dtor(struct event *e) {
00635         ((F*)(e + 1))->~F();
00636     }
00637 
00638 public:
00639     /** Create an event
00640      *  @param q                Event queue to dispatch on
00641      *  @param f                Function to execute when the event is dispatched
00642      *  @param c0               Argument to bind to the callback, these arguments are
00643      *                          allocated on an irq-safe allocator from the event queue's
00644      *                          memory pool. Must be type-compatible with b0, the
00645      *                          arguments to the underlying callback.
00646      */
00647     template <typename F, typename C0>
00648     Event(EventQueue *q, F f, C0 c0) {
00649         new (this) Event(q, EventQueue::context11<F, C0, A0>(f, c0));
00650     }
00651 
00652     /** Create an event
00653      *  @param q                Event queue to dispatch on
00654      *  @param f                Function to execute when the event is dispatched
00655      *  @param c0,c1            Arguments to bind to the callback, these arguments are
00656      *                          allocated on an irq-safe allocator from the event queue's
00657      *                          memory pool. Must be type-compatible with b0..b1, the
00658      *                          arguments to the underlying callback.
00659      */
00660     template <typename F, typename C0, typename C1>
00661     Event(EventQueue *q, F f, C0 c0, C1 c1) {
00662         new (this) Event(q, EventQueue::context21<F, C0, C1, A0>(f, c0, c1));
00663     }
00664 
00665     /** Create an event
00666      *  @param q                Event queue to dispatch on
00667      *  @param f                Function to execute when the event is dispatched
00668      *  @param c0,c1,c2         Arguments to bind to the callback, these arguments are
00669      *                          allocated on an irq-safe allocator from the event queue's
00670      *                          memory pool. Must be type-compatible with b0..b2, the
00671      *                          arguments to the underlying callback.
00672      */
00673     template <typename F, typename C0, typename C1, typename C2>
00674     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
00675         new (this) Event(q, EventQueue::context31<F, C0, C1, C2, A0>(f, c0, c1, c2));
00676     }
00677 
00678     /** Create an event
00679      *  @param q                Event queue to dispatch on
00680      *  @param f                Function to execute when the event is dispatched
00681      *  @param c0,c1,c2,c3      Arguments to bind to the callback, these arguments are
00682      *                          allocated on an irq-safe allocator from the event queue's
00683      *                          memory pool. Must be type-compatible with b0..b3, the
00684      *                          arguments to the underlying callback.
00685      */
00686     template <typename F, typename C0, typename C1, typename C2, typename C3>
00687     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
00688         new (this) Event(q, EventQueue::context41<F, C0, C1, C2, C3, A0>(f, c0, c1, c2, c3));
00689     }
00690 
00691     /** Create an event
00692      *  @param q                Event queue to dispatch on
00693      *  @param f                Function to execute when the event is dispatched
00694      *  @param c0,c1,c2,c3,c4   Arguments to bind to the callback, these arguments are
00695      *                          allocated on an irq-safe allocator from the event queue's
00696      *                          memory pool. Must be type-compatible with b0..b4, the
00697      *                          arguments to the underlying callback.
00698      */
00699     template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
00700     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
00701         new (this) Event(q, EventQueue::context51<F, C0, C1, C2, C3, C4, A0>(f, c0, c1, c2, c3, c4));
00702     }
00703 
00704     /** Create an event
00705      *  @see Event::Event
00706      */
00707     template <typename T, typename R, typename B0>
00708     Event(EventQueue *q, T *obj, R (T::*method)(B0, A0), B0 b0) {
00709         new (this) Event(q, mbed::callback(obj, method), b0);
00710     }
00711 
00712     /** Create an event
00713      *  @see Event::Event
00714      */
00715     template <typename T, typename R, typename B0>
00716     Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0) const, B0 b0) {
00717         new (this) Event(q, mbed::callback(obj, method), b0);
00718     }
00719 
00720     /** Create an event
00721      *  @see Event::Event
00722      */
00723     template <typename T, typename R, typename B0>
00724     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0) volatile, B0 b0) {
00725         new (this) Event(q, mbed::callback(obj, method), b0);
00726     }
00727 
00728     /** Create an event
00729      *  @see Event::Event
00730      */
00731     template <typename T, typename R, typename B0>
00732     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0) const volatile, B0 b0) {
00733         new (this) Event(q, mbed::callback(obj, method), b0);
00734     }
00735 
00736     /** Create an event
00737      *  @see Event::Event
00738      */
00739     template <typename T, typename R, typename B0, typename B1>
00740     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0), B0 b0, B1 b1) {
00741         new (this) Event(q, mbed::callback(obj, method), b0, b1);
00742     }
00743 
00744     /** Create an event
00745      *  @see Event::Event
00746      */
00747     template <typename T, typename R, typename B0, typename B1>
00748     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0) const, B0 b0, B1 b1) {
00749         new (this) Event(q, mbed::callback(obj, method), b0, b1);
00750     }
00751 
00752     /** Create an event
00753      *  @see Event::Event
00754      */
00755     template <typename T, typename R, typename B0, typename B1>
00756     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0) volatile, B0 b0, B1 b1) {
00757         new (this) Event(q, mbed::callback(obj, method), b0, b1);
00758     }
00759 
00760     /** Create an event
00761      *  @see Event::Event
00762      */
00763     template <typename T, typename R, typename B0, typename B1>
00764     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0) const volatile, B0 b0, B1 b1) {
00765         new (this) Event(q, mbed::callback(obj, method), b0, b1);
00766     }
00767 
00768     /** Create an event
00769      *  @see Event::Event
00770      */
00771     template <typename T, typename R, typename B0, typename B1, typename B2>
00772     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0), B0 b0, B1 b1, B2 b2) {
00773         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
00774     }
00775 
00776     /** Create an event
00777      *  @see Event::Event
00778      */
00779     template <typename T, typename R, typename B0, typename B1, typename B2>
00780     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0) const, B0 b0, B1 b1, B2 b2) {
00781         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
00782     }
00783 
00784     /** Create an event
00785      *  @see Event::Event
00786      */
00787     template <typename T, typename R, typename B0, typename B1, typename B2>
00788     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0) volatile, B0 b0, B1 b1, B2 b2) {
00789         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
00790     }
00791 
00792     /** Create an event
00793      *  @see Event::Event
00794      */
00795     template <typename T, typename R, typename B0, typename B1, typename B2>
00796     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, A0) const volatile, B0 b0, B1 b1, B2 b2) {
00797         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
00798     }
00799 
00800     /** Create an event
00801      *  @see Event::Event
00802      */
00803     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
00804     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0), B0 b0, B1 b1, B2 b2, B3 b3) {
00805         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
00806     }
00807 
00808     /** Create an event
00809      *  @see Event::Event
00810      */
00811     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
00812     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, A0) const, B0 b0, B1 b1, B2 b2, B3 b3) {
00813         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
00814     }
00815 
00816     /** Create an event
00817      *  @see Event::Event
00818      */
00819     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
00820     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
00821         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
00822     }
00823 
00824     /** Create an event
00825      *  @see Event::Event
00826      */
00827     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
00828     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) {
00829         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
00830     }
00831 
00832     /** Create an event
00833      *  @see Event::Event
00834      */
00835     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
00836     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, B4, A0), B0 b0, B1 b1, B2 b2, B3 b3, B4 b4) {
00837         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
00838     }
00839 
00840     /** Create an event
00841      *  @see Event::Event
00842      */
00843     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
00844     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) {
00845         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
00846     }
00847 
00848     /** Create an event
00849      *  @see Event::Event
00850      */
00851     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
00852     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) {
00853         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
00854     }
00855 
00856     /** Create an event
00857      *  @see Event::Event
00858      */
00859     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
00860     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) {
00861         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
00862     }
00863 };
00864 
00865 /** Event
00866  *
00867  *  Representation of an event for fine-grain dispatch control
00868  * @ingroup events
00869  */
00870 template <typename A0, typename A1>
00871 class Event<void(A0, A1)> {
00872 public:
00873     /** Create an event
00874      *
00875      *  Constructs an event bound to the specified event queue. The specified
00876      *  callback acts as the target for the event and is executed in the
00877      *  context of the event queue's dispatch loop once posted.
00878      *
00879      *  @param q        Event queue to dispatch on
00880      *  @param f        Function to execute when the event is dispatched
00881      */
00882     template <typename F>
00883     Event(EventQueue *q, F f) {
00884         _event = static_cast<struct event *>(
00885                 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
00886 
00887         if (_event) {
00888             _event->equeue = &q->_equeue;
00889             _event->id = 0;
00890             _event->delay = 0;
00891             _event->period = -1;
00892 
00893             _event->post = &Event::event_post<F>;
00894             _event->dtor = &Event::event_dtor<F>;
00895 
00896             new (_event+1) F(f);
00897 
00898             _event->ref = 1;
00899         }
00900     }
00901 
00902     /** Copy constructor for events
00903      */
00904     Event(const Event &e) {
00905         _event = 0;
00906         if (e._event) {
00907             _event = e._event;
00908             _event->ref += 1;
00909         }
00910     }
00911 
00912     /** Assignment operator for events
00913      */
00914     Event &operator=(const Event &that) {
00915         if (this != &that) {
00916             this->~Event();
00917             new (this) Event(that);
00918         }
00919 
00920         return *this;
00921     }
00922 
00923     /** Destructor for events
00924      */
00925     ~Event() {
00926         if (_event) {
00927             _event->ref -= 1;
00928             if (_event->ref == 0) {
00929                 _event->dtor(_event);
00930                 equeue_dealloc(_event->equeue, _event);
00931             }
00932         }
00933     }
00934 
00935     /** Configure the delay of an event
00936      *
00937      *  @param delay    Millisecond delay before dispatching the event
00938      */
00939     void delay(int delay) {
00940         if (_event) {
00941             _event->delay = delay;
00942         }
00943     }
00944 
00945     /** Configure the period of an event
00946      *
00947      *  @param period   Millisecond period for repeatedly dispatching an event
00948      */
00949     void period(int period) {
00950         if (_event) {
00951             _event->period = period;
00952         }
00953     }
00954 
00955     /** Posts an event onto the underlying event queue
00956      *
00957      *  The event is posted to the underlying queue and is executed in the
00958      *  context of the event queue's dispatch loop.
00959      *
00960      *  The post function is irq safe and can act as a mechanism for moving
00961      *  events out of irq contexts.
00962      *
00963      *  @param a0,a1    Arguments to pass to the event
00964      *  @return         A unique id that represents the posted event and can
00965      *                  be passed to EventQueue::cancel, or an id of 0 if
00966      *                  there is not enough memory to allocate the event.
00967      */
00968     int post(A0 a0, A1 a1) const {
00969         if (!_event) {
00970             return 0;
00971         }
00972 
00973         _event->id = _event->post(_event, a0, a1);
00974         return _event->id;
00975     }
00976 
00977     /** Posts an event onto the underlying event queue, returning void
00978      *
00979      *  @param a0,a1    Arguments to pass to the event
00980      */
00981     void call(A0 a0, A1 a1) const {
00982         MBED_UNUSED int id = post(a0, a1);
00983         MBED_ASSERT(id);
00984     }
00985 
00986     /** Posts an event onto the underlying event queue, returning void
00987      *
00988      *  @param a0,a1    Arguments to pass to the event
00989      */
00990     void operator()(A0 a0, A1 a1) const {
00991         return call(a0, a1);
00992     }
00993 
00994     /** Static thunk for passing as C-style function
00995      *
00996      *  @param func     Event to call passed as a void pointer
00997      *  @param a0,a1    Arguments to pass to the event
00998      */
00999     static void thunk(void *func, A0 a0, A1 a1) {
01000         return static_cast<Event*>(func)->call(a0, a1);
01001     }
01002 
01003     /** Cancels the most recently posted event
01004      *
01005      *  Attempts to cancel the most recently posted event. It is safe to call
01006      *  cancel after an event has already been dispatched.
01007      *
01008      *  The cancel function is irq safe.
01009      *
01010      *  If called while the event queue's dispatch loop is active, the cancel
01011      *  function does not garuntee that the event will not execute after it
01012      *  returns, as the event may have already begun executing.
01013      */
01014     void cancel() const {
01015         if (_event) {
01016             equeue_cancel(_event->equeue, _event->id);
01017         }
01018     }
01019 
01020 private:
01021     struct event {
01022         unsigned ref;
01023         equeue_t *equeue;
01024         int id;
01025 
01026         int delay;
01027         int period;
01028 
01029         int (*post)(struct event *, A0 a0, A1 a1);
01030         void (*dtor)(struct event *);
01031 
01032         // F follows
01033     } *_event;
01034 
01035     // Event attributes
01036     template <typename F>
01037     static int event_post(struct event *e, A0 a0, A1 a1) {
01038         typedef EventQueue::context20<F, A0, A1> C;
01039         void *p = equeue_alloc(e->equeue, sizeof(C));
01040         if (!p) {
01041             return 0;
01042         }
01043 
01044         new (p) C(*(F*)(e + 1), a0, a1);
01045         equeue_event_delay(p, e->delay);
01046         equeue_event_period(p, e->period);
01047         equeue_event_dtor(p, &EventQueue::function_dtor<C>);
01048         return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
01049     }
01050 
01051     template <typename F>
01052     static void event_dtor(struct event *e) {
01053         ((F*)(e + 1))->~F();
01054     }
01055 
01056 public:
01057     /** Create an event
01058      *  @param q                Event queue to dispatch on
01059      *  @param f                Function to execute when the event is dispatched
01060      *  @param c0               Argument to bind to the callback, these arguments are
01061      *                          allocated on an irq-safe allocator from the event queue's
01062      *                          memory pool. Must be type-compatible with b0, the
01063      *                          arguments to the underlying callback.
01064      */
01065     template <typename F, typename C0>
01066     Event(EventQueue *q, F f, C0 c0) {
01067         new (this) Event(q, EventQueue::context12<F, C0, A0, A1>(f, c0));
01068     }
01069 
01070     /** Create an event
01071      *  @param q                Event queue to dispatch on
01072      *  @param f                Function to execute when the event is dispatched
01073      *  @param c0,c1            Arguments to bind to the callback, these arguments are
01074      *                          allocated on an irq-safe allocator from the event queue's
01075      *                          memory pool. Must be type-compatible with b0..b1, the
01076      *                          arguments to the underlying callback.
01077      */
01078     template <typename F, typename C0, typename C1>
01079     Event(EventQueue *q, F f, C0 c0, C1 c1) {
01080         new (this) Event(q, EventQueue::context22<F, C0, C1, A0, A1>(f, c0, c1));
01081     }
01082 
01083     /** Create an event
01084      *  @param q                Event queue to dispatch on
01085      *  @param f                Function to execute when the event is dispatched
01086      *  @param c0,c1,c2         Arguments to bind to the callback, these arguments are
01087      *                          allocated on an irq-safe allocator from the event queue's
01088      *                          memory pool. Must be type-compatible with b0..b2, the
01089      *                          arguments to the underlying callback.
01090      */
01091     template <typename F, typename C0, typename C1, typename C2>
01092     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
01093         new (this) Event(q, EventQueue::context32<F, C0, C1, C2, A0, A1>(f, c0, c1, c2));
01094     }
01095 
01096     /** Create an event
01097      *  @param q                Event queue to dispatch on
01098      *  @param f                Function to execute when the event is dispatched
01099      *  @param c0,c1,c2,c3      Arguments to bind to the callback, these arguments are
01100      *                          allocated on an irq-safe allocator from the event queue's
01101      *                          memory pool. Must be type-compatible with b0..b3, the
01102      *                          arguments to the underlying callback.
01103      */
01104     template <typename F, typename C0, typename C1, typename C2, typename C3>
01105     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
01106         new (this) Event(q, EventQueue::context42<F, C0, C1, C2, C3, A0, A1>(f, c0, c1, c2, c3));
01107     }
01108 
01109     /** Create an event
01110      *  @param q                Event queue to dispatch on
01111      *  @param f                Function to execute when the event is dispatched
01112      *  @param c0,c1,c2,c3,c4   Arguments to bind to the callback, these arguments are
01113      *                          allocated on an irq-safe allocator from the event queue's
01114      *                          memory pool. Must be type-compatible with b0..b4, the
01115      *                          arguments to the underlying callback.
01116      */
01117     template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
01118     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
01119         new (this) Event(q, EventQueue::context52<F, C0, C1, C2, C3, C4, A0, A1>(f, c0, c1, c2, c3, c4));
01120     }
01121 
01122     /** Create an event
01123      *  @see Event::Event
01124      */
01125     template <typename T, typename R, typename B0>
01126     Event(EventQueue *q, T *obj, R (T::*method)(B0, A0, A1), B0 b0) {
01127         new (this) Event(q, mbed::callback(obj, method), b0);
01128     }
01129 
01130     /** Create an event
01131      *  @see Event::Event
01132      */
01133     template <typename T, typename R, typename B0>
01134     Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0, A1) const, B0 b0) {
01135         new (this) Event(q, mbed::callback(obj, method), b0);
01136     }
01137 
01138     /** Create an event
01139      *  @see Event::Event
01140      */
01141     template <typename T, typename R, typename B0>
01142     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0, A1) volatile, B0 b0) {
01143         new (this) Event(q, mbed::callback(obj, method), b0);
01144     }
01145 
01146     /** Create an event
01147      *  @see Event::Event
01148      */
01149     template <typename T, typename R, typename B0>
01150     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0, A1) const volatile, B0 b0) {
01151         new (this) Event(q, mbed::callback(obj, method), b0);
01152     }
01153 
01154     /** Create an event
01155      *  @see Event::Event
01156      */
01157     template <typename T, typename R, typename B0, typename B1>
01158     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0, A1), B0 b0, B1 b1) {
01159         new (this) Event(q, mbed::callback(obj, method), b0, b1);
01160     }
01161 
01162     /** Create an event
01163      *  @see Event::Event
01164      */
01165     template <typename T, typename R, typename B0, typename B1>
01166     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0, A1) const, B0 b0, B1 b1) {
01167         new (this) Event(q, mbed::callback(obj, method), b0, b1);
01168     }
01169 
01170     /** Create an event
01171      *  @see Event::Event
01172      */
01173     template <typename T, typename R, typename B0, typename B1>
01174     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0, A1) volatile, B0 b0, B1 b1) {
01175         new (this) Event(q, mbed::callback(obj, method), b0, b1);
01176     }
01177 
01178     /** Create an event
01179      *  @see Event::Event
01180      */
01181     template <typename T, typename R, typename B0, typename B1>
01182     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0, A1) const volatile, B0 b0, B1 b1) {
01183         new (this) Event(q, mbed::callback(obj, method), b0, b1);
01184     }
01185 
01186     /** Create an event
01187      *  @see Event::Event
01188      */
01189     template <typename T, typename R, typename B0, typename B1, typename B2>
01190     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0, A1), B0 b0, B1 b1, B2 b2) {
01191         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
01192     }
01193 
01194     /** Create an event
01195      *  @see Event::Event
01196      */
01197     template <typename T, typename R, typename B0, typename B1, typename B2>
01198     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0, A1) const, B0 b0, B1 b1, B2 b2) {
01199         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
01200     }
01201 
01202     /** Create an event
01203      *  @see Event::Event
01204      */
01205     template <typename T, typename R, typename B0, typename B1, typename B2>
01206     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1) volatile, B0 b0, B1 b1, B2 b2) {
01207         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
01208     }
01209 
01210     /** Create an event
01211      *  @see Event::Event
01212      */
01213     template <typename T, typename R, typename B0, typename B1, typename B2>
01214     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1) const volatile, B0 b0, B1 b1, B2 b2) {
01215         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
01216     }
01217 
01218     /** Create an event
01219      *  @see Event::Event
01220      */
01221     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
01222     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1), B0 b0, B1 b1, B2 b2, B3 b3) {
01223         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
01224     }
01225 
01226     /** Create an event
01227      *  @see Event::Event
01228      */
01229     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
01230     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) const, B0 b0, B1 b1, B2 b2, B3 b3) {
01231         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
01232     }
01233 
01234     /** Create an event
01235      *  @see Event::Event
01236      */
01237     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
01238     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1) volatile, B0 b0, B1 b1, B2 b2, B3 b3) {
01239         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
01240     }
01241 
01242     /** Create an event
01243      *  @see Event::Event
01244      */
01245     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
01246     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) {
01247         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
01248     }
01249 
01250     /** Create an event
01251      *  @see Event::Event
01252      */
01253     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
01254     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) {
01255         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
01256     }
01257 
01258     /** Create an event
01259      *  @see Event::Event
01260      */
01261     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
01262     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) {
01263         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
01264     }
01265 
01266     /** Create an event
01267      *  @see Event::Event
01268      */
01269     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
01270     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) {
01271         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
01272     }
01273 
01274     /** Create an event
01275      *  @see Event::Event
01276      */
01277     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
01278     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) {
01279         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
01280     }
01281 };
01282 
01283 /** Event
01284  *
01285  *  Representation of an event for fine-grain dispatch control
01286  * @ingroup events
01287  */
01288 template <typename A0, typename A1, typename A2>
01289 class Event<void(A0, A1, A2)> {
01290 public:
01291     /** Create an event
01292      *
01293      *  Constructs an event bound to the specified event queue. The specified
01294      *  callback acts as the target for the event and is executed in the
01295      *  context of the event queue's dispatch loop once posted.
01296      *
01297      *  @param q        Event queue to dispatch on
01298      *  @param f        Function to execute when the event is dispatched
01299      */
01300     template <typename F>
01301     Event(EventQueue *q, F f) {
01302         _event = static_cast<struct event *>(
01303                 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
01304 
01305         if (_event) {
01306             _event->equeue = &q->_equeue;
01307             _event->id = 0;
01308             _event->delay = 0;
01309             _event->period = -1;
01310 
01311             _event->post = &Event::event_post<F>;
01312             _event->dtor = &Event::event_dtor<F>;
01313 
01314             new (_event+1) F(f);
01315 
01316             _event->ref = 1;
01317         }
01318     }
01319 
01320     /** Copy constructor for events
01321      */
01322     Event(const Event &e) {
01323         _event = 0;
01324         if (e._event) {
01325             _event = e._event;
01326             _event->ref += 1;
01327         }
01328     }
01329 
01330     /** Assignment operator for events
01331      */
01332     Event &operator=(const Event &that) {
01333         if (this != &that) {
01334             this->~Event();
01335             new (this) Event(that);
01336         }
01337 
01338         return *this;
01339     }
01340 
01341     /** Destructor for events
01342      */
01343     ~Event() {
01344         if (_event) {
01345             _event->ref -= 1;
01346             if (_event->ref == 0) {
01347                 _event->dtor(_event);
01348                 equeue_dealloc(_event->equeue, _event);
01349             }
01350         }
01351     }
01352 
01353     /** Configure the delay of an event
01354      *
01355      *  @param delay    Millisecond delay before dispatching the event
01356      */
01357     void delay(int delay) {
01358         if (_event) {
01359             _event->delay = delay;
01360         }
01361     }
01362 
01363     /** Configure the period of an event
01364      *
01365      *  @param period   Millisecond period for repeatedly dispatching an event
01366      */
01367     void period(int period) {
01368         if (_event) {
01369             _event->period = period;
01370         }
01371     }
01372 
01373     /** Posts an event onto the underlying event queue
01374      *
01375      *  The event is posted to the underlying queue and is executed in the
01376      *  context of the event queue's dispatch loop.
01377      *
01378      *  The post function is irq safe and can act as a mechanism for moving
01379      *  events out of irq contexts.
01380      *
01381      *  @param a0,a1,a2     Arguments to pass to the event
01382      *  @return             A unique id that represents the posted event and can
01383      *                      be passed to EventQueue::cancel, or an id of 0 if
01384      *                      there is not enough memory to allocate the event.
01385      */
01386     int post(A0 a0, A1 a1, A2 a2) const {
01387         if (!_event) {
01388             return 0;
01389         }
01390 
01391         _event->id = _event->post(_event, a0, a1, a2);
01392         return _event->id;
01393     }
01394 
01395     /** Posts an event onto the underlying event queue, returning void
01396      *
01397      *  @param a0,a1,a2     Arguments to pass to the event
01398      */
01399     void call(A0 a0, A1 a1, A2 a2) const {
01400         MBED_UNUSED int id = post(a0, a1, a2);
01401         MBED_ASSERT(id);
01402     }
01403 
01404     /** Posts an event onto the underlying event queue, returning void
01405      *
01406      *  @param a0,a1,a2     Arguments to pass to the event
01407      */
01408     void operator()(A0 a0, A1 a1, A2 a2) const {
01409         return call(a0, a1, a2);
01410     }
01411 
01412     /** Static thunk for passing as C-style function
01413      *
01414      *  @param func         Event to call passed as a void pointer
01415      *  @param a0,a1,a2     Arguments to pass to the event
01416      */
01417     static void thunk(void *func, A0 a0, A1 a1, A2 a2) {
01418         return static_cast<Event*>(func)->call(a0, a1, a2);
01419     }
01420 
01421     /** Cancels the most recently posted event
01422      *
01423      *  Attempts to cancel the most recently posted event. It is safe to call
01424      *  cancel after an event has already been dispatched.
01425      *
01426      *  The cancel function is irq safe.
01427      *
01428      *  If called while the event queue's dispatch loop is active, the cancel
01429      *  function does not garuntee that the event will not execute after it
01430      *  returns, as the event may have already begun executing.
01431      */
01432     void cancel() const {
01433         if (_event) {
01434             equeue_cancel(_event->equeue, _event->id);
01435         }
01436     }
01437 
01438 private:
01439     struct event {
01440         unsigned ref;
01441         equeue_t *equeue;
01442         int id;
01443 
01444         int delay;
01445         int period;
01446 
01447         int (*post)(struct event *, A0 a0, A1 a1, A2 a2);
01448         void (*dtor)(struct event *);
01449 
01450         // F follows
01451     } *_event;
01452 
01453     // Event attributes
01454     template <typename F>
01455     static int event_post(struct event *e, A0 a0, A1 a1, A2 a2) {
01456         typedef EventQueue::context30<F, A0, A1, A2> C;
01457         void *p = equeue_alloc(e->equeue, sizeof(C));
01458         if (!p) {
01459             return 0;
01460         }
01461 
01462         new (p) C(*(F*)(e + 1), a0, a1, a2);
01463         equeue_event_delay(p, e->delay);
01464         equeue_event_period(p, e->period);
01465         equeue_event_dtor(p, &EventQueue::function_dtor<C>);
01466         return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
01467     }
01468 
01469     template <typename F>
01470     static void event_dtor(struct event *e) {
01471         ((F*)(e + 1))->~F();
01472     }
01473 
01474 public:
01475     /** Create an event
01476      *  @param q                Event queue to dispatch on
01477      *  @param f                Function to execute when the event is dispatched
01478      *  @param c0               Argument to bind to the callback, these arguments are
01479      *                          allocated on an irq-safe allocator from the event queue's
01480      *                          memory pool. Must be type-compatible with b0, the
01481      *                          arguments to the underlying callback.
01482      */
01483     template <typename F, typename C0>
01484     Event(EventQueue *q, F f, C0 c0) {
01485         new (this) Event(q, EventQueue::context13<F, C0, A0, A1, A2>(f, c0));
01486     }
01487 
01488     /** Create an event
01489      *  @param q                Event queue to dispatch on
01490      *  @param f                Function to execute when the event is dispatched
01491      *  @param c0,c1            Arguments to bind to the callback, these arguments are
01492      *                          allocated on an irq-safe allocator from the event queue's
01493      *                          memory pool. Must be type-compatible with b0..b1, the
01494      *                          arguments to the underlying callback.
01495      */
01496     template <typename F, typename C0, typename C1>
01497     Event(EventQueue *q, F f, C0 c0, C1 c1) {
01498         new (this) Event(q, EventQueue::context23<F, C0, C1, A0, A1, A2>(f, c0, c1));
01499     }
01500 
01501     /** Create an event
01502      *  @param q                Event queue to dispatch on
01503      *  @param f                Function to execute when the event is dispatched
01504      *  @param c0,c1,c2         Arguments to bind to the callback, these arguments are
01505      *                          allocated on an irq-safe allocator from the event queue's
01506      *                          memory pool. Must be type-compatible with b0..b2, the
01507      *                          arguments to the underlying callback.
01508      */
01509     template <typename F, typename C0, typename C1, typename C2>
01510     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
01511         new (this) Event(q, EventQueue::context33<F, C0, C1, C2, A0, A1, A2>(f, c0, c1, c2));
01512     }
01513 
01514     /** Create an event
01515      *  @param q                Event queue to dispatch on
01516      *  @param f                Function to execute when the event is dispatched
01517      *  @param c0,c1,c2,c3      Arguments to bind to the callback, these arguments are
01518      *                          allocated on an irq-safe allocator from the event queue's
01519      *                          memory pool. Must be type-compatible with b0..b3, the
01520      *                          arguments to the underlying callback.
01521      */
01522     template <typename F, typename C0, typename C1, typename C2, typename C3>
01523     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
01524         new (this) Event(q, EventQueue::context43<F, C0, C1, C2, C3, A0, A1, A2>(f, c0, c1, c2, c3));
01525     }
01526 
01527     /** Create an event
01528      *  @param q                Event queue to dispatch on
01529      *  @param f                Function to execute when the event is dispatched
01530      *  @param c0,c1,c2,c3,c4   Arguments to bind to the callback, these arguments are
01531      *                          allocated on an irq-safe allocator from the event queue's
01532      *                          memory pool. Must be type-compatible with b0..b4, the
01533      *                          arguments to the underlying callback.
01534      */
01535     template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
01536     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
01537         new (this) Event(q, EventQueue::context53<F, C0, C1, C2, C3, C4, A0, A1, A2>(f, c0, c1, c2, c3, c4));
01538     }
01539 
01540     /** Create an event
01541      *  @see Event::Event
01542      */
01543     template <typename T, typename R, typename B0>
01544     Event(EventQueue *q, T *obj, R (T::*method)(B0, A0, A1, A2), B0 b0) {
01545         new (this) Event(q, mbed::callback(obj, method), b0);
01546     }
01547 
01548     /** Create an event
01549      *  @see Event::Event
01550      */
01551     template <typename T, typename R, typename B0>
01552     Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0, A1, A2) const, B0 b0) {
01553         new (this) Event(q, mbed::callback(obj, method), b0);
01554     }
01555 
01556     /** Create an event
01557      *  @see Event::Event
01558      */
01559     template <typename T, typename R, typename B0>
01560     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0, A1, A2) volatile, B0 b0) {
01561         new (this) Event(q, mbed::callback(obj, method), b0);
01562     }
01563 
01564     /** Create an event
01565      *  @see Event::Event
01566      */
01567     template <typename T, typename R, typename B0>
01568     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0, A1, A2) const volatile, B0 b0) {
01569         new (this) Event(q, mbed::callback(obj, method), b0);
01570     }
01571 
01572     /** Create an event
01573      *  @see Event::Event
01574      */
01575     template <typename T, typename R, typename B0, typename B1>
01576     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0, A1, A2), B0 b0, B1 b1) {
01577         new (this) Event(q, mbed::callback(obj, method), b0, b1);
01578     }
01579 
01580     /** Create an event
01581      *  @see Event::Event
01582      */
01583     template <typename T, typename R, typename B0, typename B1>
01584     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0, A1, A2) const, B0 b0, B1 b1) {
01585         new (this) Event(q, mbed::callback(obj, method), b0, b1);
01586     }
01587 
01588     /** Create an event
01589      *  @see Event::Event
01590      */
01591     template <typename T, typename R, typename B0, typename B1>
01592     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2) volatile, B0 b0, B1 b1) {
01593         new (this) Event(q, mbed::callback(obj, method), b0, b1);
01594     }
01595 
01596     /** Create an event
01597      *  @see Event::Event
01598      */
01599     template <typename T, typename R, typename B0, typename B1>
01600     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2) const volatile, B0 b0, B1 b1) {
01601         new (this) Event(q, mbed::callback(obj, method), b0, b1);
01602     }
01603 
01604     /** Create an event
01605      *  @see Event::Event
01606      */
01607     template <typename T, typename R, typename B0, typename B1, typename B2>
01608     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2), B0 b0, B1 b1, B2 b2) {
01609         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
01610     }
01611 
01612     /** Create an event
01613      *  @see Event::Event
01614      */
01615     template <typename T, typename R, typename B0, typename B1, typename B2>
01616     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) const, B0 b0, B1 b1, B2 b2) {
01617         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
01618     }
01619 
01620     /** Create an event
01621      *  @see Event::Event
01622      */
01623     template <typename T, typename R, typename B0, typename B1, typename B2>
01624     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) volatile, B0 b0, B1 b1, B2 b2) {
01625         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
01626     }
01627 
01628     /** Create an event
01629      *  @see Event::Event
01630      */
01631     template <typename T, typename R, typename B0, typename B1, typename B2>
01632     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2) const volatile, B0 b0, B1 b1, B2 b2) {
01633         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
01634     }
01635 
01636     /** Create an event
01637      *  @see Event::Event
01638      */
01639     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
01640     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2), B0 b0, B1 b1, B2 b2, B3 b3) {
01641         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
01642     }
01643 
01644     /** Create an event
01645      *  @see Event::Event
01646      */
01647     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
01648     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) {
01649         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
01650     }
01651 
01652     /** Create an event
01653      *  @see Event::Event
01654      */
01655     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
01656     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) {
01657         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
01658     }
01659 
01660     /** Create an event
01661      *  @see Event::Event
01662      */
01663     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
01664     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) {
01665         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
01666     }
01667 
01668     /** Create an event
01669      *  @see Event::Event
01670      */
01671     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
01672     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) {
01673         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
01674     }
01675 
01676     /** Create an event
01677      *  @see Event::Event
01678      */
01679     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
01680     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) {
01681         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
01682     }
01683 
01684     /** Create an event
01685      *  @see Event::Event
01686      */
01687     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
01688     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) {
01689         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
01690     }
01691 
01692     /** Create an event
01693      *  @see Event::Event
01694      */
01695     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
01696     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) {
01697         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
01698     }
01699 };
01700 
01701 /** Event
01702  *
01703  *  Representation of an event for fine-grain dispatch control
01704  * @ingroup events
01705  */
01706 template <typename A0, typename A1, typename A2, typename A3>
01707 class Event<void(A0, A1, A2, A3)> {
01708 public:
01709     /** Create an event
01710      *
01711      *  Constructs an event bound to the specified event queue. The specified
01712      *  callback acts as the target for the event and is executed in the
01713      *  context of the event queue's dispatch loop once posted.
01714      *
01715      *  @param q        Event queue to dispatch on
01716      *  @param f        Function to execute when the event is dispatched
01717      */
01718     template <typename F>
01719     Event(EventQueue *q, F f) {
01720         _event = static_cast<struct event *>(
01721                 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
01722 
01723         if (_event) {
01724             _event->equeue = &q->_equeue;
01725             _event->id = 0;
01726             _event->delay = 0;
01727             _event->period = -1;
01728 
01729             _event->post = &Event::event_post<F>;
01730             _event->dtor = &Event::event_dtor<F>;
01731 
01732             new (_event+1) F(f);
01733 
01734             _event->ref = 1;
01735         }
01736     }
01737 
01738     /** Copy constructor for events
01739      */
01740     Event(const Event &e) {
01741         _event = 0;
01742         if (e._event) {
01743             _event = e._event;
01744             _event->ref += 1;
01745         }
01746     }
01747 
01748     /** Assignment operator for events
01749      */
01750     Event &operator=(const Event &that) {
01751         if (this != &that) {
01752             this->~Event();
01753             new (this) Event(that);
01754         }
01755 
01756         return *this;
01757     }
01758 
01759     /** Destructor for events
01760      */
01761     ~Event() {
01762         if (_event) {
01763             _event->ref -= 1;
01764             if (_event->ref == 0) {
01765                 _event->dtor(_event);
01766                 equeue_dealloc(_event->equeue, _event);
01767             }
01768         }
01769     }
01770 
01771     /** Configure the delay of an event
01772      *
01773      *  @param delay    Millisecond delay before dispatching the event
01774      */
01775     void delay(int delay) {
01776         if (_event) {
01777             _event->delay = delay;
01778         }
01779     }
01780 
01781     /** Configure the period of an event
01782      *
01783      *  @param period   Millisecond period for repeatedly dispatching an event
01784      */
01785     void period(int period) {
01786         if (_event) {
01787             _event->period = period;
01788         }
01789     }
01790 
01791     /** Posts an event onto the underlying event queue
01792      *
01793      *  The event is posted to the underlying queue and is executed in the
01794      *  context of the event queue's dispatch loop.
01795      *
01796      *  The post function is irq safe and can act as a mechanism for moving
01797      *  events out of irq contexts.
01798      *
01799      *  @param a0,a1,a2,a3   Arguments to pass to the event
01800      *  @return              A unique id that represents the posted event and can
01801      *                       be passed to EventQueue::cancel, or an id of 0 if
01802      *                       there is not enough memory to allocate the event.
01803      */
01804     int post(A0 a0, A1 a1, A2 a2, A3 a3) const {
01805         if (!_event) {
01806             return 0;
01807         }
01808 
01809         _event->id = _event->post(_event, a0, a1, a2, a3);
01810         return _event->id;
01811     }
01812 
01813     /** Posts an event onto the underlying event queue, returning void
01814      *
01815      *  @param a0,a1,a2,a3   Arguments to pass to the event
01816      */
01817     void call(A0 a0, A1 a1, A2 a2, A3 a3) const {
01818         MBED_UNUSED int id = post(a0, a1, a2, a3);
01819         MBED_ASSERT(id);
01820     }
01821 
01822     /** Posts an event onto the underlying event queue, returning void
01823      *
01824      *  @param a0,a1,a2,a3   Arguments to pass to the event
01825      */
01826     void operator()(A0 a0, A1 a1, A2 a2, A3 a3) const {
01827         return call(a0, a1, a2, a3);
01828     }
01829 
01830     /** Static thunk for passing as C-style function
01831      *
01832      *  @param func          Event to call passed as a void pointer
01833      *  @param a0,a1,a2,a3   Arguments to pass to the event
01834      */
01835     static void thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3) {
01836         return static_cast<Event*>(func)->call(a0, a1, a2, a3);
01837     }
01838 
01839     /** Cancels the most recently posted event
01840      *
01841      *  Attempts to cancel the most recently posted event. It is safe to call
01842      *  cancel after an event has already been dispatched.
01843      *
01844      *  The cancel function is irq safe.
01845      *
01846      *  If called while the event queue's dispatch loop is active, the cancel
01847      *  function does not garuntee that the event will not execute after it
01848      *  returns, as the event may have already begun executing.
01849      */
01850     void cancel() const {
01851         if (_event) {
01852             equeue_cancel(_event->equeue, _event->id);
01853         }
01854     }
01855 
01856 private:
01857     struct event {
01858         unsigned ref;
01859         equeue_t *equeue;
01860         int id;
01861 
01862         int delay;
01863         int period;
01864 
01865         int (*post)(struct event *, A0 a0, A1 a1, A2 a2, A3 a3);
01866         void (*dtor)(struct event *);
01867 
01868         // F follows
01869     } *_event;
01870 
01871     // Event attributes
01872     template <typename F>
01873     static int event_post(struct event *e, A0 a0, A1 a1, A2 a2, A3 a3) {
01874         typedef EventQueue::context40<F, A0, A1, A2, A3> C;
01875         void *p = equeue_alloc(e->equeue, sizeof(C));
01876         if (!p) {
01877             return 0;
01878         }
01879 
01880         new (p) C(*(F*)(e + 1), a0, a1, a2, a3);
01881         equeue_event_delay(p, e->delay);
01882         equeue_event_period(p, e->period);
01883         equeue_event_dtor(p, &EventQueue::function_dtor<C>);
01884         return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
01885     }
01886 
01887     template <typename F>
01888     static void event_dtor(struct event *e) {
01889         ((F*)(e + 1))->~F();
01890     }
01891 
01892 public:
01893     /** Create an event
01894      *  @param q                Event queue to dispatch on
01895      *  @param f                Function to execute when the event is dispatched
01896      *  @param c0               Argument to bind to the callback, these arguments are
01897      *                          allocated on an irq-safe allocator from the event queue's
01898      *                          memory pool. Must be type-compatible with b0, the
01899      *                          arguments to the underlying callback.
01900      */
01901     template <typename F, typename C0>
01902     Event(EventQueue *q, F f, C0 c0) {
01903         new (this) Event(q, EventQueue::context14<F, C0, A0, A1, A2, A3>(f, c0));
01904     }
01905 
01906     /** Create an event
01907      *  @param q                Event queue to dispatch on
01908      *  @param f                Function to execute when the event is dispatched
01909      *  @param c0,c1            Arguments to bind to the callback, these arguments are
01910      *                          allocated on an irq-safe allocator from the event queue's
01911      *                          memory pool. Must be type-compatible with b0..b1, the
01912      *                          arguments to the underlying callback.
01913      */
01914     template <typename F, typename C0, typename C1>
01915     Event(EventQueue *q, F f, C0 c0, C1 c1) {
01916         new (this) Event(q, EventQueue::context24<F, C0, C1, A0, A1, A2, A3>(f, c0, c1));
01917     }
01918 
01919     /** Create an event
01920      *  @param q                Event queue to dispatch on
01921      *  @param f                Function to execute when the event is dispatched
01922      *  @param c0,c1,c2         Arguments to bind to the callback, these arguments are
01923      *                          allocated on an irq-safe allocator from the event queue's
01924      *                          memory pool. Must be type-compatible with b0..b2, the
01925      *                          arguments to the underlying callback.
01926      */
01927     template <typename F, typename C0, typename C1, typename C2>
01928     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
01929         new (this) Event(q, EventQueue::context34<F, C0, C1, C2, A0, A1, A2, A3>(f, c0, c1, c2));
01930     }
01931 
01932     /** Create an event
01933      *  @param q                Event queue to dispatch on
01934      *  @param f                Function to execute when the event is dispatched
01935      *  @param c0,c1,c2,c3      Arguments to bind to the callback, these arguments are
01936      *                          allocated on an irq-safe allocator from the event queue's
01937      *                          memory pool. Must be type-compatible with b0..b3, the
01938      *                          arguments to the underlying callback.
01939      */
01940     template <typename F, typename C0, typename C1, typename C2, typename C3>
01941     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
01942         new (this) Event(q, EventQueue::context44<F, C0, C1, C2, C3, A0, A1, A2, A3>(f, c0, c1, c2, c3));
01943     }
01944 
01945     /** Create an event
01946      *  @param q                Event queue to dispatch on
01947      *  @param f                Function to execute when the event is dispatched
01948      *  @param c0,c1,c2,c3,c4   Arguments to bind to the callback, these arguments are
01949      *                          allocated on an irq-safe allocator from the event queue's
01950      *                          memory pool. Must be type-compatible with b0..b4, the
01951      *                          arguments to the underlying callback.
01952      */
01953     template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
01954     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
01955         new (this) Event(q, EventQueue::context54<F, C0, C1, C2, C3, C4, A0, A1, A2, A3>(f, c0, c1, c2, c3, c4));
01956     }
01957 
01958     /** Create an event
01959      *  @see Event::Event
01960      */
01961     template <typename T, typename R, typename B0>
01962     Event(EventQueue *q, T *obj, R (T::*method)(B0, A0, A1, A2, A3), B0 b0) {
01963         new (this) Event(q, mbed::callback(obj, method), b0);
01964     }
01965 
01966     /** Create an event
01967      *  @see Event::Event
01968      */
01969     template <typename T, typename R, typename B0>
01970     Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0, A1, A2, A3) const, B0 b0) {
01971         new (this) Event(q, mbed::callback(obj, method), b0);
01972     }
01973 
01974     /** Create an event
01975      *  @see Event::Event
01976      */
01977     template <typename T, typename R, typename B0>
01978     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3) volatile, B0 b0) {
01979         new (this) Event(q, mbed::callback(obj, method), b0);
01980     }
01981 
01982     /** Create an event
01983      *  @see Event::Event
01984      */
01985     template <typename T, typename R, typename B0>
01986     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3) const volatile, B0 b0) {
01987         new (this) Event(q, mbed::callback(obj, method), b0);
01988     }
01989 
01990     /** Create an event
01991      *  @see Event::Event
01992      */
01993     template <typename T, typename R, typename B0, typename B1>
01994     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3), B0 b0, B1 b1) {
01995         new (this) Event(q, mbed::callback(obj, method), b0, b1);
01996     }
01997 
01998     /** Create an event
01999      *  @see Event::Event
02000      */
02001     template <typename T, typename R, typename B0, typename B1>
02002     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) const, B0 b0, B1 b1) {
02003         new (this) Event(q, mbed::callback(obj, method), b0, b1);
02004     }
02005 
02006     /** Create an event
02007      *  @see Event::Event
02008      */
02009     template <typename T, typename R, typename B0, typename B1>
02010     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) volatile, B0 b0, B1 b1) {
02011         new (this) Event(q, mbed::callback(obj, method), b0, b1);
02012     }
02013 
02014     /** Create an event
02015      *  @see Event::Event
02016      */
02017     template <typename T, typename R, typename B0, typename B1>
02018     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3) const volatile, B0 b0, B1 b1) {
02019         new (this) Event(q, mbed::callback(obj, method), b0, b1);
02020     }
02021 
02022     /** Create an event
02023      *  @see Event::Event
02024      */
02025     template <typename T, typename R, typename B0, typename B1, typename B2>
02026     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3), B0 b0, B1 b1, B2 b2) {
02027         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
02028     }
02029 
02030     /** Create an event
02031      *  @see Event::Event
02032      */
02033     template <typename T, typename R, typename B0, typename B1, typename B2>
02034     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) const, B0 b0, B1 b1, B2 b2) {
02035         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
02036     }
02037 
02038     /** Create an event
02039      *  @see Event::Event
02040      */
02041     template <typename T, typename R, typename B0, typename B1, typename B2>
02042     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3) volatile, B0 b0, B1 b1, B2 b2) {
02043         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
02044     }
02045 
02046     /** Create an event
02047      *  @see Event::Event
02048      */
02049     template <typename T, typename R, typename B0, typename B1, typename B2>
02050     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) {
02051         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
02052     }
02053 
02054     /** Create an event
02055      *  @see Event::Event
02056      */
02057     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
02058     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, B3, A0, A1, A2, A3), B0 b0, B1 b1, B2 b2, B3 b3) {
02059         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
02060     }
02061 
02062     /** Create an event
02063      *  @see Event::Event
02064      */
02065     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
02066     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) {
02067         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
02068     }
02069 
02070     /** Create an event
02071      *  @see Event::Event
02072      */
02073     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
02074     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) {
02075         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
02076     }
02077 
02078     /** Create an event
02079      *  @see Event::Event
02080      */
02081     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
02082     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) {
02083         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
02084     }
02085 
02086     /** Create an event
02087      *  @see Event::Event
02088      */
02089     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
02090     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) {
02091         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
02092     }
02093 
02094     /** Create an event
02095      *  @see Event::Event
02096      */
02097     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
02098     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) {
02099         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
02100     }
02101 
02102     /** Create an event
02103      *  @see Event::Event
02104      */
02105     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
02106     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) {
02107         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
02108     }
02109 
02110     /** Create an event
02111      *  @see Event::Event
02112      */
02113     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
02114     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) {
02115         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
02116     }
02117 };
02118 
02119 /** Event
02120  *
02121  *  Representation of an event for fine-grain dispatch control
02122  * @ingroup events
02123  */
02124 template <typename A0, typename A1, typename A2, typename A3, typename A4>
02125 class Event<void(A0, A1, A2, A3, A4)> {
02126 public:
02127     /** Create an event
02128      *
02129      *  Constructs an event bound to the specified event queue. The specified
02130      *  callback acts as the target for the event and is executed in the
02131      *  context of the event queue's dispatch loop once posted.
02132      *
02133      *  @param q        Event queue to dispatch on
02134      *  @param f        Function to execute when the event is dispatched
02135      */
02136     template <typename F>
02137     Event(EventQueue *q, F f) {
02138         _event = static_cast<struct event *>(
02139                 equeue_alloc(&q->_equeue, sizeof(struct event) + sizeof(F)));
02140 
02141         if (_event) {
02142             _event->equeue = &q->_equeue;
02143             _event->id = 0;
02144             _event->delay = 0;
02145             _event->period = -1;
02146 
02147             _event->post = &Event::event_post<F>;
02148             _event->dtor = &Event::event_dtor<F>;
02149 
02150             new (_event+1) F(f);
02151 
02152             _event->ref = 1;
02153         }
02154     }
02155 
02156     /** Copy constructor for events
02157      */
02158     Event(const Event &e) {
02159         _event = 0;
02160         if (e._event) {
02161             _event = e._event;
02162             _event->ref += 1;
02163         }
02164     }
02165 
02166     /** Assignment operator for events
02167      */
02168     Event &operator=(const Event &that) {
02169         if (this != &that) {
02170             this->~Event();
02171             new (this) Event(that);
02172         }
02173 
02174         return *this;
02175     }
02176 
02177     /** Destructor for events
02178      */
02179     ~Event() {
02180         if (_event) {
02181             _event->ref -= 1;
02182             if (_event->ref == 0) {
02183                 _event->dtor(_event);
02184                 equeue_dealloc(_event->equeue, _event);
02185             }
02186         }
02187     }
02188 
02189     /** Configure the delay of an event
02190      *
02191      *  @param delay    Millisecond delay before dispatching the event
02192      */
02193     void delay(int delay) {
02194         if (_event) {
02195             _event->delay = delay;
02196         }
02197     }
02198 
02199     /** Configure the period of an event
02200      *
02201      *  @param period   Millisecond period for repeatedly dispatching an event
02202      */
02203     void period(int period) {
02204         if (_event) {
02205             _event->period = period;
02206         }
02207     }
02208 
02209     /** Posts an event onto the underlying event queue
02210      *
02211      *  The event is posted to the underlying queue and is executed in the
02212      *  context of the event queue's dispatch loop.
02213      *
02214      *  The post function is irq safe and can act as a mechanism for moving
02215      *  events out of irq contexts.
02216      *
02217      *  @param a0,a1,a2,a3,a4   Arguments to pass to the event
02218      *  @return                 A unique id that represents the posted event and can
02219      *                          be passed to EventQueue::cancel, or an id of 0 if
02220      *                          there is not enough memory to allocate the event.
02221      */
02222     int post(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
02223         if (!_event) {
02224             return 0;
02225         }
02226 
02227         _event->id = _event->post(_event, a0, a1, a2, a3, a4);
02228         return _event->id;
02229     }
02230 
02231     /** Posts an event onto the underlying event queue, returning void
02232      *
02233      *  @param a0,a1,a2,a3,a4   Arguments to pass to the event
02234      */
02235     void call(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
02236         MBED_UNUSED int id = post(a0, a1, a2, a3, a4);
02237         MBED_ASSERT(id);
02238     }
02239 
02240     /** Posts an event onto the underlying event queue, returning void
02241      *
02242      *  @param a0,a1,a2,a3,a4   Arguments to pass to the event
02243      */
02244     void operator()(A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) const {
02245         return call(a0, a1, a2, a3, a4);
02246     }
02247 
02248     /** Static thunk for passing as C-style function
02249      *
02250      *  @param func             Event to call passed as a void pointer
02251      *  @param a0,a1,a2,a3,a4   Arguments to pass to the event
02252      */
02253     static void thunk(void *func, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
02254         return static_cast<Event*>(func)->call(a0, a1, a2, a3, a4);
02255     }
02256 
02257     /** Cancels the most recently posted event
02258      *
02259      *  Attempts to cancel the most recently posted event. It is safe to call
02260      *  cancel after an event has already been dispatched.
02261      *
02262      *  The cancel function is irq safe.
02263      *
02264      *  If called while the event queue's dispatch loop is active, the cancel
02265      *  function does not garuntee that the event will not execute after it
02266      *  returns, as the event may have already begun executing.
02267      */
02268     void cancel() const {
02269         if (_event) {
02270             equeue_cancel(_event->equeue, _event->id);
02271         }
02272     }
02273 
02274 private:
02275     struct event {
02276         unsigned ref;
02277         equeue_t *equeue;
02278         int id;
02279 
02280         int delay;
02281         int period;
02282 
02283         int (*post)(struct event *, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4);
02284         void (*dtor)(struct event *);
02285 
02286         // F follows
02287     } *_event;
02288 
02289     // Event attributes
02290     template <typename F>
02291     static int event_post(struct event *e, A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) {
02292         typedef EventQueue::context50<F, A0, A1, A2, A3, A4> C;
02293         void *p = equeue_alloc(e->equeue, sizeof(C));
02294         if (!p) {
02295             return 0;
02296         }
02297 
02298         new (p) C(*(F*)(e + 1), a0, a1, a2, a3, a4);
02299         equeue_event_delay(p, e->delay);
02300         equeue_event_period(p, e->period);
02301         equeue_event_dtor(p, &EventQueue::function_dtor<C>);
02302         return equeue_post(e->equeue, &EventQueue::function_call<C>, p);
02303     }
02304 
02305     template <typename F>
02306     static void event_dtor(struct event *e) {
02307         ((F*)(e + 1))->~F();
02308     }
02309 
02310 public:
02311     /** Create an event
02312      *  @param q                Event queue to dispatch on
02313      *  @param f                Function to execute when the event is dispatched
02314      *  @param c0               Argument to bind to the callback, these arguments are
02315      *                          allocated on an irq-safe allocator from the event queue's
02316      *                          memory pool. Must be type-compatible with b0, the
02317      *                          arguments to the underlying callback.
02318      */
02319     template <typename F, typename C0>
02320     Event(EventQueue *q, F f, C0 c0) {
02321         new (this) Event(q, EventQueue::context15<F, C0, A0, A1, A2, A3, A4>(f, c0));
02322     }
02323 
02324     /** Create an event
02325      *  @param q                Event queue to dispatch on
02326      *  @param f                Function to execute when the event is dispatched
02327      *  @param c0,c1            Arguments to bind to the callback, these arguments are
02328      *                          allocated on an irq-safe allocator from the event queue's
02329      *                          memory pool. Must be type-compatible with b0..b1, the
02330      *                          arguments to the underlying callback.
02331      */
02332     template <typename F, typename C0, typename C1>
02333     Event(EventQueue *q, F f, C0 c0, C1 c1) {
02334         new (this) Event(q, EventQueue::context25<F, C0, C1, A0, A1, A2, A3, A4>(f, c0, c1));
02335     }
02336 
02337     /** Create an event
02338      *  @param q                Event queue to dispatch on
02339      *  @param f                Function to execute when the event is dispatched
02340      *  @param c0,c1,c2         Arguments to bind to the callback, these arguments are
02341      *                          allocated on an irq-safe allocator from the event queue's
02342      *                          memory pool. Must be type-compatible with b0..b2, the
02343      *                          arguments to the underlying callback.
02344      */
02345     template <typename F, typename C0, typename C1, typename C2>
02346     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2) {
02347         new (this) Event(q, EventQueue::context35<F, C0, C1, C2, A0, A1, A2, A3, A4>(f, c0, c1, c2));
02348     }
02349 
02350     /** Create an event
02351      *  @param q                Event queue to dispatch on
02352      *  @param f                Function to execute when the event is dispatched
02353      *  @param c0,c1,c2,c3      Arguments to bind to the callback, these arguments are
02354      *                          allocated on an irq-safe allocator from the event queue's
02355      *                          memory pool. Must be type-compatible with b0..b3, the
02356      *                          arguments to the underlying callback.
02357      */
02358     template <typename F, typename C0, typename C1, typename C2, typename C3>
02359     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3) {
02360         new (this) Event(q, EventQueue::context45<F, C0, C1, C2, C3, A0, A1, A2, A3, A4>(f, c0, c1, c2, c3));
02361     }
02362 
02363     /** Create an event
02364      *  @param q                Event queue to dispatch on
02365      *  @param f                Function to execute when the event is dispatched
02366      *  @param c0,c1,c2,c3,c4   Arguments to bind to the callback, these arguments are
02367      *                          allocated on an irq-safe allocator from the event queue's
02368      *                          memory pool. Must be type-compatible with b0..b4, the
02369      *                          arguments to the underlying callback.
02370      */
02371     template <typename F, typename C0, typename C1, typename C2, typename C3, typename C4>
02372     Event(EventQueue *q, F f, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
02373         new (this) Event(q, EventQueue::context55<F, C0, C1, C2, C3, C4, A0, A1, A2, A3, A4>(f, c0, c1, c2, c3, c4));
02374     }
02375 
02376     /** Create an event
02377      *  @see Event::Event
02378      */
02379     template <typename T, typename R, typename B0>
02380     Event(EventQueue *q, T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4), B0 b0) {
02381         new (this) Event(q, mbed::callback(obj, method), b0);
02382     }
02383 
02384     /** Create an event
02385      *  @see Event::Event
02386      */
02387     template <typename T, typename R, typename B0>
02388     Event(EventQueue *q, const T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) const, B0 b0) {
02389         new (this) Event(q, mbed::callback(obj, method), b0);
02390     }
02391 
02392     /** Create an event
02393      *  @see Event::Event
02394      */
02395     template <typename T, typename R, typename B0>
02396     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) volatile, B0 b0) {
02397         new (this) Event(q, mbed::callback(obj, method), b0);
02398     }
02399 
02400     /** Create an event
02401      *  @see Event::Event
02402      */
02403     template <typename T, typename R, typename B0>
02404     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) const volatile, B0 b0) {
02405         new (this) Event(q, mbed::callback(obj, method), b0);
02406     }
02407 
02408     /** Create an event
02409      *  @see Event::Event
02410      */
02411     template <typename T, typename R, typename B0, typename B1>
02412     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4), B0 b0, B1 b1) {
02413         new (this) Event(q, mbed::callback(obj, method), b0, b1);
02414     }
02415 
02416     /** Create an event
02417      *  @see Event::Event
02418      */
02419     template <typename T, typename R, typename B0, typename B1>
02420     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) const, B0 b0, B1 b1) {
02421         new (this) Event(q, mbed::callback(obj, method), b0, b1);
02422     }
02423 
02424     /** Create an event
02425      *  @see Event::Event
02426      */
02427     template <typename T, typename R, typename B0, typename B1>
02428     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) volatile, B0 b0, B1 b1) {
02429         new (this) Event(q, mbed::callback(obj, method), b0, b1);
02430     }
02431 
02432     /** Create an event
02433      *  @see Event::Event
02434      */
02435     template <typename T, typename R, typename B0, typename B1>
02436     Event(EventQueue *q, const volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3, A4) const volatile, B0 b0, B1 b1) {
02437         new (this) Event(q, mbed::callback(obj, method), b0, b1);
02438     }
02439 
02440     /** Create an event
02441      *  @see Event::Event
02442      */
02443     template <typename T, typename R, typename B0, typename B1, typename B2>
02444     Event(EventQueue *q, T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4), B0 b0, B1 b1, B2 b2) {
02445         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
02446     }
02447 
02448     /** Create an event
02449      *  @see Event::Event
02450      */
02451     template <typename T, typename R, typename B0, typename B1, typename B2>
02452     Event(EventQueue *q, const T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) const, B0 b0, B1 b1, B2 b2) {
02453         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
02454     }
02455 
02456     /** Create an event
02457      *  @see Event::Event
02458      */
02459     template <typename T, typename R, typename B0, typename B1, typename B2>
02460     Event(EventQueue *q, volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2, A3, A4) volatile, B0 b0, B1 b1, B2 b2) {
02461         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
02462     }
02463 
02464     /** Create an event
02465      *  @see Event::Event
02466      */
02467     template <typename T, typename R, typename B0, typename B1, typename B2>
02468     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) {
02469         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2);
02470     }
02471 
02472     /** Create an event
02473      *  @see Event::Event
02474      */
02475     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
02476     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) {
02477         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
02478     }
02479 
02480     /** Create an event
02481      *  @see Event::Event
02482      */
02483     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
02484     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) {
02485         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
02486     }
02487 
02488     /** Create an event
02489      *  @see Event::Event
02490      */
02491     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
02492     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) {
02493         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
02494     }
02495 
02496     /** Create an event
02497      *  @see Event::Event
02498      */
02499     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3>
02500     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) {
02501         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3);
02502     }
02503 
02504     /** Create an event
02505      *  @see Event::Event
02506      */
02507     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
02508     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) {
02509         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
02510     }
02511 
02512     /** Create an event
02513      *  @see Event::Event
02514      */
02515     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
02516     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) {
02517         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
02518     }
02519 
02520     /** Create an event
02521      *  @see Event::Event
02522      */
02523     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
02524     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) {
02525         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
02526     }
02527 
02528     /** Create an event
02529      *  @see Event::Event
02530      */
02531     template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename B4>
02532     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) {
02533         new (this) Event(q, mbed::callback(obj, method), b0, b1, b2, b3, b4);
02534     }
02535 };
02536 
02537 
02538 /** \addtogroup events */
02539 /** @{ */
02540 
02541 // Convenience functions declared here to avoid cyclic
02542 // dependency between Event and EventQueue
02543 template <typename R>
02544 Event<void()> EventQueue::event(R (*func)()) {
02545     return Event<void()>(this, func);
02546 }
02547 
02548 template <typename T, typename R>
02549 Event<void()> EventQueue::event(T *obj, R (T::*method)()) {
02550     return Event<void()>(this, mbed::callback(obj, method));
02551 }
02552 
02553 template <typename T, typename R>
02554 Event<void()> EventQueue::event(const T *obj, R (T::*method)() const) {
02555     return Event<void()>(this, mbed::callback(obj, method));
02556 }
02557 
02558 template <typename T, typename R>
02559 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)() volatile) {
02560     return Event<void()>(this, mbed::callback(obj, method));
02561 }
02562 
02563 template <typename T, typename R>
02564 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)() const volatile) {
02565     return Event<void()>(this, mbed::callback(obj, method));
02566 }
02567 
02568 template <typename R>
02569 Event<void()> EventQueue::event(mbed::Callback<R()> cb) {
02570     return Event<void()>(this, cb);
02571 }
02572 
02573 template <typename R, typename B0, typename C0>
02574 Event<void()> EventQueue::event(R (*func)(B0), C0 c0) {
02575     return Event<void()>(this, func, c0);
02576 }
02577 
02578 template <typename T, typename R, typename B0, typename C0>
02579 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0), C0 c0) {
02580     return Event<void()>(this, mbed::callback(obj, method), c0);
02581 }
02582 
02583 template <typename T, typename R, typename B0, typename C0>
02584 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0) const, C0 c0) {
02585     return Event<void()>(this, mbed::callback(obj, method), c0);
02586 }
02587 
02588 template <typename T, typename R, typename B0, typename C0>
02589 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0) volatile, C0 c0) {
02590     return Event<void()>(this, mbed::callback(obj, method), c0);
02591 }
02592 
02593 template <typename T, typename R, typename B0, typename C0>
02594 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)(B0) const volatile, C0 c0) {
02595     return Event<void()>(this, mbed::callback(obj, method), c0);
02596 }
02597 
02598 template <typename R, typename B0, typename C0>
02599 Event<void()> EventQueue::event(mbed::Callback<R(B0)> cb, C0 c0) {
02600     return Event<void()>(this, cb, c0);
02601 }
02602 
02603 template <typename R, typename B0, typename B1, typename C0, typename C1>
02604 Event<void()> EventQueue::event(R (*func)(B0, B1), C0 c0, C1 c1) {
02605     return Event<void()>(this, func, c0, c1);
02606 }
02607 
02608 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1>
02609 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0, B1), C0 c0, C1 c1) {
02610     return Event<void()>(this, mbed::callback(obj, method), c0, c1);
02611 }
02612 
02613 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1>
02614 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0, B1) const, C0 c0, C1 c1) {
02615     return Event<void()>(this, mbed::callback(obj, method), c0, c1);
02616 }
02617 
02618 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1>
02619 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1) volatile, C0 c0, C1 c1) {
02620     return Event<void()>(this, mbed::callback(obj, method), c0, c1);
02621 }
02622 
02623 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1>
02624 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1) const volatile, C0 c0, C1 c1) {
02625     return Event<void()>(this, mbed::callback(obj, method), c0, c1);
02626 }
02627 
02628 template <typename R, typename B0, typename B1, typename C0, typename C1>
02629 Event<void()> EventQueue::event(mbed::Callback<R(B0, B1)> cb, C0 c0, C1 c1) {
02630     return Event<void()>(this, cb, c0, c1);
02631 }
02632 
02633 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
02634 Event<void()> EventQueue::event(R (*func)(B0, B1, B2), C0 c0, C1 c1, C2 c2) {
02635     return Event<void()>(this, func, c0, c1, c2);
02636 }
02637 
02638 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
02639 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2), C0 c0, C1 c1, C2 c2) {
02640     return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2);
02641 }
02642 
02643 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
02644 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2) const, C0 c0, C1 c1, C2 c2) {
02645     return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2);
02646 }
02647 
02648 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
02649 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2) volatile, C0 c0, C1 c1, C2 c2) {
02650     return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2);
02651 }
02652 
02653 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
02654 Event<void()> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2) const volatile, C0 c0, C1 c1, C2 c2) {
02655     return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2);
02656 }
02657 
02658 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2>
02659 Event<void()> EventQueue::event(mbed::Callback<R(B0, B1, B2)> cb, C0 c0, C1 c1, C2 c2) {
02660     return Event<void()>(this, cb, c0, c1, c2);
02661 }
02662 
02663 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
02664 Event<void()> EventQueue::event(R (*func)(B0, B1, B2, B3), C0 c0, C1 c1, C2 c2, C3 c3) {
02665     return Event<void()>(this, func, c0, c1, c2, c3);
02666 }
02667 
02668 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
02669 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3), C0 c0, C1 c1, C2 c2, C3 c3) {
02670     return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3);
02671 }
02672 
02673 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
02674 Event<void()> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, B3) const, C0 c0, C1 c1, C2 c2, C3 c3) {
02675     return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3);
02676 }
02677 
02678 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
02679 Event<void()> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, B3) volatile, C0 c0, C1 c1, C2 c2, C3 c3) {
02680     return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3);
02681 }
02682 
02683 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
02684 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) {
02685     return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3);
02686 }
02687 
02688 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3>
02689 Event<void()> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
02690     return Event<void()>(this, cb, c0, c1, c2, c3);
02691 }
02692 
02693 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
02694 Event<void()> EventQueue::event(R (*func)(B0, B1, B2, B3, B4), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
02695     return Event<void()>(this, func, c0, c1, c2, c3, c4);
02696 }
02697 
02698 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>
02699 Event<void()> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, B4), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
02700     return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
02701 }
02702 
02703 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>
02704 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) {
02705     return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
02706 }
02707 
02708 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>
02709 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) {
02710     return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
02711 }
02712 
02713 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>
02714 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) {
02715     return Event<void()>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
02716 }
02717 
02718 template <typename R, typename B0, typename B1, typename B2, typename B3, typename B4, typename C0, typename C1, typename C2, typename C3, typename C4>
02719 Event<void()> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, B4)> cb, C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
02720     return Event<void()>(this, cb, c0, c1, c2, c3, c4);
02721 }
02722 
02723 template <typename R, typename A0>
02724 Event<void(A0)> EventQueue::event(R (*func)(A0)) {
02725     return Event<void(A0)>(this, func);
02726 }
02727 
02728 template <typename T, typename R, typename A0>
02729 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(A0)) {
02730     return Event<void(A0)>(this, mbed::callback(obj, method));
02731 }
02732 
02733 template <typename T, typename R, typename A0>
02734 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(A0) const) {
02735     return Event<void(A0)>(this, mbed::callback(obj, method));
02736 }
02737 
02738 template <typename T, typename R, typename A0>
02739 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(A0) volatile) {
02740     return Event<void(A0)>(this, mbed::callback(obj, method));
02741 }
02742 
02743 template <typename T, typename R, typename A0>
02744 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(A0) const volatile) {
02745     return Event<void(A0)>(this, mbed::callback(obj, method));
02746 }
02747 
02748 template <typename R, typename A0>
02749 Event<void(A0)> EventQueue::event(mbed::Callback<R(A0)> cb) {
02750     return Event<void(A0)>(this, cb);
02751 }
02752 
02753 template <typename R, typename B0, typename C0, typename A0>
02754 Event<void(A0)> EventQueue::event(R (*func)(B0, A0), C0 c0) {
02755     return Event<void(A0)>(this, func, c0);
02756 }
02757 
02758 template <typename T, typename R, typename B0, typename C0, typename A0>
02759 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, A0), C0 c0) {
02760     return Event<void(A0)>(this, mbed::callback(obj, method), c0);
02761 }
02762 
02763 template <typename T, typename R, typename B0, typename C0, typename A0>
02764 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(B0, A0) const, C0 c0) {
02765     return Event<void(A0)>(this, mbed::callback(obj, method), c0);
02766 }
02767 
02768 template <typename T, typename R, typename B0, typename C0, typename A0>
02769 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0) volatile, C0 c0) {
02770     return Event<void(A0)>(this, mbed::callback(obj, method), c0);
02771 }
02772 
02773 template <typename T, typename R, typename B0, typename C0, typename A0>
02774 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0) const volatile, C0 c0) {
02775     return Event<void(A0)>(this, mbed::callback(obj, method), c0);
02776 }
02777 
02778 template <typename R, typename B0, typename C0, typename A0>
02779 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, A0)> cb, C0 c0) {
02780     return Event<void(A0)>(this, cb, c0);
02781 }
02782 
02783 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
02784 Event<void(A0)> EventQueue::event(R (*func)(B0, B1, A0), C0 c0, C1 c1) {
02785     return Event<void(A0)>(this, func, c0, c1);
02786 }
02787 
02788 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
02789 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0), C0 c0, C1 c1) {
02790     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1);
02791 }
02792 
02793 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
02794 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, A0) const, C0 c0, C1 c1) {
02795     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1);
02796 }
02797 
02798 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
02799 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, A0) volatile, C0 c0, C1 c1) {
02800     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1);
02801 }
02802 
02803 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
02804 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, A0) const volatile, C0 c0, C1 c1) {
02805     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1);
02806 }
02807 
02808 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0>
02809 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, B1, A0)> cb, C0 c0, C1 c1) {
02810     return Event<void(A0)>(this, cb, c0, c1);
02811 }
02812 
02813 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
02814 Event<void(A0)> EventQueue::event(R (*func)(B0, B1, B2, A0), C0 c0, C1 c1, C2 c2) {
02815     return Event<void(A0)>(this, func, c0, c1, c2);
02816 }
02817 
02818 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
02819 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, A0), C0 c0, C1 c1, C2 c2) {
02820     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2);
02821 }
02822 
02823 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
02824 Event<void(A0)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, A0) const, C0 c0, C1 c1, C2 c2) {
02825     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2);
02826 }
02827 
02828 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
02829 Event<void(A0)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, A0) volatile, C0 c0, C1 c1, C2 c2) {
02830     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2);
02831 }
02832 
02833 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
02834 Event<void(A0)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, B2, A0) const volatile, C0 c0, C1 c1, C2 c2) {
02835     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2);
02836 }
02837 
02838 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0>
02839 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, B1, B2, A0)> cb, C0 c0, C1 c1, C2 c2) {
02840     return Event<void(A0)>(this, cb, c0, c1, c2);
02841 }
02842 
02843 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
02844 Event<void(A0)> EventQueue::event(R (*func)(B0, B1, B2, B3, A0), C0 c0, C1 c1, C2 c2, C3 c3) {
02845     return Event<void(A0)>(this, func, c0, c1, c2, c3);
02846 }
02847 
02848 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
02849 Event<void(A0)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, B3, A0), C0 c0, C1 c1, C2 c2, C3 c3) {
02850     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
02851 }
02852 
02853 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
02854 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) {
02855     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
02856 }
02857 
02858 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
02859 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) {
02860     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
02861 }
02862 
02863 template <typename T, typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
02864 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) {
02865     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
02866 }
02867 
02868 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0>
02869 Event<void(A0)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, A0)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
02870     return Event<void(A0)>(this, cb, c0, c1, c2, c3);
02871 }
02872 
02873 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>
02874 Event<void(A0)> EventQueue::event(R (*func)(B0, B1, B2, B3, B4, A0), C0 c0, C1 c1, C2 c2, C3 c3, C4 c4) {
02875     return Event<void(A0)>(this, func, c0, c1, c2, c3, c4);
02876 }
02877 
02878 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>
02879 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) {
02880     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
02881 }
02882 
02883 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>
02884 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) {
02885     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
02886 }
02887 
02888 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>
02889 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) {
02890     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
02891 }
02892 
02893 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>
02894 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) {
02895     return Event<void(A0)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
02896 }
02897 
02898 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>
02899 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) {
02900     return Event<void(A0)>(this, cb, c0, c1, c2, c3, c4);
02901 }
02902 
02903 template <typename R, typename A0, typename A1>
02904 Event<void(A0, A1)> EventQueue::event(R (*func)(A0, A1)) {
02905     return Event<void(A0, A1)>(this, func);
02906 }
02907 
02908 template <typename T, typename R, typename A0, typename A1>
02909 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(A0, A1)) {
02910     return Event<void(A0, A1)>(this, mbed::callback(obj, method));
02911 }
02912 
02913 template <typename T, typename R, typename A0, typename A1>
02914 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(A0, A1) const) {
02915     return Event<void(A0, A1)>(this, mbed::callback(obj, method));
02916 }
02917 
02918 template <typename T, typename R, typename A0, typename A1>
02919 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(A0, A1) volatile) {
02920     return Event<void(A0, A1)>(this, mbed::callback(obj, method));
02921 }
02922 
02923 template <typename T, typename R, typename A0, typename A1>
02924 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(A0, A1) const volatile) {
02925     return Event<void(A0, A1)>(this, mbed::callback(obj, method));
02926 }
02927 
02928 template <typename R, typename A0, typename A1>
02929 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(A0, A1)> cb) {
02930     return Event<void(A0, A1)>(this, cb);
02931 }
02932 
02933 template <typename R, typename B0, typename C0, typename A0, typename A1>
02934 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, A0, A1), C0 c0) {
02935     return Event<void(A0, A1)>(this, func, c0);
02936 }
02937 
02938 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1>
02939 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(B0, A0, A1), C0 c0) {
02940     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0);
02941 }
02942 
02943 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1>
02944 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(B0, A0, A1) const, C0 c0) {
02945     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0);
02946 }
02947 
02948 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1>
02949 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0, A1) volatile, C0 c0) {
02950     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0);
02951 }
02952 
02953 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1>
02954 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0, A1) const volatile, C0 c0) {
02955     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0);
02956 }
02957 
02958 template <typename R, typename B0, typename C0, typename A0, typename A1>
02959 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, A0, A1)> cb, C0 c0) {
02960     return Event<void(A0, A1)>(this, cb, c0);
02961 }
02962 
02963 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
02964 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, B1, A0, A1), C0 c0, C1 c1) {
02965     return Event<void(A0, A1)>(this, func, c0, c1);
02966 }
02967 
02968 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
02969 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0, A1), C0 c0, C1 c1) {
02970     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1);
02971 }
02972 
02973 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
02974 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, A0, A1) const, C0 c0, C1 c1) {
02975     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1);
02976 }
02977 
02978 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
02979 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, A0, A1) volatile, C0 c0, C1 c1) {
02980     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1);
02981 }
02982 
02983 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
02984 Event<void(A0, A1)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, B1, A0, A1) const volatile, C0 c0, C1 c1) {
02985     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1);
02986 }
02987 
02988 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1>
02989 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, B1, A0, A1)> cb, C0 c0, C1 c1) {
02990     return Event<void(A0, A1)>(this, cb, c0, c1);
02991 }
02992 
02993 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
02994 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, B1, B2, A0, A1), C0 c0, C1 c1, C2 c2) {
02995     return Event<void(A0, A1)>(this, func, c0, c1, c2);
02996 }
02997 
02998 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
02999 Event<void(A0, A1)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, A0, A1), C0 c0, C1 c1, C2 c2) {
03000     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2);
03001 }
03002 
03003 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
03004 Event<void(A0, A1)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, B2, A0, A1) const, C0 c0, C1 c1, C2 c2) {
03005     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2);
03006 }
03007 
03008 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
03009 Event<void(A0, A1)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, B2, A0, A1) volatile, C0 c0, C1 c1, C2 c2) {
03010     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2);
03011 }
03012 
03013 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
03014 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) {
03015     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2);
03016 }
03017 
03018 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1>
03019 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, B1, B2, A0, A1)> cb, C0 c0, C1 c1, C2 c2) {
03020     return Event<void(A0, A1)>(this, cb, c0, c1, c2);
03021 }
03022 
03023 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
03024 Event<void(A0, A1)> EventQueue::event(R (*func)(B0, B1, B2, B3, A0, A1), C0 c0, C1 c1, C2 c2, C3 c3) {
03025     return Event<void(A0, A1)>(this, func, c0, c1, c2, c3);
03026 }
03027 
03028 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>
03029 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) {
03030     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03031 }
03032 
03033 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>
03034 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) {
03035     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03036 }
03037 
03038 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>
03039 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) {
03040     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03041 }
03042 
03043 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>
03044 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) {
03045     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03046 }
03047 
03048 template <typename R, typename B0, typename B1, typename B2, typename B3, typename C0, typename C1, typename C2, typename C3, typename A0, typename A1>
03049 Event<void(A0, A1)> EventQueue::event(mbed::Callback<R(B0, B1, B2, B3, A0, A1)> cb, C0 c0, C1 c1, C2 c2, C3 c3) {
03050     return Event<void(A0, A1)>(this, cb, c0, c1, c2, c3);
03051 }
03052 
03053 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>
03054 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) {
03055     return Event<void(A0, A1)>(this, func, c0, c1, c2, c3, c4);
03056 }
03057 
03058 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>
03059 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) {
03060     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03061 }
03062 
03063 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>
03064 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) {
03065     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03066 }
03067 
03068 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>
03069 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) {
03070     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03071 }
03072 
03073 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>
03074 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) {
03075     return Event<void(A0, A1)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03076 }
03077 
03078 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>
03079 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) {
03080     return Event<void(A0, A1)>(this, cb, c0, c1, c2, c3, c4);
03081 }
03082 
03083 template <typename R, typename A0, typename A1, typename A2>
03084 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(A0, A1, A2)) {
03085     return Event<void(A0, A1, A2)>(this, func);
03086 }
03087 
03088 template <typename T, typename R, typename A0, typename A1, typename A2>
03089 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(A0, A1, A2)) {
03090     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method));
03091 }
03092 
03093 template <typename T, typename R, typename A0, typename A1, typename A2>
03094 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(A0, A1, A2) const) {
03095     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method));
03096 }
03097 
03098 template <typename T, typename R, typename A0, typename A1, typename A2>
03099 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(A0, A1, A2) volatile) {
03100     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method));
03101 }
03102 
03103 template <typename T, typename R, typename A0, typename A1, typename A2>
03104 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(A0, A1, A2) const volatile) {
03105     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method));
03106 }
03107 
03108 template <typename R, typename A0, typename A1, typename A2>
03109 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(A0, A1, A2)> cb) {
03110     return Event<void(A0, A1, A2)>(this, cb);
03111 }
03112 
03113 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
03114 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, A0, A1, A2), C0 c0) {
03115     return Event<void(A0, A1, A2)>(this, func, c0);
03116 }
03117 
03118 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
03119 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(B0, A0, A1, A2), C0 c0) {
03120     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0);
03121 }
03122 
03123 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
03124 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(B0, A0, A1, A2) const, C0 c0) {
03125     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0);
03126 }
03127 
03128 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
03129 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0, A1, A2) volatile, C0 c0) {
03130     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0);
03131 }
03132 
03133 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
03134 Event<void(A0, A1, A2)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0, A1, A2) const volatile, C0 c0) {
03135     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0);
03136 }
03137 
03138 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2>
03139 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(B0, A0, A1, A2)> cb, C0 c0) {
03140     return Event<void(A0, A1, A2)>(this, cb, c0);
03141 }
03142 
03143 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
03144 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, B1, A0, A1, A2), C0 c0, C1 c1) {
03145     return Event<void(A0, A1, A2)>(this, func, c0, c1);
03146 }
03147 
03148 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
03149 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0, A1, A2), C0 c0, C1 c1) {
03150     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1);
03151 }
03152 
03153 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
03154 Event<void(A0, A1, A2)> EventQueue::event(const T *obj, R (T::*method)(B0, B1, A0, A1, A2) const, C0 c0, C1 c1) {
03155     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1);
03156 }
03157 
03158 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
03159 Event<void(A0, A1, A2)> EventQueue::event(volatile T *obj, R (T::*method)(B0, B1, A0, A1, A2) volatile, C0 c0, C1 c1) {
03160     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1);
03161 }
03162 
03163 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
03164 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) {
03165     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1);
03166 }
03167 
03168 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2>
03169 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(B0, B1, A0, A1, A2)> cb, C0 c0, C1 c1) {
03170     return Event<void(A0, A1, A2)>(this, cb, c0, c1);
03171 }
03172 
03173 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
03174 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, B1, B2, A0, A1, A2), C0 c0, C1 c1, C2 c2) {
03175     return Event<void(A0, A1, A2)>(this, func, c0, c1, c2);
03176 }
03177 
03178 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
03179 Event<void(A0, A1, A2)> EventQueue::event(T *obj, R (T::*method)(B0, B1, B2, A0, A1, A2), C0 c0, C1 c1, C2 c2) {
03180     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2);
03181 }
03182 
03183 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
03184 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) {
03185     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2);
03186 }
03187 
03188 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
03189 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) {
03190     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2);
03191 }
03192 
03193 template <typename T, typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
03194 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) {
03195     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2);
03196 }
03197 
03198 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2>
03199 Event<void(A0, A1, A2)> EventQueue::event(mbed::Callback<R(B0, B1, B2, A0, A1, A2)> cb, C0 c0, C1 c1, C2 c2) {
03200     return Event<void(A0, A1, A2)>(this, cb, c0, c1, c2);
03201 }
03202 
03203 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>
03204 Event<void(A0, A1, A2)> EventQueue::event(R (*func)(B0, B1, B2, B3, A0, A1, A2), C0 c0, C1 c1, C2 c2, C3 c3) {
03205     return Event<void(A0, A1, A2)>(this, func, c0, c1, c2, c3);
03206 }
03207 
03208 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>
03209 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) {
03210     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03211 }
03212 
03213 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>
03214 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) {
03215     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03216 }
03217 
03218 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>
03219 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) {
03220     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03221 }
03222 
03223 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>
03224 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) {
03225     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03226 }
03227 
03228 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>
03229 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) {
03230     return Event<void(A0, A1, A2)>(this, cb, c0, c1, c2, c3);
03231 }
03232 
03233 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>
03234 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) {
03235     return Event<void(A0, A1, A2)>(this, func, c0, c1, c2, c3, c4);
03236 }
03237 
03238 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>
03239 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) {
03240     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03241 }
03242 
03243 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>
03244 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) {
03245     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03246 }
03247 
03248 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>
03249 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) {
03250     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03251 }
03252 
03253 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>
03254 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) {
03255     return Event<void(A0, A1, A2)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03256 }
03257 
03258 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>
03259 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) {
03260     return Event<void(A0, A1, A2)>(this, cb, c0, c1, c2, c3, c4);
03261 }
03262 
03263 template <typename R, typename A0, typename A1, typename A2, typename A3>
03264 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(A0, A1, A2, A3)) {
03265     return Event<void(A0, A1, A2, A3)>(this, func);
03266 }
03267 
03268 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
03269 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(A0, A1, A2, A3)) {
03270     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method));
03271 }
03272 
03273 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
03274 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(A0, A1, A2, A3) const) {
03275     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method));
03276 }
03277 
03278 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
03279 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(A0, A1, A2, A3) volatile) {
03280     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method));
03281 }
03282 
03283 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3>
03284 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(A0, A1, A2, A3) const volatile) {
03285     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method));
03286 }
03287 
03288 template <typename R, typename A0, typename A1, typename A2, typename A3>
03289 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(A0, A1, A2, A3)> cb) {
03290     return Event<void(A0, A1, A2, A3)>(this, cb);
03291 }
03292 
03293 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
03294 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(B0, A0, A1, A2, A3), C0 c0) {
03295     return Event<void(A0, A1, A2, A3)>(this, func, c0);
03296 }
03297 
03298 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
03299 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(B0, A0, A1, A2, A3), C0 c0) {
03300     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0);
03301 }
03302 
03303 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
03304 Event<void(A0, A1, A2, A3)> EventQueue::event(const T *obj, R (T::*method)(B0, A0, A1, A2, A3) const, C0 c0) {
03305     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0);
03306 }
03307 
03308 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
03309 Event<void(A0, A1, A2, A3)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3) volatile, C0 c0) {
03310     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0);
03311 }
03312 
03313 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
03314 Event<void(A0, A1, A2, A3)> EventQueue::event(const volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3) const volatile, C0 c0) {
03315     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0);
03316 }
03317 
03318 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3>
03319 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(B0, A0, A1, A2, A3)> cb, C0 c0) {
03320     return Event<void(A0, A1, A2, A3)>(this, cb, c0);
03321 }
03322 
03323 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
03324 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(B0, B1, A0, A1, A2, A3), C0 c0, C1 c1) {
03325     return Event<void(A0, A1, A2, A3)>(this, func, c0, c1);
03326 }
03327 
03328 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
03329 Event<void(A0, A1, A2, A3)> EventQueue::event(T *obj, R (T::*method)(B0, B1, A0, A1, A2, A3), C0 c0, C1 c1) {
03330     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1);
03331 }
03332 
03333 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
03334 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) {
03335     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1);
03336 }
03337 
03338 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
03339 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) {
03340     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1);
03341 }
03342 
03343 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
03344 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) {
03345     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1);
03346 }
03347 
03348 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3>
03349 Event<void(A0, A1, A2, A3)> EventQueue::event(mbed::Callback<R(B0, B1, A0, A1, A2, A3)> cb, C0 c0, C1 c1) {
03350     return Event<void(A0, A1, A2, A3)>(this, cb, c0, c1);
03351 }
03352 
03353 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
03354 Event<void(A0, A1, A2, A3)> EventQueue::event(R (*func)(B0, B1, B2, A0, A1, A2, A3), C0 c0, C1 c1, C2 c2) {
03355     return Event<void(A0, A1, A2, A3)>(this, func, c0, c1, c2);
03356 }
03357 
03358 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>
03359 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) {
03360     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2);
03361 }
03362 
03363 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>
03364 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) {
03365     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2);
03366 }
03367 
03368 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>
03369 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) {
03370     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2);
03371 }
03372 
03373 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>
03374 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) {
03375     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2);
03376 }
03377 
03378 template <typename R, typename B0, typename B1, typename B2, typename C0, typename C1, typename C2, typename A0, typename A1, typename A2, typename A3>
03379 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) {
03380     return Event<void(A0, A1, A2, A3)>(this, cb, c0, c1, c2);
03381 }
03382 
03383 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>
03384 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) {
03385     return Event<void(A0, A1, A2, A3)>(this, func, c0, c1, c2, c3);
03386 }
03387 
03388 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>
03389 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) {
03390     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03391 }
03392 
03393 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>
03394 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) {
03395     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03396 }
03397 
03398 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>
03399 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) {
03400     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03401 }
03402 
03403 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>
03404 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) {
03405     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03406 }
03407 
03408 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>
03409 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) {
03410     return Event<void(A0, A1, A2, A3)>(this, cb, c0, c1, c2, c3);
03411 }
03412 
03413 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>
03414 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) {
03415     return Event<void(A0, A1, A2, A3)>(this, func, c0, c1, c2, c3, c4);
03416 }
03417 
03418 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>
03419 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) {
03420     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03421 }
03422 
03423 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>
03424 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) {
03425     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03426 }
03427 
03428 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>
03429 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) {
03430     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03431 }
03432 
03433 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>
03434 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) {
03435     return Event<void(A0, A1, A2, A3)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03436 }
03437 
03438 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>
03439 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) {
03440     return Event<void(A0, A1, A2, A3)>(this, cb, c0, c1, c2, c3, c4);
03441 }
03442 
03443 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
03444 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(A0, A1, A2, A3, A4)) {
03445     return Event<void(A0, A1, A2, A3, A4)>(this, func);
03446 }
03447 
03448 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
03449 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(A0, A1, A2, A3, A4)) {
03450     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method));
03451 }
03452 
03453 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
03454 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(A0, A1, A2, A3, A4) const) {
03455     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method));
03456 }
03457 
03458 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
03459 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(A0, A1, A2, A3, A4) volatile) {
03460     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method));
03461 }
03462 
03463 template <typename T, typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
03464 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const volatile T *obj, R (T::*method)(A0, A1, A2, A3, A4) const volatile) {
03465     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method));
03466 }
03467 
03468 template <typename R, typename A0, typename A1, typename A2, typename A3, typename A4>
03469 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(A0, A1, A2, A3, A4)> cb) {
03470     return Event<void(A0, A1, A2, A3, A4)>(this, cb);
03471 }
03472 
03473 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
03474 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(B0, A0, A1, A2, A3, A4), C0 c0) {
03475     return Event<void(A0, A1, A2, A3, A4)>(this, func, c0);
03476 }
03477 
03478 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
03479 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4), C0 c0) {
03480     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0);
03481 }
03482 
03483 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
03484 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(const T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) const, C0 c0) {
03485     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0);
03486 }
03487 
03488 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
03489 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(volatile T *obj, R (T::*method)(B0, A0, A1, A2, A3, A4) volatile, C0 c0) {
03490     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0);
03491 }
03492 
03493 template <typename T, typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
03494 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) {
03495     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0);
03496 }
03497 
03498 template <typename R, typename B0, typename C0, typename A0, typename A1, typename A2, typename A3, typename A4>
03499 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(B0, A0, A1, A2, A3, A4)> cb, C0 c0) {
03500     return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0);
03501 }
03502 
03503 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
03504 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(R (*func)(B0, B1, A0, A1, A2, A3, A4), C0 c0, C1 c1) {
03505     return Event<void(A0, A1, A2, A3, A4)>(this, func, c0, c1);
03506 }
03507 
03508 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
03509 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) {
03510     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1);
03511 }
03512 
03513 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
03514 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) {
03515     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1);
03516 }
03517 
03518 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
03519 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) {
03520     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1);
03521 }
03522 
03523 template <typename T, typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
03524 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) {
03525     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1);
03526 }
03527 
03528 template <typename R, typename B0, typename B1, typename C0, typename C1, typename A0, typename A1, typename A2, typename A3, typename A4>
03529 Event<void(A0, A1, A2, A3, A4)> EventQueue::event(mbed::Callback<R(B0, B1, A0, A1, A2, A3, A4)> cb, C0 c0, C1 c1) {
03530     return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0, c1);
03531 }
03532 
03533 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>
03534 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) {
03535     return Event<void(A0, A1, A2, A3, A4)>(this, func, c0, c1, c2);
03536 }
03537 
03538 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>
03539 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) {
03540     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2);
03541 }
03542 
03543 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>
03544 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) {
03545     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2);
03546 }
03547 
03548 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>
03549 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) {
03550     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2);
03551 }
03552 
03553 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>
03554 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) {
03555     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2);
03556 }
03557 
03558 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>
03559 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) {
03560     return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0, c1, c2);
03561 }
03562 
03563 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>
03564 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) {
03565     return Event<void(A0, A1, A2, A3, A4)>(this, func, c0, c1, c2, c3);
03566 }
03567 
03568 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>
03569 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) {
03570     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03571 }
03572 
03573 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>
03574 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) {
03575     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03576 }
03577 
03578 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>
03579 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) {
03580     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03581 }
03582 
03583 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>
03584 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) {
03585     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3);
03586 }
03587 
03588 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>
03589 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) {
03590     return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0, c1, c2, c3);
03591 }
03592 
03593 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>
03594 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) {
03595     return Event<void(A0, A1, A2, A3, A4)>(this, func, c0, c1, c2, c3, c4);
03596 }
03597 
03598 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>
03599 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) {
03600     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03601 }
03602 
03603 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>
03604 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) {
03605     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03606 }
03607 
03608 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>
03609 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) {
03610     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03611 }
03612 
03613 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>
03614 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) {
03615     return Event<void(A0, A1, A2, A3, A4)>(this, mbed::callback(obj, method), c0, c1, c2, c3, c4);
03616 }
03617 
03618 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>
03619 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) {
03620     return Event<void(A0, A1, A2, A3, A4)>(this, cb, c0, c1, c2, c3, c4);
03621 }
03622 
03623 }
03624 
03625 #endif
03626 
03627 /** @}*/