diff --git a/cxx/mcc_finite_state_machine.h b/cxx/mcc_finite_state_machine.h index 4a77eb9..9a2cd9c 100644 --- a/cxx/mcc_finite_state_machine.h +++ b/cxx/mcc_finite_state_machine.h @@ -331,6 +331,11 @@ protected: to->_moveFunc = from->_moveFunc; to->_copyFunc = from->_copyFunc; to->_destroyFunc = from->_destroyFunc; + + to->_stateID = from->_stateID; + to->_eventID = from->_eventID; + + to->_currentStateID = from->_currentStateID; } return *to; @@ -347,6 +352,11 @@ protected: to->_moveFunc = std::move(from->_moveFunc); to->_copyFunc = std::move(from->_copyFunc); to->_destroyFunc = std::move(from->_destroyFunc); + + to->_stateID = std::move(from->_stateID); + to->_eventID = std::move(from->_eventID); + + to->_currentStateID = std::move(from->_currentStateID); } return *to; @@ -354,7 +364,7 @@ protected: public: template - MccFiniteStateMachine(InitStateT) : _currentStateID(InitStateT::ID) + constexpr MccFiniteStateMachine(InitStateT) : _currentStateID(InitStateT::ID) { using states_t = deduce_states_t; auto states = std::make_shared(); @@ -367,18 +377,20 @@ public: }(*states); + // setup dispatch event functions using all_events_t = deduce_events_t; [states, currentState, this](std::index_sequence) { ((_dispatchEventFunc>[this] = - [states, currentState, this](EvT& event) mutable { + [states, currentState, this](EvT& event) { std::lock_guard lock(_transitionMutex); std::visit( [&event, states, currentState, this](curr_state_t*) { using to_state_t = curr_state_t::transition_t::template find_state_by_event_t; + if constexpr (!std::is_void_v) { // exit from current if constexpr (requires(curr_state_t inst) { @@ -478,10 +490,9 @@ public: } template - auto dispatchEvent() + auto dispatchEvent(EvT&& event = EvT()) requires std::default_initializable { - static EvT event; return dispatchEvent(event); } diff --git a/cxx/tests/fsm_test.cpp b/cxx/tests/fsm_test.cpp index 3fde96d..cf140ed 100644 --- a/cxx/tests/fsm_test.cpp +++ b/cxx/tests/fsm_test.cpp @@ -199,6 +199,14 @@ int main() std::cout << "aa = " << aa << "\n"; free(aa); + std::cout << "\nAfter std::move\n"; + auto fsmach1 = std::move(fsmach); + std::cout << "STATES: "; + for (auto& el : fsmach1.stateIDs()) { + std::cout << std::quoted(el) << " "; + } + std::cout << "\n"; + std::cout << "current state: " << std::quoted(fsmach1.currentStateID()) << "\n"; return 0; }