// // Copyright (c) 2016-2020 Kris Jusiak (kris at jusiak dot net) // // Distributed under the Boost Software License, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) // #include #include #include namespace sml = boost::sml; struct e1 {}; struct e2 {}; struct e3 {}; struct e4 {}; struct e5 {}; struct sub { auto operator()() const { using namespace sml; // clang-format off return make_transition_table( *"idle"_s + event = "sub1"_s , "sub1"_s + event = X ); // clang-format on } }; struct composite { auto operator()() const { using namespace sml; // clang-format off return make_transition_table( *"idle"_s + event = "s1"_s , "s1"_s + event = state , state + event = X ); // clang-format on } }; template class state_name_visitor { public: explicit state_name_visitor(const TSM& sm) : sm_{sm} {} template void operator()(boost::sml::aux::string>) const { std::cout << boost::sml::aux::get_type_name() << ':'; sm_.template visit_current_states>(*this); } template void operator()(TState state) const { std::cout << state.c_str() << '\n'; } private: const TSM& sm_; }; int main() { sml::sm sm{}; const auto state_name = state_name_visitor{sm}; sm.process_event(e1{}); sm.visit_current_states(state_name); // s1 sm.process_event(e2{}); sm.visit_current_states(state_name); // sub:idle sm.process_event(e3{}); sm.visit_current_states(state_name); // sub:sub1 sm.process_event(e4{}); sm.visit_current_states(state_name); // sub:terminate sm.process_event(e5{}); sm.visit_current_states(state_name); // terminate }