You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
63 lines
871 B
63 lines
871 B
4 weeks ago
|
#include <fmt/core.h>
|
||
|
|
||
|
using namespace fmt;
|
||
|
|
||
|
template<typename S, typename E>
|
||
|
class DeadSimpleFSM {
|
||
|
protected:
|
||
|
S _state = S::START;
|
||
|
|
||
|
public:
|
||
|
virtual void event(E event) = 0;
|
||
|
|
||
|
void state(S next_state) {
|
||
|
_state = next_state;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
#define T(S, F) case S: F(); break
|
||
|
|
||
|
enum MyState {
|
||
|
START, RUNNING, END
|
||
|
};
|
||
|
|
||
|
enum MyEvent {
|
||
|
STARTED, PUSH, QUIT
|
||
|
};
|
||
|
|
||
|
class MyFSM : DeadSimpleFSM<MyState, MyEvent> {
|
||
|
public:
|
||
|
void event(MyEvent ev) override {
|
||
|
switch(ev) {
|
||
|
T(STARTED, start);
|
||
|
T(PUSH, push);
|
||
|
T(QUIT, stop);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void start() {
|
||
|
println("<<< START");
|
||
|
state(RUNNING);
|
||
|
}
|
||
|
|
||
|
void push() {
|
||
|
println("<<< RUN");
|
||
|
state(RUNNING);
|
||
|
}
|
||
|
|
||
|
void quit() {
|
||
|
println("<<< STOP");
|
||
|
state(END);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
int main() {
|
||
|
MyFSM fsm;
|
||
|
|
||
|
fsm.event(STARTED);
|
||
|
fsm.event(PUSH);
|
||
|
fsm.event(PUSH);
|
||
|
fsm.event(PUSH);
|
||
|
fsm.event(QUIT);
|
||
|
}
|