// // 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 #include namespace sml = boost::sml; namespace { struct e1 {}; struct e2 {}; struct e3 {}; struct e4 {}; struct defer_and_process { auto operator()() const noexcept { using namespace sml; // clang-format off return make_transition_table( *"idle"_s + event / defer , "idle"_s + event = "s1"_s , "s1"_s + event / process(e2{}) = "s2"_s , "s2"_s + event / process(e4{}) , "s2"_s + event = X ); // clang-format on } }; } // namespace int main() { using namespace sml; sm, sml::process_queue> sm; /// defer_queue policy to enable deferred events using std::queue assert(sm.is("idle"_s)); assert(sm.process_event(e1{})); assert(sm.is("idle"_s)); assert(!sm.process_event(e2{})); /// triggers idle -> s1 and s1 -> s2 (via deferred e1) /// additionally triggers e2 again which is unhandled so it returns false assert(sm.is("s2"_s)); assert(sm.process_event(e3{})); /// triggers s2.process(e4) -> X (via processed e4) assert(sm.is(sml::X)); }