|
| 1 | +// |
| 2 | +// Copyright (c) 2016-2020 Kris Jusiak (kris at jusiak dot net) |
| 3 | +// |
| 4 | +// Distributed under the Boost Software License, Version 1.0. |
| 5 | +// (See accompanying file LICENSE_1_0.txt or copy at |
| 6 | +// http://www.boost.org/LICENSE_1_0.txt) |
| 7 | +// |
| 8 | +#include <boost/sml.hpp> |
| 9 | +#include <cassert> |
| 10 | +#include <iostream> |
| 11 | + |
| 12 | +namespace sml = boost::sml; |
| 13 | + |
| 14 | +struct e1 {}; |
| 15 | +struct e2 {}; |
| 16 | +struct e3 {}; |
| 17 | +struct e4 {}; |
| 18 | +struct e5 {}; |
| 19 | + |
| 20 | +struct sub { |
| 21 | + auto operator()() const { |
| 22 | + using namespace sml; |
| 23 | + // clang-format off |
| 24 | + return make_transition_table( |
| 25 | + *"idle"_s + event<e3> = "sub1"_s |
| 26 | + , "sub1"_s + event<e4> = X |
| 27 | + ); |
| 28 | + // clang-format on |
| 29 | + } |
| 30 | +}; |
| 31 | + |
| 32 | +struct composite { |
| 33 | + auto operator()() const { |
| 34 | + using namespace sml; |
| 35 | + // clang-format off |
| 36 | + return make_transition_table( |
| 37 | + *"idle"_s + event<e1> = "s1"_s |
| 38 | + , "s1"_s + event<e2> = state<sub> |
| 39 | + , state<sub> + event<e5> = X |
| 40 | + ); |
| 41 | + // clang-format on |
| 42 | + } |
| 43 | +}; |
| 44 | + |
| 45 | +template <class TSM> |
| 46 | +class state_name_visitor { |
| 47 | + public: |
| 48 | + explicit state_name_visitor(const TSM& sm) : sm_{sm} {} |
| 49 | + |
| 50 | + template <class TSub> |
| 51 | + void operator()(boost::sml::aux::string<boost::sml::sm<TSub>>) const { |
| 52 | + std::cout << boost::sml::aux::get_type_name<TSub>() << ':'; |
| 53 | + sm_.template visit_current_states<boost::sml::aux::identity<TSub>>(*this); |
| 54 | + } |
| 55 | + |
| 56 | + template <class TState> |
| 57 | + void operator()(TState state) const { |
| 58 | + std::cout << state.c_str() << '\n'; |
| 59 | + } |
| 60 | + |
| 61 | + private: |
| 62 | + const TSM& sm_; |
| 63 | +}; |
| 64 | + |
| 65 | +int main() { |
| 66 | + sml::sm<composite> sm{}; |
| 67 | + |
| 68 | + const auto state_name = state_name_visitor<decltype(sm)>{sm}; |
| 69 | + |
| 70 | + sm.process_event(e1{}); |
| 71 | + sm.visit_current_states(state_name); // s1 |
| 72 | + |
| 73 | + sm.process_event(e2{}); |
| 74 | + sm.visit_current_states(state_name); // sub:idle |
| 75 | + |
| 76 | + sm.process_event(e3{}); |
| 77 | + sm.visit_current_states(state_name); // sub:sub1 |
| 78 | + |
| 79 | + sm.process_event(e4{}); |
| 80 | + sm.visit_current_states(state_name); // sub:terminate |
| 81 | + |
| 82 | + sm.process_event(e5{}); |
| 83 | + sm.visit_current_states(state_name); // terminate |
| 84 | +} |
0 commit comments