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);
|
||||||
|
}
|
|
@ -11,9 +11,9 @@ opts.add_cmake_defines({
|
||||||
'BUILD_TESTS': false,
|
'BUILD_TESTS': false,
|
||||||
})
|
})
|
||||||
libgit2_proj = cmake.subproject('libgit2', options: opts)
|
libgit2_proj = cmake.subproject('libgit2', options: opts)
|
||||||
libgit2package_dep = libgit2_proj.dependency('libgit2package')
|
libgit2package = libgit2_proj.dependency('libgit2package')
|
||||||
|
|
||||||
efsw_dep = dependency('efsw')
|
efsw = dependency('efsw')
|
||||||
fmt = dependency('fmt')
|
fmt = dependency('fmt')
|
||||||
catch2 = dependency('catch2-with-main')
|
catch2 = dependency('catch2-with-main')
|
||||||
sfml = dependency('sfml')
|
sfml = dependency('sfml')
|
||||||
|
@ -21,7 +21,7 @@ json = dependency('nlohmann_json')
|
||||||
imgui = dependency('imgui-sfml')
|
imgui = dependency('imgui-sfml')
|
||||||
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
fmt, libgit2package_dep, efsw_dep,
|
fmt, libgit2package, efsw,
|
||||||
sfml, imgui, json
|
sfml, imgui, json
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -46,6 +46,9 @@ executable('jsontest', 'jsontest.cpp',
|
||||||
executable('threadtest', 'threadtest.cpp',
|
executable('threadtest', 'threadtest.cpp',
|
||||||
dependencies: dependencies)
|
dependencies: dependencies)
|
||||||
|
|
||||||
|
executable('fsmtest', 'fsmtest.cpp',
|
||||||
|
dependencies: dependencies)
|
||||||
|
|
||||||
executable('badref', 'badref.cpp',
|
executable('badref', 'badref.cpp',
|
||||||
dependencies: dependencies)
|
dependencies: dependencies)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue