#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 |