#pragma once #include #ifndef FSM_DEBUG #define FSM_STATE(C, S, E, ...) case C::S: S(E, ##__VA_ARGS__); break #else static int last_event=-1; #define FSM_STATE(C, S, E, ...) case C::S: if(last_event != int(E)) { last_event = int(E); fmt::println(">> " #C " " #S " event={}, state={}", int(E), int($state));}; S(E, ##__VA_ARGS__); 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) { #ifdef FSM_DEBUG fmt::println("<< STATE: {} -> {}", int($state), int(next_state)); #endif $state = next_state; } bool in_state(S state) { return $state == state; } };