#pragma once #include #define FSM_EV(S, F) case S: F(); break #define FSM_STATE(S, F, E) case S: F(E); break #define FSM_STATE_LOG(C, S, F, E) case C::S: fmt::println(">> " #C " " #S ":" #F " event={}, state={}", int(E), int(_state)); F(E); fmt::println("<< " #C " state={}", int(_state)); break template class DeadSimpleFSM { protected: // BUG: don't put this in your class because state() won't work S _state = S::START; public: virtual void event(E event) = 0; void state(S next_state) { // fmt::println("STATE {}->{}", int(_state), int(next_state)); _state = next_state; } bool in_state(S state) { return _state == state; } };