annotate DEPENDENCIES/generic/include/boost/statechart/detail/reaction_dispatcher.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 #ifndef BOOST_STATECHART_REACTION_DISPATCHER_HPP_INCLUDED
Chris@16 2 #define BOOST_STATECHART_REACTION_DISPATCHER_HPP_INCLUDED
Chris@16 3 //////////////////////////////////////////////////////////////////////////////
Chris@16 4 // Copyright 2008 Andreas Huber Doenni
Chris@16 5 // Distributed under the Boost Software License, Version 1.0. (See accompany-
Chris@16 6 // ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 7 //////////////////////////////////////////////////////////////////////////////
Chris@16 8
Chris@16 9
Chris@16 10
Chris@16 11 #include <boost/statechart/result.hpp>
Chris@16 12
Chris@16 13 #include <boost/mpl/if.hpp>
Chris@16 14
Chris@101 15 #include <boost/polymorphic_cast.hpp> // boost::polymorphic_downcast
Chris@16 16 #include <boost/type_traits/is_same.hpp>
Chris@16 17
Chris@16 18
Chris@16 19
Chris@16 20 namespace boost
Chris@16 21 {
Chris@16 22 namespace statechart
Chris@16 23 {
Chris@16 24 namespace detail
Chris@16 25 {
Chris@16 26
Chris@16 27
Chris@16 28
Chris@16 29 //////////////////////////////////////////////////////////////////////////////
Chris@16 30 template< class Event >
Chris@16 31 struct no_context
Chris@16 32 {
Chris@16 33 void no_function( const Event & );
Chris@16 34 };
Chris@16 35
Chris@16 36 //////////////////////////////////////////////////////////////////////////////
Chris@16 37 template<
Chris@16 38 class Reactions, class State, class EventBase, class Event,
Chris@16 39 class ActionContext, class IdType >
Chris@16 40 class reaction_dispatcher
Chris@16 41 {
Chris@16 42 private:
Chris@16 43 struct without_action
Chris@16 44 {
Chris@16 45 static result react( State & stt, const EventBase & )
Chris@16 46 {
Chris@16 47 return Reactions::react_without_action( stt );
Chris@16 48 }
Chris@16 49 };
Chris@16 50
Chris@16 51 struct base_with_action
Chris@16 52 {
Chris@16 53 static result react( State & stt, const EventBase & evt )
Chris@16 54 {
Chris@16 55 return Reactions::react_with_action( stt, evt );
Chris@16 56 }
Chris@16 57 };
Chris@16 58
Chris@16 59 struct base
Chris@16 60 {
Chris@16 61 static result react(
Chris@16 62 State & stt, const EventBase & evt, const IdType & )
Chris@16 63 {
Chris@16 64 typedef typename mpl::if_<
Chris@16 65 is_same< ActionContext, detail::no_context< Event > >,
Chris@16 66 without_action, base_with_action
Chris@16 67 >::type reaction;
Chris@16 68 return reaction::react( stt, evt );
Chris@16 69 }
Chris@16 70 };
Chris@16 71
Chris@16 72 struct derived_with_action
Chris@16 73 {
Chris@16 74 static result react( State & stt, const EventBase & evt )
Chris@16 75 {
Chris@16 76 return Reactions::react_with_action(
Chris@16 77 stt, *polymorphic_downcast< const Event * >( &evt ) );
Chris@16 78 }
Chris@16 79 };
Chris@16 80
Chris@16 81 struct derived
Chris@16 82 {
Chris@16 83 static result react(
Chris@16 84 State & stt, const EventBase & evt, const IdType & eventType )
Chris@16 85 {
Chris@16 86 if ( eventType == Event::static_type() )
Chris@16 87 {
Chris@16 88 typedef typename mpl::if_<
Chris@16 89 is_same< ActionContext, detail::no_context< Event > >,
Chris@16 90 without_action, derived_with_action
Chris@16 91 >::type reaction;
Chris@16 92 return reaction::react( stt, evt );
Chris@16 93 }
Chris@16 94 else
Chris@16 95 {
Chris@16 96 return detail::result_utility::make_result( detail::no_reaction );
Chris@16 97 }
Chris@16 98 }
Chris@16 99 };
Chris@16 100
Chris@16 101 public:
Chris@16 102 static reaction_result react(
Chris@16 103 State & stt, const EventBase & evt, const IdType & eventType )
Chris@16 104 {
Chris@16 105 typedef typename mpl::if_<
Chris@16 106 is_same< Event, EventBase >, base, derived
Chris@16 107 >::type reaction;
Chris@16 108 return result_utility::get_result(
Chris@16 109 reaction::react( stt, evt, eventType ) );
Chris@16 110 }
Chris@16 111 };
Chris@16 112
Chris@16 113
Chris@16 114
Chris@16 115 } // namespace detail
Chris@16 116 } // namespace statechart
Chris@16 117 } // namespace boost
Chris@16 118
Chris@16 119
Chris@16 120
Chris@16 121 #endif