#pragma once #include #ifndef FSM_DEBUG #define FSM_STATE(C, S, E, ...) case C::S: S(E, ##__VA_ARGS__); break #else #define FSM_STATE(C, S, E, ...) case C::S: fmt::println(">> " #C " " #S " event={}, state={}", int(E), int(_state)); S(E, ##__VA_ARGS__); fmt::println("<< " #C " state={}", int(_state)); break #endif template class DeadSimpleFSM { protected: // BUG: don't put this in your class because state() won't work S $state = S::START; public: template void event(E event, Types... args); void state(S next_state) { $state = next_state; } bool in_state(S state) { return $state == state; } };