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