Chris@16: #ifndef BOOST_STATECHART_TRANSITION_HPP_INCLUDED Chris@16: #define BOOST_STATECHART_TRANSITION_HPP_INCLUDED Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: // Copyright 2002-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@16: Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace statechart Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: ////////////////////////////////////////////////////////////////////////////// Chris@16: template< class Event, class Destination, Chris@16: class TransitionContext = detail::no_context< Event >, Chris@16: void ( TransitionContext::*pTransitionAction )( const Event & ) = Chris@16: &detail::no_context< Event >::no_function > Chris@16: class transition Chris@16: { Chris@16: private: Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: template< class State > Chris@16: struct reactions Chris@16: { Chris@16: static result react_without_action( State & stt ) Chris@16: { Chris@16: return stt.template transit< Destination >(); Chris@16: } Chris@16: Chris@16: static result react_with_action( State & stt, const Event & evt ) Chris@16: { Chris@16: return stt.template transit< Destination >( pTransitionAction, evt ); Chris@16: } Chris@16: }; Chris@16: Chris@16: public: Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: // The following declarations should be private. Chris@16: // They are only public because many compilers lack template friends. Chris@16: ////////////////////////////////////////////////////////////////////////// Chris@16: template< class State, class EventBase, class IdType > Chris@16: static detail::reaction_result react( Chris@16: State & stt, const EventBase & evt, const IdType & eventType ) Chris@16: { Chris@16: typedef detail::reaction_dispatcher< Chris@16: reactions< State >, State, EventBase, Event, TransitionContext, IdType Chris@16: > dispatcher; Chris@16: return dispatcher::react( stt, evt, eventType ); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: } // namespace statechart Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: Chris@16: #endif