1 // Copyright 2008 Christophe Henry 2 // henry UNDERSCORE christophe AT hotmail DOT com 3 // This is an extended version of the state machine available in the boost::mpl library 4 // Distributed under the same license as the original. 5 // Copyright for the original version: 6 // Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed 7 // under the Boost Software License, Version 1.0. (See accompanying 8 // file LICENSE_1_0.txt or copy at 9 // http://www.boost.org/LICENSE_1_0.txt) 10 11 #ifndef BOOST_MSM_ROW2_HPP 12 #define BOOST_MSM_ROW2_HPP 13 14 #include <boost/type_traits/is_base_of.hpp> 15 #include <boost/mpl/bool.hpp> 16 #include <boost/fusion/include/at_key.hpp> 17 #include <boost/msm/back/common_types.hpp> 18 #include <boost/msm/row_tags.hpp> 19 #include <boost/msm/front/detail/row2_helper.hpp> 20 21 namespace boost { namespace msm { namespace front 22 { 23 template< 24 typename T1 25 , class Event 26 , typename T2 27 > 28 struct _row2 29 { 30 typedef _row_tag row_type_tag; 31 typedef T1 Source; 32 typedef T2 Target; 33 typedef Event Evt; 34 }; 35 36 template< 37 typename T1 38 , class Event 39 , typename T2 40 , typename CalledForAction 41 , void (CalledForAction::*action)(Event const&) 42 > 43 struct a_row2 44 { 45 typedef a_row_tag row_type_tag; 46 typedef T1 Source; 47 typedef T2 Target; 48 typedef Event Evt; 49 template <class FSM,class SourceState,class TargetState,class AllStates> action_callboost::msm::front::a_row250 static ::boost::msm::back::HandledEnum action_call(FSM& fsm,Event const& evt,SourceState& src,TargetState& tgt, 51 AllStates& all_states) 52 { 53 // in this front-end, we don't need to know source and target states 54 ::boost::msm::front::detail::row2_action_helper<CalledForAction,Event,action>::template call_helper 55 (fsm,evt,src,tgt,all_states, 56 ::boost::mpl::bool_< ::boost::is_base_of<CalledForAction,FSM>::type::value>()); 57 return ::boost::msm::back::HANDLED_TRUE; 58 } 59 }; 60 61 template< 62 typename T1 63 , class Event 64 , typename T2 65 , typename CalledForAction 66 , void (CalledForAction::*action)(Event const&) 67 , typename CalledForGuard 68 , bool (CalledForGuard::*guard)(Event const&) 69 > 70 struct row2 71 { 72 typedef row_tag row_type_tag; 73 typedef T1 Source; 74 typedef T2 Target; 75 typedef Event Evt; 76 template <class FSM,class SourceState,class TargetState, class AllStates> action_callboost::msm::front::row277 static ::boost::msm::back::HandledEnum action_call(FSM& fsm,Event const& evt,SourceState& src,TargetState& tgt, 78 AllStates& all_states) 79 { 80 // in this front-end, we don't need to know source and target states 81 ::boost::msm::front::detail::row2_action_helper<CalledForAction,Event,action>::call_helper 82 (fsm,evt,src,tgt,all_states, 83 ::boost::mpl::bool_< ::boost::is_base_of<CalledForAction,FSM>::type::value>()); 84 return ::boost::msm::back::HANDLED_TRUE; 85 } 86 template <class FSM,class SourceState,class TargetState,class AllStates> guard_callboost::msm::front::row287 static bool guard_call(FSM& fsm,Event const& evt,SourceState& src,TargetState& tgt, 88 AllStates& all_states) 89 { 90 // in this front-end, we don't need to know source and target states 91 return ::boost::msm::front::detail::row2_guard_helper<CalledForGuard,Event,guard>::call_helper 92 (fsm,evt,src,tgt,all_states, 93 ::boost::mpl::bool_< ::boost::is_base_of<CalledForGuard,FSM>::type::value>()); 94 } 95 }; 96 template< 97 typename T1 98 , class Event 99 , typename T2 100 , typename CalledForGuard 101 , bool (CalledForGuard::*guard)(Event const&) 102 > 103 struct g_row2 104 { 105 typedef g_row_tag row_type_tag; 106 typedef T1 Source; 107 typedef T2 Target; 108 typedef Event Evt; 109 template <class FSM,class SourceState,class TargetState,class AllStates> guard_callboost::msm::front::g_row2110 static bool guard_call(FSM& fsm,Event const& evt,SourceState& src,TargetState& tgt, 111 AllStates& all_states) 112 { 113 // in this front-end, we don't need to know source and target states 114 return ::boost::msm::front::detail::row2_guard_helper<CalledForGuard,Event,guard>::call_helper 115 (fsm,evt,src,tgt,all_states, 116 ::boost::mpl::bool_< ::boost::is_base_of<CalledForGuard,FSM>::type::value>()); 117 } 118 }; 119 // internal transitions 120 template< 121 typename T1 122 , class Event 123 , typename CalledForAction 124 , void (CalledForAction::*action)(Event const&) 125 > 126 struct a_irow2 127 { 128 typedef a_irow_tag row_type_tag; 129 typedef T1 Source; 130 typedef T1 Target; 131 typedef Event Evt; 132 template <class FSM,class SourceState,class TargetState,class AllStates> action_callboost::msm::front::a_irow2133 static ::boost::msm::back::HandledEnum action_call(FSM& fsm,Event const& evt,SourceState& src,TargetState& tgt, 134 AllStates& all_states) 135 { 136 // in this front-end, we don't need to know source and target states 137 ::boost::msm::front::detail::row2_action_helper<CalledForAction,Event,action>::call_helper 138 (fsm,evt,src,tgt,all_states, 139 ::boost::mpl::bool_< ::boost::is_base_of<CalledForAction,FSM>::type::value>()); 140 return ::boost::msm::back::HANDLED_TRUE; 141 } 142 }; 143 144 template< 145 typename T1 146 , class Event 147 , typename CalledForAction 148 , void (CalledForAction::*action)(Event const&) 149 , typename CalledForGuard 150 , bool (CalledForGuard::*guard)(Event const&) 151 > 152 struct irow2 153 { 154 typedef irow_tag row_type_tag; 155 typedef T1 Source; 156 typedef T1 Target; 157 typedef Event Evt; 158 template <class FSM,class SourceState,class TargetState,class AllStates> action_callboost::msm::front::irow2159 static ::boost::msm::back::HandledEnum action_call(FSM& fsm,Event const& evt,SourceState& src,TargetState& tgt, 160 AllStates& all_states) 161 { 162 // in this front-end, we don't need to know source and target states 163 ::boost::msm::front::detail::row2_action_helper<CalledForAction,Event,action>::call_helper 164 (fsm,evt,src,tgt,all_states, 165 ::boost::mpl::bool_< ::boost::is_base_of<CalledForAction,FSM>::type::value>()); 166 return ::boost::msm::back::HANDLED_TRUE; 167 } 168 template <class FSM,class SourceState,class TargetState,class AllStates> guard_callboost::msm::front::irow2169 static bool guard_call(FSM& fsm,Event const& evt,SourceState& src,TargetState& tgt, 170 AllStates& all_states) 171 { 172 // in this front-end, we don't need to know source and target states 173 return ::boost::msm::front::detail::row2_guard_helper<CalledForGuard,Event,guard>::call_helper 174 (fsm,evt,src,tgt,all_states, 175 ::boost::mpl::bool_< ::boost::is_base_of<CalledForGuard,FSM>::type::value>()); 176 } 177 }; 178 template< 179 typename T1 180 , class Event 181 , typename CalledForGuard 182 , bool (CalledForGuard::*guard)(Event const&) 183 > 184 struct g_irow2 185 { 186 typedef g_irow_tag row_type_tag; 187 typedef T1 Source; 188 typedef T1 Target; 189 typedef Event Evt; 190 template <class FSM,class SourceState,class TargetState,class AllStates> guard_callboost::msm::front::g_irow2191 static bool guard_call(FSM& fsm,Event const& evt,SourceState& src,TargetState& tgt, 192 AllStates& all_states) 193 { 194 // in this front-end, we don't need to know source and target states 195 return ::boost::msm::front::detail::row2_guard_helper<CalledForGuard,Event,guard>::call_helper 196 (fsm,evt,src,tgt,all_states, 197 ::boost::mpl::bool_< ::boost::is_base_of<CalledForGuard,FSM>::type::value>()); 198 } 199 }; 200 201 }}} 202 203 #endif //BOOST_MSM_ROW2_HPP 204 205