// Copyright 2025 Christian Granzin // Copyright 2008 Christophe Henry // henry UNDERSCORE christophe AT hotmail DOT com // This is an extended version of the state machine available in the boost::mpl library // Distributed under the same license as the original. // Copyright for the original version: // Copyright 2005 David Abrahams and Aleksey Gurtovoy. 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) #ifndef BOOST_MSM_BACKMP11_HISTORY_IMPL_H #define BOOST_MSM_BACKMP11_HISTORY_IMPL_H #include #include namespace boost::msm::backmp11 { namespace detail { // Implementations for history policies. template class history_impl; template class history_impl { public: void reset_active_state_ids(const std::array& initial_state_ids) { m_initial_state_ids = initial_state_ids; } template const std::array& on_entry(Event const&) { return m_initial_state_ids; } void on_exit(const std::array&) { // ignore } // this policy deletes all waiting deferred events template bool process_deferred_events(Event const&) const { return false; } private: // Allow access to private members for serialization. template friend void serialize(T&, history_impl&); std::array m_initial_state_ids; }; template class history_impl { public: void reset_active_state_ids(const std::array& initial_state_ids) { m_last_active_state_ids = initial_state_ids; } template const std::array& on_entry(Event const& ) { return m_last_active_state_ids; } void on_exit(const std::array& active_state_ids) { m_last_active_state_ids = active_state_ids; } // the history policy keeps all deferred events until next reentry template bool process_deferred_events(Event const&)const { return true; } private: // Allow access to private members for serialization. template friend void serialize(T&, history_impl&); std::array m_last_active_state_ids; }; template class history_impl, NumberOfRegions> { using events_mp11 = mp11::mp_list; public: void reset_active_state_ids(const std::array& initial_state_ids) { m_initial_state_ids = initial_state_ids; m_last_active_state_ids = initial_state_ids; } template const std::array& on_entry(Event const&) { if constexpr (mp11::mp_contains::value) { return m_last_active_state_ids; } return m_initial_state_ids; } void on_exit(const std::array& active_state_ids) { m_last_active_state_ids = active_state_ids; } // the history policy keeps deferred events until next reentry if coming from our history event template bool process_deferred_events(Event const&) const { return mp11::mp_contains::value; } private: // Allow access to private members for serialization. template friend void serialize(T&, history_impl, N>&); std::array m_initial_state_ids; std::array m_last_active_state_ids; }; } // detail } // boost::msm::backmp11 #endif // BOOST_MSM_BACKMP11_HISTORY_IMPL_H