- Notifications
You must be signed in to change notification settings - Fork25
Home
afsm is a finite state machine C++11 library designed for usage in multithreaded asynchronous environment.
Theafsm library was inspired by::boost::msm library and implemented so that the migration from::boost::msm was a bunch of search and replace operations. The main motivation was to create a thread-safe FSM library and to achieve decent compile times for large and complex state machines not sacrificing performance. A state machine defined withafms library compiles several times faster than same library defined with::boost::msm and has similar (or better) performance. You can find some benchmark resultshere.
- Statechart features
- Hierarchical states
- Entry and exit actions
- Internal transitions
- Transition actions
- Transition guards (conditions)
- State history
- Event deferring
- Orthogonal regions
- Statechart extensions
- Optionalevent priority
- Optionalcommon base for states and easy definition of dispatching common interface calls to current state
- Pushdown automaton
- Compile-time checks
- Thread safety
- Exception safety
- No vtables (unless common base feature is used)
- Header only
- Relatively fast compile time
- No external dependencies except STL
- State machine persistense
Here is a UML diagram of a trivial state machine and source code that it is mapped to.
#include<afsm/fsm.hpp>// Eventsstructstart {};structstop {};// State machine definitionstructminimal_def : ::afsm::def::state_machine<minimal_def> {//@{/** @name States*/structinitial : state<initial> {};structrunning : state<running> {};structterminated : terminal_state<terminated> {};//@}using initial_state = initial;using transitions = transition_table</* State Event Next*/ tr< initial, start, running >, tr< running, stop, terminated > >;};// State machine objectusing minimal = ::afsm::state_machine<minimal_def>;voiduse(){ mimimal fsm; fsm.process_event(start{}); fsm.process_event(stop{});}
You can find a tutorial covering most of basic featureshere.
TODO doxygen generated documentation.
The library is header only and doesn't requre build or installation. Just add theafsm/include andlib/meta/include directories under the root of this repository to your include paths.
You can add the library to your project as a subtree, e.g.lib/afsm, and in your rootCMakeLists.txt file just do the following:
add_subdirectory(lib/afsm)include_directories(${AFSM_INCLUDE_DIRS})
TODO write docs on gitrc subtree commands and link to the repository
git clone git@github.com:zmij/afsm.gitmkdir afsm/buildcd afsm/buildcmake ..sudo make installfind_package(AFSM REQUIRED)# Will set AFSM_INCLUDE_DIRS variable
The project is mostly developed as a part of other projects (pg_async, PostgreSQL asynchronous driver,wire, an RPC library for C++) which are in turn developed as a part of a bigger commercial project.
- Home
- Tutorial
- Concepts
- State Hierarchy
- Entry/Exit Actions
- Transition Actions
- Transition Guards
- Internal Transitions
- Default Transitions
- Event Deferring
- History
- Orthogonal Regions
- Event Priority
- Common Base
- Thread Safety
- Exception Safety Guarantees
- Under the Hood
- Event Processing
- Performance