After trying a few SFM libraries I found they're just too much for what I need, so here's the start of a simple one I can use.
This commit is contained in:
parent
356314406f
commit
b9025be45b
2 changed files with 68 additions and 3 deletions
62
fsmtest.cpp
Normal file
62
fsmtest.cpp
Normal file
|
@ -0,0 +1,62 @@
|
|||
#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);
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue