/** * @description * Performs the first step of active object initialization by assigning * the virtual pointer and calling the superclass constructor. * * @param[in,out] me pointer (see @ref oop) * @param[in] initial pointer to the event to be dispatched to the MSM * * @note Must be called only ONCE before QMSM_INIT(). * * @sa QHsm_ctor() and QFsm_ctor() */ void QMActive_ctor(QMActive * const me, QStateHandler initial) { static QMActiveVtbl const vtbl = { /* QMActive virtual table */ { &QMsm_init_, &QMsm_dispatch_ }, &QActive_start_, &QActive_post_, &QActive_postLIFO_ }; /* clear the whole QActive object, so that the framework can start * correctly even if the startup code fails to clear the uninitialized * data (as is required by the C Standard). */ QF_bzero(me, (uint_fast16_t)sizeof(*me)); /** * @note QMActive inherits QActive, so by the @ref oop convention * it should call the constructor of the superclass, i.e., QActive_ctor(). * However, this would pull in the QActiveVtbl, which in turn will pull * in the code for QHsm_init_() and QHsm_dispatch_() implemetations, * which is expensive. To avoid this code size penalty, in case QHsm is * not used in a given project, the call to QMsm_ctor() avoids pulling * in the code for QHsm. */ QMsm_ctor(&me->super, initial); me->super.vptr = &vtbl.super; /* hook vptr to QMActive virtual table */ }
/** * @description * Performs the first step of active object initialization by assigning * the virtual pointer and calling the superclass constructor. * * @param[in,out] me pointer (see @ref oop) * @param[in] initial pointer to the event to be dispatched to the MSM * * @note Must be called only __once__ before QMSM_INIT(). * @sa QMsm_ctor() and QHsm_ctor() */ void QActive_ctor(QActive * const me, QStateHandler initial) { static QActiveVtbl const vtbl = { /* QActive virtual table */ { &QHsm_init_, &QHsm_dispatch_ }, &QActive_start_, &QActive_post_, &QActive_postLIFO_ }; /* clear the whole QActive object, so that the framework can start * correctly even if the startup code fails to clear the uninitialized * data (as is required by the C Standard). */ QF_bzero(me, (uint_fast16_t)sizeof(*me)); QHsm_ctor(&me->super, initial); /* explicitly call superclass' ctor */ me->super.vptr = &vtbl.super; /* hook the vptr to QActive virtual table */ }