Chris@16: #ifndef BOOST_STATECHART_REACTION_DISPATCHER_HPP_INCLUDED Chris@16: #define BOOST_STATECHART_REACTION_DISPATCHER_HPP_INCLUDED Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Copyright 2008 Andreas Huber Doenni Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompany- Chris@16: // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: Chris@16: Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@101: #include // boost::polymorphic_downcast Chris@16: #include Chris@16: Chris@16: Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace statechart Chris@16: { Chris@16: namespace detail Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: template< class Event > Chris@16: struct no_context Chris@16: { Chris@16: void no_function( const Event & ); Chris@16: }; Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: template< Chris@16: class Reactions, class State, class EventBase, class Event, Chris@16: class ActionContext, class IdType > Chris@16: class reaction_dispatcher Chris@16: { Chris@16: private: Chris@16: struct without_action Chris@16: { Chris@16: static result react( State & stt, const EventBase & ) Chris@16: { Chris@16: return Reactions::react_without_action( stt ); Chris@16: } Chris@16: }; Chris@16: Chris@16: struct base_with_action Chris@16: { Chris@16: static result react( State & stt, const EventBase & evt ) Chris@16: { Chris@16: return Reactions::react_with_action( stt, evt ); Chris@16: } Chris@16: }; Chris@16: Chris@16: struct base Chris@16: { Chris@16: static result react( Chris@16: State & stt, const EventBase & evt, const IdType & ) Chris@16: { Chris@16: typedef typename mpl::if_< Chris@16: is_same< ActionContext, detail::no_context< Event > >, Chris@16: without_action, base_with_action Chris@16: >::type reaction; Chris@16: return reaction::react( stt, evt ); Chris@16: } Chris@16: }; Chris@16: Chris@16: struct derived_with_action Chris@16: { Chris@16: static result react( State & stt, const EventBase & evt ) Chris@16: { Chris@16: return Reactions::react_with_action( Chris@16: stt, *polymorphic_downcast< const Event * >( &evt ) ); Chris@16: } Chris@16: }; Chris@16: Chris@16: struct derived Chris@16: { Chris@16: static result react( Chris@16: State & stt, const EventBase & evt, const IdType & eventType ) Chris@16: { Chris@16: if ( eventType == Event::static_type() ) Chris@16: { Chris@16: typedef typename mpl::if_< Chris@16: is_same< ActionContext, detail::no_context< Event > >, Chris@16: without_action, derived_with_action Chris@16: >::type reaction; Chris@16: return reaction::react( stt, evt ); Chris@16: } Chris@16: else Chris@16: { Chris@16: return detail::result_utility::make_result( detail::no_reaction ); Chris@16: } Chris@16: } Chris@16: }; Chris@16: Chris@16: public: Chris@16: static reaction_result react( Chris@16: State & stt, const EventBase & evt, const IdType & eventType ) Chris@16: { Chris@16: typedef typename mpl::if_< Chris@16: is_same< Event, EventBase >, base, derived Chris@16: >::type reaction; Chris@16: return result_utility::get_result( Chris@16: reaction::react( stt, evt, eventType ) ); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: } // namespace detail Chris@16: } // namespace statechart Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: Chris@16: #endif