transitional [concept]

Header

#include <boost/sml.hpp> 

Description

Requirements for transition.

Synopsis

template <class T> concept bool transitional() { return requires(T transition) { typename T::src_state; typename T::dst_state; typename T::event; typename T::deps; T::initial; T::history; { transition.execute() } -> bool; } }; 

Semantics

transitional<T> 

Example

using namespace sml; { auto transition = ("idle"_s = X); // Postfix Notation static_assert(transitional<decltype(transition)>::value); } { auto transition = (X <= "idle"_s); // Prefix Notation static_assert(transitional<decltype(transition)>::value); } 

CPP(BTN)

 


configurable [concept]

Header

#include <boost/sml.hpp> 

Description

Requirements for the state machine.

Synopsis

template <class SM> concept bool configurable() { return requires(SM sm) { { sm.operator()() }; } }; 

Semantics

configurable<SM> 

Example

class example { auto operator()() const noexcept { return make_transition_table(); } }; static_assert(configurable<example>::value); 

CPP(BTN)

 


callable [concept]

Header

#include <boost/sml.hpp> 

Description

Requirements for action and guards.

Synopsis

template <class TResult, class T> concept bool callable() { return requires(T object) { { object(...) } -> TResult; } } 

Semantics

callable<SM> 

Example

auto guard = [] { return true; }; auto action = [] { }; static_assert(callable<bool, decltype(guard)>::value); static_assert(callable<void, decltype(action)>::value); 

CPP(BTN)

 


dispatchable [concept]

Header

#include <boost/sml.hpp> 

Description

Requirements for the dispatch table.

Synopsis

template <class TDynamicEvent, TEvent> concept bool dispatchable() { return requires(T) { typename TEvent::id; { TEvent(declval<TDynamicEvent>()) }; } }; 

Semantics

dispatchable<SM> 

Example

struct runtime_event { }; struct event1 { static constexpr auto id = 1; }; struct event2 { static constexpr auto id = 2; explicit event2(const runtime_event&) {} }; static_assert(dispatchable<runtime_event, event1>::value); static_assert(dispatchable<runtime_event, event2>::value); 

CPP(BTN) CPP(BTN)

 


state [core]

Header

#include <boost/sml.hpp> 

Description

Represents a state machine state.

Synopsis

template<class TState> // no requirements, TState may be a state machine class state { public: initial operator*() const noexcept; // no requirements template <class T> // no requirements auto operator<=(const T &) const noexcept; template <class T> // no requirements auto operator=(const T &) const noexcept; template <class T> // no requirements auto operator+(const T &) const noexcept; template <class T> requires callable<bool, T> auto operator[](const T) const noexcept; template <class T> requires callable<void, T> auto operator/(const T &t) const noexcept; const char* c_str() noexcept; }; template <class T, T... Chrs> state<unspecified> operator""_s() noexcept; // predefined states state<unspecified> X; 

Requirements

Semantics

state<T>{} 

Example

auto idle = state<class idle>; auto idle = "idle"_s; auto initial_state = *idle; auto history_state = idle(H); auto terminate_state = X; 

CPP(BTN) CPP(BTN) CPP(BTN)

 


event [core]

Header

#include <boost/sml.hpp> 

Description

Represents a state machine event.

Synopsis

template<TEvent> // no requirements class event { public: template <class T> requires callable<bool, T> auto operator[](const T &) const noexcept; template <class T> requires callable<void, T> auto operator/(const T &t) const noexcept; }; template<class TEvent> event<TEvent> event{}; // predefined events auto on_entry = event<unspecified>; auto on_exit = event<unspecified>; template<class TEvent> unexpected_event{}; template<class T> exception{}; 

Requirements

Semantics

event<T> 

Example

auto my_int_event = event<int>; 

CPP(BTN) CPP(BTN)

 


make_transition_table [state machine]

Header

#include <boost/sml.hpp> 

Description

Creates a transition table.

Synopsis

template <class... Ts> requires transitional<Ts>... auto make_transition_table(Ts...) noexcept; 

Requirements

Semantics

make_transition_table(transitions...); 

Example

auto transition_table_postfix_notation = make_transition_table( *"idle_s" + event<int> / [] {} = X ); auto transition_table_prefix_notation = make_transition_table( X <= *"idle_s" + event<int> / [] {} ); class example { public: auto operator()() const noexcept { return make_transition_table(); } }; 

CPP(BTN)

 


sm [state machine]

Header

#include <boost/sml.hpp> 

Description

Creates a State Machine.

Synopsis

template<class T> requires configurable<T> class sm { public: using states = unspecified; // unique list of states using events = unspecified; // unique list of events which can be handled by the State Machine using transitions = unspecified; // list of transitions sm(sm &&) = default; sm(const sm &) = delete; sm &operator=(const sm &) = delete; template <class... TDeps> requires is_base_of<TDeps, dependencies>... sm(TDeps&&...) noexcept; template<class TEvent> // no requirements bool process_event(const TEvent&) template <class TVisitor> requires callable<void, TVisitor> void visit_current_states(const TVisitor &) const noexcept(noexcept(visitor(state{}))); template <class TState> bool is(const state<TState> &) const noexcept; template <class... TStates> requires sizeof...(TStates) == number_of_initial_states bool is(const state<TStates> &...) const noexcept; }; 
Expression Requirement Description Returns
TDeps... is_base_of dependencies constructor
process_event<TEvent> - process event TEvent returns true when handled, false otherwise
visit_current_states<TVisitor> callable visit current states -
is<TState> - verify whether any of current states equals TState true when any current state matches TState, false otherwise
is<TStates...> size of TStates... equals number of initial states verify whether all current states match TStates... true when all states match TState..., false otherwise

Semantics

sml::sm<T>{...}; sm.process_event(TEvent{}); sm.visit_current_states([](auto state){}); sm.is(X); sm.is(s1, s2); 

Example

struct my_event {}; class example { public: auto operator()() const noexcept { using namespace sml; return make_transition_table( *"idle"_s + event<my_event> / [](int i) { std::cout << i << std::endl; } = X ); } }; sml::sm<example> sm{42}; assert(sm.is("idle"_s)); sm.process_event(int{}); // no handled, will call unexpected_event<int> sm.process_event(my_event{}); // handled assert(sm.is(X)); sm.visit_current_states([](auto state) { std::cout << state.c_str() << std::endl; }); 

CPP(BTN) CPP(BTN) CPP(BTN)

 


policies [state machine]

Header

#include <boost/sml.hpp> 

Description

Additional State Machine configurations.

Synopsis

thread_safe<Lockable> logger<Loggable> 
Expression Requirement Description Example
Lockable lock/unlock Lockable type std::mutex, std::recursive_mutex
Loggable log_process_event/log_state_change/log_action/log_guard Loggable type -

Example

sml::sm<example, sml::thread_safe<std::recursive_mutex>> sm; // thread safe policy sml::sm<example, sml::logger<my_logger>> sm; // logger policy sml::sm<example, sml::thread_safe<std::recursive_mutex>, sml::logger<my_logger>> sm; // thread safe and logger policy sml::sm<example, sml::logger<my_logger>, sml::thread_safe<std::recursive_mutex>> sm; // thread safe and logger policy 

CPP(BTN)

 


testing::sm [testing]

Header

#include <boost/sml/testing/state_machine.hpp> 

Description

Creates a state machine with testing capabilities.

Synopsis

namespace testing { template <class T> class sm : public sml::sm<T> { public: using sml::sm<T>::sm; template <class... TStates> void set_current_states(const detail::state<TStates> &...) noexcept; }; } 
Expression Requirement Description Returns
set_current_states<TStates...> - set current states

Semantics

sml::testing::sm<T>{...}; sm.set_current_states("s1"_s); 

Example

sml::testing::sm<T>{inject_fake_data...}; sm.set_current_states("s1"_s); sm.process_event(TEvent{}); sm.is(X); 

CPP(BTN)

 


make_dispatch_table [utility]

Header

#include <boost/sml/utility/dispatch_table.hpp> 

Description

Creates a dispatch table to handle runtime events.

Synopsis

namespace utility { template<class TEvent, int EventRangeBegin, int EventRangeBegin, class SM> requires dispatchable<TEvent, typename SM::events> callable<bool, (TEvent, int)> make_dispatch_table(sm<SM>&) noexcept; } 

Requirements

Semantics

sml::utility::make_dispatch_table<T, 0, 10>(sm); 

Example

struct runtime_event { int id = 0; }; struct event1 { static constexpr auto id = 1; event1(const runtime_event &) {} }; auto dispatch_event = sml::utility::make_dispatch_table<runtime_event, 1 /*min*/, 5 /*max*/>(sm); dispatch_event(event, event.id); 

CPP(BTN) CPP(BTN)