/*! \file pistatemachine.h * \ingroup StateMachine * \~\brief * \~english State machine. * \~russian Машина состояний. */ /* PIP - Platform Independent Primitives State machine Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ #ifndef pistatemachine_H #define pistatemachine_H #include "pistatemachine_state.h" #include "pistatemachine_transition.h" //! \ingroup StateMachine //! \~\brief //! \~english //! \~russian class PIP_EXPORT PIStateMachine: public PIStateBase { public: PIStateMachine(const PIString & n = {}); bool start(); template bool postEvent(int event_id, Args... args) { PIVector active_states; gatherActiveStates(active_states); for (auto * s: active_states) { for (auto * t: s->transitions) { if (t->eventID != event_id) continue; if (t->testGuard(args...)) { t->trigger(); return true; } } } return false; } }; #endif