annotate DEPENDENCIES/generic/include/boost/msm/front/euml/common.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // Copyright 2008 Christophe Henry
Chris@16 2 // henry UNDERSCORE christophe AT hotmail DOT com
Chris@16 3 // This is an extended version of the state machine available in the boost::mpl library
Chris@16 4 // Distributed under the same license as the original.
Chris@16 5 // Copyright for the original version:
Chris@16 6 // Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed
Chris@16 7 // under the Boost Software License, Version 1.0. (See accompanying
Chris@16 8 // file LICENSE_1_0.txt or copy at
Chris@16 9 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 10
Chris@16 11 #ifndef BOOST_MSM_FRONT_EUML_COMMON_H
Chris@16 12 #define BOOST_MSM_FRONT_EUML_COMMON_H
Chris@16 13
Chris@16 14 #include <boost/config.hpp>
Chris@16 15 #include <boost/msm/proto_config.hpp>
Chris@16 16
Chris@16 17 #include <iterator>
Chris@16 18 #include <utility>
Chris@16 19
Chris@16 20 #include <boost/proto/core.hpp>
Chris@16 21 #include <boost/proto/transform.hpp>
Chris@16 22
Chris@16 23 #include <boost/utility/enable_if.hpp>
Chris@16 24 #include <boost/type_traits/is_same.hpp>
Chris@16 25 #include <boost/type_traits/remove_reference.hpp>
Chris@16 26 #include <boost/type_traits/add_const.hpp>
Chris@16 27
Chris@16 28 #include <boost/mpl/vector.hpp>
Chris@16 29 #include <boost/mpl/set.hpp>
Chris@16 30 #include <boost/mpl/has_key.hpp>
Chris@16 31 #include <boost/mpl/int.hpp>
Chris@16 32 #include <boost/mpl/less_equal.hpp>
Chris@16 33
Chris@16 34 #if BOOST_VERSION >= 104000
Chris@16 35 #include <boost/mpl/string.hpp>
Chris@16 36 #endif
Chris@16 37
Chris@16 38 #include <boost/fusion/container/vector.hpp>
Chris@16 39 #include <boost/fusion/include/at_c.hpp>
Chris@16 40 #include <boost/fusion/include/make_map.hpp>
Chris@16 41 #include <boost/fusion/include/pair.hpp>
Chris@16 42 #include <boost/fusion/include/as_vector.hpp>
Chris@16 43 #include <boost/fusion/include/pair.hpp>
Chris@16 44 #include <boost/fusion/include/is_sequence.hpp>
Chris@16 45
Chris@16 46 #include <boost/type_traits/remove_reference.hpp>
Chris@16 47
Chris@16 48 #include <boost/preprocessor/repetition/enum_params.hpp>
Chris@16 49 #include <boost/preprocessor/arithmetic/sub.hpp>
Chris@16 50 #include <boost/preprocessor/punctuation/comma_if.hpp>
Chris@16 51 #include <boost/preprocessor/control/expr_if.hpp>
Chris@16 52 #include <boost/preprocessor/punctuation/comma.hpp>
Chris@16 53 #include <boost/preprocessor/arithmetic/add.hpp>
Chris@16 54 #include <boost/preprocessor/cat.hpp>
Chris@16 55 #include <boost/preprocessor/comparison/less.hpp>
Chris@16 56 #include <boost/preprocessor/arithmetic/dec.hpp>
Chris@16 57 #include <boost/preprocessor/repetition/repeat_from_to.hpp>
Chris@16 58 #include <boost/preprocessor/cat.hpp>
Chris@16 59
Chris@16 60 #include <boost/msm/msm_grammar.hpp>
Chris@16 61 #include <boost/msm/active_state_switching_policies.hpp>
Chris@16 62 #include <boost/msm/event_traits.hpp>
Chris@16 63 #include <boost/msm/front/functor_row.hpp>
Chris@16 64
Chris@16 65 namespace proto = boost::proto;
Chris@16 66
Chris@16 67 BOOST_MPL_HAS_XXX_TRAIT_DEF(tag_type)
Chris@16 68 BOOST_MPL_HAS_XXX_TRAIT_DEF(action_name)
Chris@16 69 BOOST_MPL_HAS_XXX_TRAIT_DEF(not_intern_euml_state)
Chris@16 70
Chris@16 71 namespace boost { namespace msm { namespace front { namespace euml
Chris@16 72 {
Chris@16 73 template <class T>
Chris@16 74 struct get_iterator
Chris@16 75 {
Chris@16 76 typedef typename T::iterator type;
Chris@16 77 };
Chris@16 78 template <class T>
Chris@16 79 struct get_reverse_iterator
Chris@16 80 {
Chris@16 81 typedef typename T::reverse_iterator type;
Chris@16 82 };
Chris@16 83 template <class T>
Chris@16 84 struct get_reference
Chris@16 85 {
Chris@16 86 typedef typename T::reference type;
Chris@16 87 };
Chris@16 88 template <class T>
Chris@16 89 struct get_size_type
Chris@16 90 {
Chris@16 91 typedef typename T::size_type type;
Chris@16 92 };
Chris@16 93 template <class T>
Chris@16 94 struct get_value_type
Chris@16 95 {
Chris@16 96 typedef typename T::value_type type;
Chris@16 97 };
Chris@16 98 template <class T>
Chris@16 99 struct get_first_type
Chris@16 100 {
Chris@16 101 typedef typename T::first_type type;
Chris@16 102 };
Chris@16 103 template <class T>
Chris@16 104 struct get_second_type
Chris@16 105 {
Chris@16 106 typedef typename T::second_type type;
Chris@16 107 };
Chris@16 108 template <class T>
Chris@16 109 struct get_action_tag_type
Chris@16 110 {
Chris@16 111 typedef typename ::boost::mpl::has_key<
Chris@16 112 typename T::tag_type,action_tag>::type type;
Chris@16 113 };
Chris@16 114 template <class T>
Chris@16 115 struct get_state_action_tag_type
Chris@16 116 {
Chris@16 117 typedef typename ::boost::mpl::has_key<
Chris@16 118 typename T::tag_type,state_action_tag>::type type;
Chris@16 119 };
Chris@16 120
Chris@16 121 template <class T,class EVT,class FSM,class SourceState,class TargetState>
Chris@16 122 struct get_result_type
Chris@16 123 {
Chris@16 124 typedef typename T::template transition_action_result<EVT,FSM,SourceState,TargetState>::type type;
Chris@16 125 };
Chris@16 126 template <class T,class Event,class FSM,class STATE>
Chris@16 127 struct get_result_type2
Chris@16 128 {
Chris@16 129 typedef typename T::template state_action_result<Event,FSM,STATE>::type type;
Chris@16 130 };
Chris@16 131 template<class SEQ>
Chris@16 132 struct get_sequence
Chris@16 133 {
Chris@16 134 typedef typename SEQ::sequence type;
Chris@16 135 };
Chris@16 136
Chris@16 137 template <class T>
Chris@16 138 struct get_attributes_type
Chris@16 139 {
Chris@16 140 typedef typename T::attributes_type type;
Chris@16 141 };
Chris@16 142
Chris@16 143 template <class T>
Chris@16 144 struct get_euml_tag_type
Chris@16 145 {
Chris@16 146 typedef typename T::euml_tag_type type;
Chris@16 147 };
Chris@16 148
Chris@16 149 template <class T,class Arg1=void,class Arg2=void,class Arg3=void,class Arg4=void,class Arg5=void
Chris@16 150 #ifdef BOOST_MSVC
Chris@16 151 ,class Arg6=void
Chris@16 152 #endif
Chris@16 153 >
Chris@16 154 struct get_fct
Chris@16 155 {
Chris@16 156 typedef typename T::template In<Arg1,Arg2,Arg3,Arg4,Arg5
Chris@16 157 #ifdef BOOST_MSVC
Chris@16 158 ,Arg6
Chris@16 159 #endif
Chris@16 160 >::type type;
Chris@16 161 };
Chris@16 162
Chris@16 163 // used to differentiate between different types of euml_state's
Chris@16 164 template <class T,class Enable=void>
Chris@16 165 struct get_state_name
Chris@16 166 {
Chris@16 167 typedef T type;
Chris@16 168 };
Chris@16 169
Chris@16 170 template <class T>
Chris@16 171 struct get_state_name<T,typename ::boost::enable_if<has_not_intern_euml_state<T> >::type>
Chris@16 172 {
Chris@16 173 typedef typename T::In::type type;
Chris@16 174 };
Chris@16 175
Chris@16 176 template <class T>
Chris@16 177 struct get_action_name
Chris@16 178 {
Chris@16 179 typedef typename T::action_name type;
Chris@16 180 };
Chris@16 181 template <class T>
Chris@16 182 struct get_event_name
Chris@16 183 {
Chris@16 184 typedef typename T::event_name type;
Chris@16 185 };
Chris@16 186
Chris@16 187 template <class EVT>
Chris@16 188 struct euml_event: proto::extends<typename proto::terminal<event_tag>::type, EVT, boost::msm::sm_domain>
Chris@16 189 {
Chris@16 190 typedef event_tag euml_tag_type;
Chris@16 191 typedef EVT event_name;
Chris@16 192 using proto::extends<typename proto::terminal<event_tag>::type, EVT, boost::msm::sm_domain>::operator=;
Chris@16 193 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 194 #ifdef BOOST_MSVC
Chris@16 195 ,class Arg6
Chris@16 196 #endif
Chris@16 197 >
Chris@16 198 struct In
Chris@16 199 {
Chris@16 200 typedef EVT type;
Chris@16 201 };
Chris@16 202 };
Chris@16 203
Chris@16 204 template <class STATE>
Chris@16 205 struct euml_state_intern: proto::extends<typename proto::terminal< boost::msm::state_tag>::type, STATE, boost::msm::state_domain>
Chris@16 206 {
Chris@16 207 typedef state_tag euml_tag_type;
Chris@16 208 using proto::extends<typename proto::terminal<state_tag>::type, STATE, boost::msm::state_domain>::operator=;
Chris@16 209 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 210 #ifdef BOOST_MSVC
Chris@16 211 ,class Arg6
Chris@16 212 #endif
Chris@16 213 >
Chris@16 214 struct In
Chris@16 215 {
Chris@16 216 typedef STATE type;
Chris@16 217 };
Chris@16 218 };
Chris@16 219 template <class STATE>
Chris@16 220 struct euml_state: proto::extends<typename proto::terminal< boost::msm::state_tag>::type, STATE, boost::msm::state_domain>
Chris@16 221 {
Chris@16 222 typedef state_tag euml_tag_type;
Chris@16 223 typedef int not_intern_euml_state;
Chris@16 224 using proto::extends<typename proto::terminal<state_tag>::type, STATE, boost::msm::state_domain>::operator=;
Chris@16 225 struct In
Chris@16 226 {
Chris@16 227 typedef STATE type;
Chris@16 228 };
Chris@16 229 };
Chris@16 230 template <class ACTION>
Chris@16 231 struct euml_action: proto::extends<typename proto::terminal<action_tag>::type, ACTION, boost::msm::sm_domain>
Chris@16 232 {
Chris@16 233 typedef action_tag euml_tag_type;
Chris@16 234 typedef ACTION action_name;
Chris@16 235 using proto::extends<typename proto::terminal<action_tag>::type, ACTION, boost::msm::sm_domain>::operator=;
Chris@16 236 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 237 #ifdef BOOST_MSVC
Chris@16 238 ,class Arg6
Chris@16 239 #endif
Chris@16 240 >
Chris@16 241 struct In
Chris@16 242 {
Chris@16 243 typedef ACTION type;
Chris@16 244 };
Chris@16 245 };
Chris@16 246 template <class FLAG>
Chris@16 247 struct euml_flag: proto::extends<typename proto::terminal<flag_tag>::type, FLAG, boost::msm::sm_domain>
Chris@16 248 {
Chris@16 249 typedef flag_tag euml_tag_type;
Chris@16 250 using proto::extends<typename proto::terminal<flag_tag>::type, FLAG, boost::msm::sm_domain>::operator=;
Chris@16 251 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 252 #ifdef BOOST_MSVC
Chris@16 253 ,class Arg6
Chris@16 254 #endif
Chris@16 255 >
Chris@16 256 struct In
Chris@16 257 {
Chris@16 258 typedef FLAG type;
Chris@16 259 };
Chris@16 260 };
Chris@16 261
Chris@16 262 template <class CONFIG>
Chris@16 263 struct euml_config: proto::extends<typename proto::terminal<config_tag>::type, CONFIG, boost::msm::sm_domain>
Chris@16 264 {
Chris@16 265 typedef config_tag euml_tag_type;
Chris@16 266 using proto::extends<typename proto::terminal<config_tag>::type, CONFIG, boost::msm::sm_domain>::operator=;
Chris@16 267 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 268 #ifdef BOOST_MSVC
Chris@16 269 ,class Arg6
Chris@16 270 #endif
Chris@16 271 >
Chris@16 272 struct In
Chris@16 273 {
Chris@16 274 typedef CONFIG type;
Chris@16 275 };
Chris@16 276 };
Chris@16 277
Chris@16 278 struct No_Exception : euml_config<No_Exception>
Chris@16 279 {
Chris@16 280 typedef int no_exception_thrown;
Chris@16 281 No_Exception(){}
Chris@16 282 };
Chris@16 283 struct No_Msg_Queue : euml_config<No_Msg_Queue>
Chris@16 284 {
Chris@16 285 typedef int no_message_queue;
Chris@16 286 No_Msg_Queue(){}
Chris@16 287 };
Chris@16 288 struct Deferred_Events : euml_config<Deferred_Events>
Chris@16 289 {
Chris@16 290 typedef int activate_deferred_events;
Chris@16 291 Deferred_Events(){}
Chris@16 292 };
Chris@16 293 No_Exception const no_exception=No_Exception();
Chris@16 294 No_Msg_Queue const no_msg_queue=No_Msg_Queue();
Chris@16 295 Deferred_Events const deferred_events=Deferred_Events();
Chris@16 296
Chris@16 297 struct ActiveStateSwitchBeforeTransition : euml_config<ActiveStateSwitchBeforeTransition>
Chris@16 298 {
Chris@16 299 typedef boost::msm::active_state_switch_before_transition active_state_switch_policy;
Chris@16 300 ActiveStateSwitchBeforeTransition(){}
Chris@16 301 };
Chris@16 302 ActiveStateSwitchBeforeTransition const switch_active_before_transition = ActiveStateSwitchBeforeTransition();
Chris@16 303
Chris@16 304 struct ActiveStateSwitchAfterExit : euml_config<ActiveStateSwitchAfterExit>
Chris@16 305 {
Chris@16 306 typedef boost::msm::active_state_switch_after_exit active_state_switch_policy;
Chris@16 307 ActiveStateSwitchAfterExit(){}
Chris@16 308 };
Chris@16 309 ActiveStateSwitchAfterExit const switch_active_after_exit = ActiveStateSwitchAfterExit();
Chris@16 310
Chris@16 311 struct ActiveStateSwitchAfterAction : euml_config<ActiveStateSwitchAfterAction>
Chris@16 312 {
Chris@16 313 typedef boost::msm::active_state_switch_after_transition_action active_state_switch_policy;
Chris@16 314 ActiveStateSwitchAfterAction(){}
Chris@16 315 };
Chris@16 316 ActiveStateSwitchAfterAction const switch_active_after_action = ActiveStateSwitchAfterAction();
Chris@16 317
Chris@16 318
Chris@16 319 struct invalid_type{};
Chris@16 320 struct make_invalid_type
Chris@16 321 {
Chris@16 322 typedef invalid_type type;
Chris@16 323 };
Chris@16 324
Chris@16 325 template <class ROW>
Chris@16 326 struct make_vector_one_row
Chris@16 327 {
Chris@16 328 typedef boost::mpl::vector<ROW> type;
Chris@16 329 };
Chris@16 330 template <class T>
Chris@16 331 T make_T(T t) {return t;}
Chris@16 332
Chris@16 333 struct make_vector_no_row
Chris@16 334 {
Chris@16 335 typedef boost::mpl::vector0<> type;
Chris@16 336 };
Chris@16 337
Chris@16 338 struct NoAction : euml_action<NoAction>
Chris@16 339 {
Chris@16 340 NoAction(){}
Chris@16 341 // return value if used inside a state action (entry/exit)
Chris@16 342 template <class Event,class FSM,class STATE >
Chris@16 343 struct state_action_result
Chris@16 344 {
Chris@16 345 typedef bool type;
Chris@16 346 };
Chris@16 347 // return value if used inside a transition (action/guard)
Chris@16 348 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 349 struct transition_action_result
Chris@16 350 {
Chris@16 351 typedef bool type;
Chris@16 352 };
Chris@16 353 // this functor can be used in both modes, state action and transition action
Chris@16 354 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 355
Chris@16 356 template <class Event,class FSM,class STATE>
Chris@16 357 bool operator()(Event const&,FSM&,STATE& )
Chris@16 358 {
Chris@16 359 // does nothing
Chris@16 360 return true;
Chris@16 361 }
Chris@16 362 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 363 bool operator()(EVT const& ,FSM& ,SourceState& ,TargetState&)const
Chris@16 364 {
Chris@16 365 // does nothing
Chris@16 366 return true;
Chris@16 367 }
Chris@16 368 };
Chris@16 369 NoAction const no_action = NoAction();
Chris@16 370
Chris@16 371 struct fsm_artefact_tag {};
Chris@16 372 template <class Index=void>
Chris@16 373 struct GetSource_ : euml_action<GetSource_<Index> >
Chris@16 374 {
Chris@16 375 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 376 struct transition_action_result
Chris@16 377 {
Chris@16 378 typedef typename ::boost::fusion::result_of::at_key<typename SourceState::attributes_type,
Chris@16 379 Index >::type type;
Chris@16 380 };
Chris@16 381 typedef ::boost::mpl::set<action_tag> tag_type;
Chris@16 382
Chris@16 383 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 384 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
Chris@16 385 operator()(EVT const& ,FSM& ,SourceState& src,TargetState&)const
Chris@16 386 {
Chris@16 387 return src.get_attribute(Index());
Chris@16 388 }
Chris@16 389 };
Chris@16 390 template<>
Chris@16 391 struct GetSource_<void> : euml_action<GetSource_<void> >
Chris@16 392 {
Chris@16 393 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 394 struct transition_action_result
Chris@16 395 {
Chris@16 396 typedef SourceState& type;
Chris@16 397 };
Chris@16 398 typedef ::boost::mpl::set<action_tag> tag_type;
Chris@16 399
Chris@16 400 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 401 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
Chris@16 402 operator()(EVT const& , FSM&,SourceState& src,TargetState& )const
Chris@16 403 {
Chris@16 404 return src;
Chris@16 405 }
Chris@16 406 };
Chris@16 407 struct GetSource_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetSource_Helper, boost::msm::sm_domain>
Chris@16 408 {
Chris@16 409 GetSource_Helper(){}
Chris@16 410 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 411 #ifdef BOOST_MSVC
Chris@16 412 ,class Arg6
Chris@16 413 #endif
Chris@16 414 >
Chris@16 415 struct In
Chris@16 416 {
Chris@16 417 typedef GetSource_<Arg1> type;
Chris@16 418 };
Chris@16 419 };
Chris@16 420 GetSource_Helper const source_ = GetSource_Helper();
Chris@16 421
Chris@16 422 template <class Index=void>
Chris@16 423 struct GetTarget_ : euml_action<GetTarget_<Index> >
Chris@16 424 {
Chris@16 425 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 426 struct transition_action_result
Chris@16 427 {
Chris@16 428 typedef typename ::boost::fusion::result_of::at_key<typename TargetState::attributes_type,
Chris@16 429 Index >::type type;
Chris@16 430 };
Chris@16 431 typedef ::boost::mpl::set<action_tag> tag_type;
Chris@16 432
Chris@16 433 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 434 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
Chris@16 435 operator()(EVT const& ,FSM& ,SourceState& ,TargetState& tgt)const
Chris@16 436 {
Chris@16 437 return tgt.get_attribute(Index());
Chris@16 438 }
Chris@16 439 };
Chris@16 440 template<>
Chris@16 441 struct GetTarget_<void> : euml_action<GetTarget_<void> >
Chris@16 442 {
Chris@16 443 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 444 struct transition_action_result
Chris@16 445 {
Chris@16 446 typedef TargetState& type;
Chris@16 447 };
Chris@16 448 typedef ::boost::mpl::set<action_tag> tag_type;
Chris@16 449
Chris@16 450 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 451 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
Chris@16 452 operator()(EVT const& , FSM&,SourceState& ,TargetState& tgt)const
Chris@16 453 {
Chris@16 454 return tgt;
Chris@16 455 }
Chris@16 456 };
Chris@16 457 struct GetTarget_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetTarget_Helper, boost::msm::sm_domain>
Chris@16 458 {
Chris@16 459 GetTarget_Helper(){}
Chris@16 460 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 461 #ifdef BOOST_MSVC
Chris@16 462 ,class Arg6
Chris@16 463 #endif
Chris@16 464 >
Chris@16 465 struct In
Chris@16 466 {
Chris@16 467 typedef GetTarget_<Arg1> type;
Chris@16 468 };
Chris@16 469 };
Chris@16 470 GetTarget_Helper const target_ = GetTarget_Helper();
Chris@16 471
Chris@16 472 template <class Index=void>
Chris@16 473 struct GetState_ : euml_action<GetState_<Index> >
Chris@16 474 {
Chris@16 475 template <class Event,class FSM,class STATE >
Chris@16 476 struct state_action_result
Chris@16 477 {
Chris@16 478 typedef typename ::boost::fusion::result_of::at_key<typename STATE::attributes_type,
Chris@16 479 Index >::type type;
Chris@16 480 };
Chris@16 481 typedef ::boost::mpl::set<state_action_tag> tag_type;
Chris@16 482
Chris@16 483 template <class Event,class FSM,class STATE>
Chris@16 484 typename state_action_result<Event,FSM,STATE>::type
Chris@16 485 operator()(Event const&,FSM& ,STATE& state )
Chris@16 486 {
Chris@16 487 return state.get_attribute(Index());
Chris@16 488 }
Chris@16 489 };
Chris@16 490 template<>
Chris@16 491 struct GetState_<void> : euml_action<GetState_<void> >
Chris@16 492 {
Chris@16 493 using euml_action<GetState_ >::operator=;
Chris@16 494
Chris@16 495 template <class Event,class FSM,class STATE >
Chris@16 496 struct state_action_result
Chris@16 497 {
Chris@16 498 typedef STATE& type;
Chris@16 499 };
Chris@16 500 typedef ::boost::mpl::set<state_action_tag> tag_type;
Chris@16 501
Chris@16 502 template <class Event,class FSM,class STATE>
Chris@16 503 typename state_action_result<Event,FSM,STATE>::type
Chris@16 504 operator()(Event const&,FSM& ,STATE& state )
Chris@16 505 {
Chris@16 506 return state;
Chris@16 507 }
Chris@16 508 };
Chris@16 509 struct GetState_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetState_Helper, boost::msm::sm_domain>
Chris@16 510 {
Chris@16 511 GetState_Helper(){}
Chris@16 512 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 513 #ifdef BOOST_MSVC
Chris@16 514 ,class Arg6
Chris@16 515 #endif
Chris@16 516 >
Chris@16 517 struct In
Chris@16 518 {
Chris@16 519 typedef GetState_<Arg1> type;
Chris@16 520 };
Chris@16 521 };
Chris@16 522 GetState_Helper const state_ = GetState_Helper();
Chris@16 523
Chris@16 524 template <class Index=void>
Chris@16 525 struct GetEvent_ : euml_action<GetEvent_<Index> >
Chris@16 526 {
Chris@16 527 template <class Event,class FSM,class STATE >
Chris@16 528 struct state_action_result
Chris@16 529 {
Chris@16 530 typedef typename ::boost::add_const<
Chris@16 531 typename ::boost::fusion::result_of::at_key<typename Event::attributes_type,
Chris@16 532 Index >::type>::type type;
Chris@16 533 };
Chris@16 534 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 535 struct transition_action_result
Chris@16 536 {
Chris@16 537 typedef typename ::boost::add_const<
Chris@16 538 typename ::boost::fusion::result_of::at_key<typename EVT::attributes_type,
Chris@16 539 Index >::type>::type type;
Chris@16 540 };
Chris@16 541 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 542
Chris@16 543 template <class Event,class FSM,class STATE>
Chris@16 544 typename state_action_result<Event,FSM,STATE>::type
Chris@16 545 operator()(Event const& evt,FSM& ,STATE& )
Chris@16 546 {
Chris@16 547 return evt.get_attribute(Index());
Chris@16 548 }
Chris@16 549 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 550 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
Chris@16 551 operator()(EVT const& evt ,FSM& ,SourceState& ,TargetState&)const
Chris@16 552 {
Chris@16 553 return evt.get_attribute(Index());
Chris@16 554 }
Chris@16 555 };
Chris@16 556 template <>
Chris@16 557 struct GetEvent_<void> : euml_action<GetEvent_<void> >
Chris@16 558 {
Chris@16 559 template <class Event,class FSM,class STATE >
Chris@16 560 struct state_action_result
Chris@16 561 {
Chris@16 562 typedef Event const& type;
Chris@16 563 };
Chris@16 564 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 565 struct transition_action_result
Chris@16 566 {
Chris@16 567 typedef EVT const& type;
Chris@16 568 };
Chris@16 569 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 570
Chris@16 571 template <class Event,class FSM,class STATE>
Chris@16 572 typename state_action_result<Event,FSM,STATE>::type
Chris@16 573 operator()(Event const& evt,FSM& ,STATE& )
Chris@16 574 {
Chris@16 575 return evt;
Chris@16 576 }
Chris@16 577 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 578 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
Chris@16 579 operator()(EVT const& evt ,FSM& ,SourceState& ,TargetState&)const
Chris@16 580 {
Chris@16 581 return evt;
Chris@16 582 }
Chris@16 583 };
Chris@16 584 struct GetEvent_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetEvent_Helper, boost::msm::sm_domain>
Chris@16 585 {
Chris@16 586 GetEvent_Helper(){}
Chris@16 587 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 588 #ifdef BOOST_MSVC
Chris@16 589 ,class Arg6
Chris@16 590 #endif
Chris@16 591 >
Chris@16 592 struct In
Chris@16 593 {
Chris@16 594 typedef GetEvent_<Arg1> type;
Chris@16 595 };
Chris@16 596 };
Chris@16 597 GetEvent_Helper const event_ = GetEvent_Helper();
Chris@16 598
Chris@16 599 template <class Index=void>
Chris@16 600 struct GetFsm_ : euml_action<GetFsm_<Index> >
Chris@16 601 {
Chris@16 602 template <class Event,class FSM,class STATE >
Chris@16 603 struct state_action_result
Chris@16 604 {
Chris@16 605 typedef typename ::boost::fusion::result_of::at_key<typename FSM::attributes_type,
Chris@16 606 Index >::type type;
Chris@16 607 };
Chris@16 608 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 609 struct transition_action_result
Chris@16 610 {
Chris@16 611 typedef typename ::boost::fusion::result_of::at_key<typename FSM::attributes_type,
Chris@16 612 Index >::type type;
Chris@16 613 };
Chris@16 614 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 615
Chris@16 616 template <class Event,class FSM,class STATE>
Chris@16 617 typename state_action_result<Event,FSM,STATE>::type
Chris@16 618 operator()(Event const&,FSM& fsm,STATE& )
Chris@16 619 {
Chris@16 620 return fsm.get_attribute(Index());
Chris@16 621 }
Chris@16 622 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 623 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
Chris@16 624 operator()(EVT const& ,FSM& fsm,SourceState& ,TargetState&)const
Chris@16 625 {
Chris@16 626 return fsm.get_attribute(Index());
Chris@16 627 }
Chris@16 628 };
Chris@16 629 template<>
Chris@16 630 struct GetFsm_<void> : euml_action<GetFsm_<void> >
Chris@16 631 {
Chris@16 632 using euml_action<GetFsm_>::operator=;
Chris@16 633
Chris@16 634 template <class Event,class FSM,class STATE >
Chris@16 635 struct state_action_result
Chris@16 636 {
Chris@16 637 typedef FSM& type;
Chris@16 638 };
Chris@16 639 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 640 struct transition_action_result
Chris@16 641 {
Chris@16 642 typedef FSM& type;
Chris@16 643 };
Chris@16 644 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 645
Chris@16 646 template <class Event,class FSM,class STATE>
Chris@16 647 typename state_action_result<Event,FSM,STATE>::type
Chris@16 648 operator()(Event const&,FSM& fsm,STATE& )
Chris@16 649 {
Chris@16 650 return fsm;
Chris@16 651 }
Chris@16 652 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 653 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
Chris@16 654 operator()(EVT const& ,FSM& fsm,SourceState& ,TargetState&)const
Chris@16 655 {
Chris@16 656 return fsm;
Chris@16 657 }
Chris@16 658 };
Chris@16 659 struct GetFsm_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetFsm_Helper, boost::msm::sm_domain>
Chris@16 660 {
Chris@16 661 GetFsm_Helper(){}
Chris@16 662 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 663 #ifdef BOOST_MSVC
Chris@16 664 ,class Arg6
Chris@16 665 #endif
Chris@16 666 >
Chris@16 667 struct In
Chris@16 668 {
Chris@16 669 typedef GetFsm_<Arg1> type;
Chris@16 670 };
Chris@16 671 };
Chris@16 672 GetFsm_Helper const fsm_ = GetFsm_Helper();
Chris@16 673
Chris@16 674 template <class StateName,class Param1>
Chris@16 675 struct SubState_ : euml_action<SubState_<StateName, Param1> >
Chris@16 676 {
Chris@16 677 template <class Event,class FSM,class STATE >
Chris@16 678 struct state_action_result
Chris@16 679 {
Chris@16 680 typedef StateName& type;
Chris@16 681 };
Chris@16 682 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 683 struct transition_action_result
Chris@16 684 {
Chris@16 685 typedef StateName& type;
Chris@16 686 };
Chris@16 687
Chris@16 688 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 689
Chris@16 690 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 691 StateName& operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 692 {
Chris@16 693 return (Param1()(evt,fsm,src,tgt)).template get_state<StateName&>();
Chris@16 694 }
Chris@16 695 template <class Event,class FSM,class STATE>
Chris@16 696 StateName& operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 697 {
Chris@16 698 return (Param1()(evt,fsm,state)).template get_state<StateName&>();
Chris@16 699 }
Chris@16 700 };
Chris@16 701 template <class StateName>
Chris@16 702 struct SubState_ <StateName,void>
Chris@16 703 : euml_action<SubState_<StateName, void > >
Chris@16 704 {
Chris@16 705 template <class Event,class FSM,class STATE >
Chris@16 706 struct state_action_result
Chris@16 707 {
Chris@16 708 typedef StateName& type;
Chris@16 709 };
Chris@16 710 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 711 struct transition_action_result
Chris@16 712 {
Chris@16 713 typedef StateName& type;
Chris@16 714 };
Chris@16 715
Chris@16 716 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 717
Chris@16 718 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 719 StateName& operator()(EVT const&,FSM& fsm,SourceState& ,TargetState& )const
Chris@16 720 {
Chris@16 721 return fsm.template get_state<StateName&>();
Chris@16 722 }
Chris@16 723 template <class Event,class FSM,class STATE>
Chris@16 724 StateName& operator()(Event const& ,FSM& fsm,STATE& )const
Chris@16 725 {
Chris@16 726 return fsm.template get_state<StateName&>();
Chris@16 727 }
Chris@16 728 };
Chris@16 729
Chris@16 730 struct SubState_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, SubState_Helper, boost::msm::sm_domain>
Chris@16 731 {
Chris@16 732 SubState_Helper(){}
Chris@16 733 using proto::extends< proto::terminal<fsm_artefact_tag>::type, SubState_Helper, boost::msm::sm_domain>::operator=;
Chris@16 734 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 735 #ifdef BOOST_MSVC
Chris@16 736 ,class Arg6
Chris@16 737 #endif
Chris@16 738 >
Chris@16 739 struct In
Chris@16 740 {
Chris@16 741 typedef SubState_<Arg1,Arg2> type;
Chris@16 742 };
Chris@16 743 };
Chris@16 744 SubState_Helper const substate_ = SubState_Helper();
Chris@16 745
Chris@16 746 template <class Target,class Index>
Chris@16 747 struct GetAttribute_ : euml_action<GetAttribute_<Target, Index> >
Chris@16 748 {
Chris@16 749 using euml_action<GetAttribute_<Target,Index> >::operator=;
Chris@16 750 template <class Event,class FSM,class STATE >
Chris@16 751 struct state_action_result
Chris@16 752 {
Chris@16 753 typedef typename
Chris@16 754 ::boost::fusion::result_of::at_key<
Chris@16 755 typename get_attributes_type<
Chris@16 756 typename ::boost::remove_reference<
Chris@16 757 typename get_result_type2<Target,Event,FSM,STATE>::type>::type>::type,
Chris@16 758 Index >::type type;
Chris@16 759 };
Chris@16 760 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 761 struct transition_action_result
Chris@16 762 {
Chris@16 763 typedef typename
Chris@16 764 ::boost::fusion::result_of::at_key<
Chris@16 765 typename get_attributes_type<
Chris@16 766 typename ::boost::remove_reference<
Chris@16 767 typename get_result_type<Target,EVT,FSM,SourceState,TargetState>::type>::type>::type,
Chris@16 768 Index >::type type;
Chris@16 769 };
Chris@16 770
Chris@16 771 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 772
Chris@16 773 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 774 typename ::boost::enable_if<
Chris@16 775 typename ::boost::mpl::has_key<
Chris@16 776 typename Target::tag_type,action_tag>::type,
Chris@16 777 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
Chris@16 778 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 779 {
Chris@16 780 return (Target()(evt,fsm,src,tgt)).get_attribute(Index());
Chris@16 781 }
Chris@16 782 template <class Event,class FSM,class STATE>
Chris@16 783 typename ::boost::enable_if<
Chris@16 784 typename ::boost::mpl::has_key<
Chris@16 785 typename Target::tag_type,state_action_tag>::type,
Chris@16 786 typename state_action_result<Event,FSM,STATE>::type >::type
Chris@16 787 operator()(Event const& evt,FSM& fsm,STATE& state )const
Chris@16 788 {
Chris@16 789 return (Target()(evt,fsm,state)).get_attribute(Index());
Chris@16 790 }
Chris@16 791 };
Chris@16 792
Chris@16 793 struct GetAttribute_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, GetAttribute_Helper, boost::msm::sm_domain>
Chris@16 794 {
Chris@16 795 GetAttribute_Helper(){}
Chris@16 796 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 797 #ifdef BOOST_MSVC
Chris@16 798 ,class Arg6
Chris@16 799 #endif
Chris@16 800 >
Chris@16 801 struct In
Chris@16 802 {
Chris@16 803 typedef GetAttribute_<Arg1,Arg2> type;
Chris@16 804 };
Chris@16 805 };
Chris@16 806 GetAttribute_Helper const attribute_ = GetAttribute_Helper();
Chris@16 807
Chris@16 808 template <class Index>
Chris@16 809 struct Source_ : euml_action<Source_<Index> >
Chris@16 810 {
Chris@16 811 using euml_action<Source_<Index> >::operator=;
Chris@16 812 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 813 struct transition_action_result
Chris@16 814 {
Chris@16 815 typedef typename
Chris@16 816 ::boost::fusion::result_of::at_key<typename SourceState::attributes_type,
Chris@16 817 Index >::type type;
Chris@16 818 };
Chris@16 819 typedef ::boost::mpl::set<action_tag> tag_type;
Chris@16 820
Chris@16 821 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 822 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
Chris@16 823 operator()(EVT const& , FSM&,SourceState& src,TargetState& )const
Chris@16 824 {
Chris@16 825 return src.get_attribute(Index());
Chris@16 826 }
Chris@16 827 };
Chris@16 828 template <class Index>
Chris@16 829 struct Target_ : euml_action<Target_<Index> >
Chris@16 830 {
Chris@16 831 using euml_action<Target_<Index> >::operator=;
Chris@16 832 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 833 struct transition_action_result
Chris@16 834 {
Chris@16 835 typedef typename
Chris@16 836 ::boost::fusion::result_of::at_key<typename TargetState::attributes_type,
Chris@16 837 Index >::type type;
Chris@16 838 };
Chris@16 839 typedef ::boost::mpl::set<action_tag> tag_type;
Chris@16 840
Chris@16 841 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 842 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
Chris@16 843 operator()(EVT const& ,FSM& ,SourceState& ,TargetState& tgt)const
Chris@16 844 {
Chris@16 845 return tgt.get_attribute(Index());
Chris@16 846 }
Chris@16 847 };
Chris@16 848 template <class Index>
Chris@16 849 struct State_ : euml_action<State_<Index> >
Chris@16 850 {
Chris@16 851 using euml_action<State_<Index> >::operator=;
Chris@16 852
Chris@16 853 template <class Event,class FSM,class STATE >
Chris@16 854 struct state_action_result
Chris@16 855 {
Chris@16 856 typedef typename
Chris@16 857 ::boost::fusion::result_of::at_key<typename STATE::attributes_type,
Chris@16 858 Index >::type type;
Chris@16 859 };
Chris@16 860 typedef ::boost::mpl::set<state_action_tag> tag_type;
Chris@16 861
Chris@16 862 template <class Event,class FSM,class STATE>
Chris@16 863 typename state_action_result<Event,FSM,STATE>::type
Chris@16 864 operator()(Event const&,FSM& ,STATE& state )
Chris@16 865 {
Chris@16 866 return state.get_attribute(Index());
Chris@16 867 }
Chris@16 868 };
Chris@16 869 template <class Index>
Chris@16 870 struct Event_ : euml_action<Event_<Index> >
Chris@16 871 {
Chris@16 872 using euml_action<Event_<Index> >::operator=;
Chris@16 873
Chris@16 874 template <class Event,class FSM,class STATE >
Chris@16 875 struct state_action_result
Chris@16 876 {
Chris@16 877 typedef typename ::boost::add_const<
Chris@16 878 typename ::boost::fusion::result_of::at_key<typename Event::attributes_type,
Chris@16 879 Index >::type>::type type;
Chris@16 880 };
Chris@16 881 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 882 struct transition_action_result
Chris@16 883 {
Chris@16 884 typedef typename ::boost::add_const<
Chris@16 885 typename ::boost::fusion::result_of::at_key<typename EVT::attributes_type,
Chris@16 886 Index >::type>::type type;
Chris@16 887 };
Chris@16 888 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 889
Chris@16 890 template <class Event,class FSM,class STATE>
Chris@16 891 typename state_action_result<Event,FSM,STATE>::type
Chris@16 892 operator()(Event const& evt,FSM& ,STATE& )
Chris@16 893 {
Chris@16 894 return evt.get_attribute(Index());
Chris@16 895 }
Chris@16 896 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 897 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
Chris@16 898 operator()(EVT const& evt ,FSM& ,SourceState& ,TargetState&)const
Chris@16 899 {
Chris@16 900 return evt.get_attribute(Index());
Chris@16 901 }
Chris@16 902 };
Chris@16 903 template <class StateType,class Index>
Chris@16 904 struct State_Attribute_ : euml_action<State_Attribute_<StateType,Index> >
Chris@16 905 {
Chris@16 906 using euml_action<State_Attribute_<StateType,Index> >::operator=;
Chris@16 907
Chris@16 908 template <class Event,class FSM,class STATE >
Chris@16 909 struct state_action_result
Chris@16 910 {
Chris@16 911 typedef typename
Chris@16 912 ::boost::fusion::result_of::at_key<typename StateType::attributes_type,
Chris@16 913 Index >::type type;
Chris@16 914 };
Chris@16 915 typedef ::boost::mpl::set<state_action_tag> tag_type;
Chris@16 916
Chris@16 917 template <class Event,class FSM,class STATE>
Chris@16 918 typename state_action_result<Event,FSM,STATE>::type
Chris@16 919 operator()(Event const&,FSM& fsm,STATE& )
Chris@16 920 {
Chris@16 921 return fsm.template get_state<StateType&>().get_attribute(Index());
Chris@16 922 }
Chris@16 923 };
Chris@16 924
Chris@16 925 template <class Index>
Chris@16 926 struct Fsm_ : euml_action<Fsm_<Index> >
Chris@16 927 {
Chris@16 928 using euml_action<Fsm_<Index> >::operator=;
Chris@16 929
Chris@16 930 template <class Event,class FSM,class STATE >
Chris@16 931 struct state_action_result
Chris@16 932 {
Chris@16 933 typedef typename
Chris@16 934 ::boost::fusion::result_of::at_key<typename FSM::attributes_type,
Chris@16 935 Index >::type type;
Chris@16 936 };
Chris@16 937 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 938 struct transition_action_result
Chris@16 939 {
Chris@16 940 typedef typename
Chris@16 941 ::boost::fusion::result_of::at_key<typename FSM::attributes_type,
Chris@16 942 Index >::type type;
Chris@16 943 };
Chris@16 944 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 945
Chris@16 946 template <class Event,class FSM,class STATE>
Chris@16 947 typename state_action_result<Event,FSM,STATE>::type
Chris@16 948 operator()(Event const&,FSM& fsm,STATE& )
Chris@16 949 {
Chris@16 950 return fsm.get_attribute(Index());
Chris@16 951 }
Chris@16 952 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 953 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type
Chris@101 954 operator()(EVT const& ,FSM& fsm,SourceState& ,TargetState&)const
Chris@16 955 {
Chris@16 956 return fsm.get_attribute(Index());
Chris@16 957 }
Chris@16 958 };
Chris@16 959
Chris@16 960 struct True_ : euml::euml_action<True_>
Chris@16 961 {
Chris@16 962 using euml_action<True_>::operator=;
Chris@16 963 True_(){}
Chris@16 964
Chris@16 965 template <class Event,class FSM,class STATE >
Chris@16 966 struct state_action_result
Chris@16 967 {
Chris@16 968 typedef bool type;
Chris@16 969 };
Chris@16 970 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 971 struct transition_action_result
Chris@16 972 {
Chris@16 973 typedef bool type;
Chris@16 974 };
Chris@16 975 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 976
Chris@16 977 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 978 bool operator()(EVT const&,FSM&,SourceState& ,TargetState& )
Chris@16 979 {
Chris@16 980 return true;
Chris@16 981 }
Chris@16 982 template <class Event,class FSM,class STATE>
Chris@16 983 bool operator()(Event const&,FSM&,STATE& )
Chris@16 984 {
Chris@16 985 return true;
Chris@16 986 }
Chris@16 987 };
Chris@16 988 True_ const true_ = True_();
Chris@16 989
Chris@16 990 struct False_ : euml::euml_action<False_>
Chris@16 991 {
Chris@16 992 using euml_action<False_>::operator=;
Chris@16 993 False_(){}
Chris@16 994
Chris@16 995 template <class Event,class FSM,class STATE >
Chris@16 996 struct state_action_result
Chris@16 997 {
Chris@16 998 typedef bool type;
Chris@16 999 };
Chris@16 1000 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1001 struct transition_action_result
Chris@16 1002 {
Chris@16 1003 typedef bool type;
Chris@16 1004 };
Chris@16 1005 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1006
Chris@16 1007 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1008 bool operator()(EVT const&,FSM&,SourceState& ,TargetState& )
Chris@16 1009 {
Chris@16 1010 return false;
Chris@16 1011 }
Chris@16 1012 template <class Event,class FSM,class STATE>
Chris@16 1013 bool operator()(Event const&,FSM&,STATE& )
Chris@16 1014 {
Chris@16 1015 return false;
Chris@16 1016 }
Chris@16 1017 };
Chris@16 1018 False_ const false_ = False_();
Chris@16 1019
Chris@16 1020 template <int Val>
Chris@16 1021 struct Int_ : euml_action<Int_<Val> >
Chris@16 1022 {
Chris@16 1023 using euml_action<Int_<Val> >::operator=;
Chris@16 1024 typedef ::boost::mpl::int_<Val> value_type;
Chris@16 1025 enum {value = Val};
Chris@16 1026
Chris@16 1027 template <class Event,class FSM,class STATE >
Chris@16 1028 struct state_action_result
Chris@16 1029 {
Chris@16 1030 typedef int type;
Chris@16 1031 };
Chris@16 1032 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1033 struct transition_action_result
Chris@16 1034 {
Chris@16 1035 typedef int type;
Chris@16 1036 };
Chris@16 1037 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1038
Chris@16 1039 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1040 int operator()(EVT const& , FSM& ,SourceState& ,TargetState& )
Chris@16 1041 {
Chris@16 1042 return Val;
Chris@16 1043 }
Chris@16 1044 template <class Event,class FSM,class STATE>
Chris@16 1045 int operator()(Event const& ,FSM& ,STATE& )
Chris@16 1046 {
Chris@16 1047 return Val;
Chris@16 1048 }
Chris@16 1049 };
Chris@16 1050
Chris@16 1051 template <char Val>
Chris@16 1052 struct Char_ : euml_action<Char_<Val> >
Chris@16 1053 {
Chris@16 1054 using euml_action<Char_<Val> >::operator=;
Chris@16 1055
Chris@16 1056 template <class Event,class FSM,class STATE >
Chris@16 1057 struct state_action_result
Chris@16 1058 {
Chris@16 1059 typedef char type;
Chris@16 1060 };
Chris@16 1061 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1062 struct transition_action_result
Chris@16 1063 {
Chris@16 1064 typedef char type;
Chris@16 1065 };
Chris@16 1066 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1067
Chris@16 1068 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1069 char operator()(EVT const& , FSM& ,SourceState& ,TargetState& )
Chris@16 1070 {
Chris@16 1071 return Val;
Chris@16 1072 }
Chris@16 1073 template <class Event,class FSM,class STATE>
Chris@16 1074 char operator()(Event const& ,FSM& ,STATE& )
Chris@16 1075 {
Chris@16 1076 return Val;
Chris@16 1077 }
Chris@16 1078 };
Chris@16 1079
Chris@16 1080 template <size_t Val>
Chris@16 1081 struct Size_t_ : euml_action<Size_t_<Val> >
Chris@16 1082 {
Chris@16 1083 using euml_action<Size_t_<Val> >::operator=;
Chris@16 1084
Chris@16 1085 template <class Event,class FSM,class STATE >
Chris@16 1086 struct state_action_result
Chris@16 1087 {
Chris@16 1088 typedef size_t type;
Chris@16 1089 };
Chris@16 1090 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1091 struct transition_action_result
Chris@16 1092 {
Chris@16 1093 typedef size_t type;
Chris@16 1094 };
Chris@16 1095 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1096
Chris@16 1097 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1098 size_t operator()(EVT const& , FSM& ,SourceState& ,TargetState& )
Chris@16 1099 {
Chris@16 1100 return Val;
Chris@16 1101 }
Chris@16 1102 template <class Event,class FSM,class STATE>
Chris@16 1103 size_t operator()(Event const& ,FSM& ,STATE& )
Chris@16 1104 {
Chris@16 1105 return Val;
Chris@16 1106 }
Chris@16 1107 };
Chris@16 1108
Chris@16 1109 #if BOOST_VERSION >= 104000
Chris@16 1110
Chris@16 1111 template <class T>
Chris@16 1112 struct String_ : euml_action<String_<T> >
Chris@16 1113 {
Chris@16 1114 using euml_action<String_<T> >::operator=;
Chris@16 1115
Chris@16 1116 template <class Event,class FSM,class STATE >
Chris@16 1117 struct state_action_result
Chris@16 1118 {
Chris@16 1119 typedef char const* type;
Chris@16 1120 };
Chris@16 1121 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1122 struct transition_action_result
Chris@16 1123 {
Chris@16 1124 typedef char const* type;
Chris@16 1125 };
Chris@16 1126 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1127
Chris@16 1128 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1129 char const* operator()(EVT const& , FSM& ,SourceState& ,TargetState& )
Chris@16 1130 {
Chris@16 1131 return ::boost::mpl::c_str<T>::value;
Chris@16 1132 }
Chris@16 1133 template <class Event,class FSM,class STATE>
Chris@16 1134 char const* operator()(Event const& ,FSM& ,STATE& )
Chris@16 1135 {
Chris@16 1136 return ::boost::mpl::c_str<T>::value;
Chris@16 1137 }
Chris@16 1138 };
Chris@16 1139 #endif
Chris@16 1140
Chris@16 1141
Chris@16 1142 template <class T>
Chris@16 1143 struct Predicate_ : euml_action<Predicate_<T> >
Chris@16 1144 {
Chris@16 1145 using euml_action<Predicate_<T> >::operator=;
Chris@16 1146
Chris@16 1147 template <class Event,class FSM,class STATE >
Chris@16 1148 struct state_action_result
Chris@16 1149 {
Chris@16 1150 typedef T type;
Chris@16 1151 };
Chris@16 1152 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1153 struct transition_action_result
Chris@16 1154 {
Chris@16 1155 typedef T type;
Chris@16 1156 };
Chris@16 1157 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1158
Chris@16 1159 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1160 T operator()(EVT const& , FSM& ,SourceState& ,TargetState& )
Chris@16 1161 {
Chris@16 1162 return T();
Chris@16 1163 }
Chris@16 1164 template <class Event,class FSM,class STATE>
Chris@16 1165 T operator()(Event const& ,FSM& ,STATE& )
Chris@16 1166 {
Chris@16 1167 return T();
Chris@16 1168 }
Chris@16 1169 };
Chris@16 1170
Chris@16 1171 template <class ToProcessEvt,class Param1, class Param2, class Param3, class Param4>
Chris@16 1172 struct Process_ : euml_action<Process_<ToProcessEvt, Param1, Param2, Param3, Param4> >
Chris@16 1173 {
Chris@16 1174 template <class Event,class FSM,class STATE >
Chris@16 1175 struct state_action_result
Chris@16 1176 {
Chris@16 1177 typedef void type;
Chris@16 1178 };
Chris@16 1179 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1180 struct transition_action_result
Chris@16 1181 {
Chris@16 1182 typedef void type;
Chris@16 1183 };
Chris@16 1184
Chris@16 1185 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1186
Chris@16 1187 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1188 void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 1189 {
Chris@16 1190 (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
Chris@16 1191 (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
Chris@16 1192 (Param3()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
Chris@16 1193 (Param4()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
Chris@16 1194 }
Chris@16 1195 template <class Event,class FSM,class STATE>
Chris@16 1196 void operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 1197 {
Chris@16 1198 (Param1()(evt,fsm,state)).process_event(ToProcessEvt());
Chris@16 1199 (Param2()(evt,fsm,state)).process_event(ToProcessEvt());
Chris@16 1200 (Param3()(evt,fsm,state)).process_event(ToProcessEvt());
Chris@16 1201 (Param4()(evt,fsm,state)).process_event(ToProcessEvt());
Chris@16 1202 }
Chris@16 1203 };
Chris@16 1204 template <class ToProcessEvt>
Chris@16 1205 struct Process_ <ToProcessEvt,void,void,void,void>
Chris@16 1206 : euml_action<Process_<ToProcessEvt, void, void, void, void > >
Chris@16 1207 {
Chris@16 1208 template <class Event,class FSM,class STATE >
Chris@16 1209 struct state_action_result
Chris@16 1210 {
Chris@16 1211 typedef void type;
Chris@16 1212 };
Chris@16 1213 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1214 struct transition_action_result
Chris@16 1215 {
Chris@16 1216 typedef void type;
Chris@16 1217 };
Chris@16 1218
Chris@16 1219 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1220
Chris@16 1221 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1222 void operator()(EVT const&,FSM& fsm,SourceState& ,TargetState& )const
Chris@16 1223 {
Chris@16 1224 fsm.process_event(ToProcessEvt());
Chris@16 1225 }
Chris@16 1226 template <class Event,class FSM,class STATE>
Chris@16 1227 void operator()(Event const& ,FSM& fsm,STATE& )const
Chris@16 1228 {
Chris@16 1229 fsm.process_event(ToProcessEvt());
Chris@16 1230 }
Chris@16 1231 };
Chris@16 1232
Chris@16 1233 template <class ToProcessEvt,class Param1>
Chris@16 1234 struct Process_ <ToProcessEvt,Param1,void,void,void>
Chris@16 1235 : euml_action<Process_<ToProcessEvt, Param1, void, void, void> >
Chris@16 1236 {
Chris@16 1237 template <class Event,class FSM,class STATE >
Chris@16 1238 struct state_action_result
Chris@16 1239 {
Chris@16 1240 typedef void type;
Chris@16 1241 };
Chris@16 1242 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1243 struct transition_action_result
Chris@16 1244 {
Chris@16 1245 typedef void type;
Chris@16 1246 };
Chris@16 1247
Chris@16 1248 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1249
Chris@16 1250 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1251 void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 1252 {
Chris@16 1253 (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
Chris@16 1254 }
Chris@16 1255 template <class Event,class FSM,class STATE>
Chris@16 1256 void operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 1257 {
Chris@16 1258 (Param1()(evt,fsm,state)).process_event(ToProcessEvt());
Chris@16 1259 }
Chris@16 1260 };
Chris@16 1261
Chris@16 1262 template <class ToProcessEvt,class Param1, class Param2>
Chris@16 1263 struct Process_ <ToProcessEvt,Param1,Param2,void,void>
Chris@16 1264 : euml_action<Process_<ToProcessEvt, Param1, Param2, void, void> >
Chris@16 1265 {
Chris@16 1266 template <class Event,class FSM,class STATE >
Chris@16 1267 struct state_action_result
Chris@16 1268 {
Chris@16 1269 typedef void type;
Chris@16 1270 };
Chris@16 1271 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1272 struct transition_action_result
Chris@16 1273 {
Chris@16 1274 typedef void type;
Chris@16 1275 };
Chris@16 1276
Chris@16 1277 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1278
Chris@16 1279 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1280 void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 1281 {
Chris@16 1282 (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
Chris@16 1283 (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
Chris@16 1284 }
Chris@16 1285 template <class Event,class FSM,class STATE>
Chris@16 1286 void operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 1287 {
Chris@16 1288 (Param1()(evt,fsm,state)).process_event(ToProcessEvt());
Chris@16 1289 (Param2()(evt,fsm,state)).process_event(ToProcessEvt());
Chris@16 1290 }
Chris@16 1291 };
Chris@16 1292
Chris@16 1293 template <class ToProcessEvt,class Param1, class Param2, class Param3>
Chris@16 1294 struct Process_ <ToProcessEvt,Param1,Param2,Param3,void>
Chris@16 1295 : euml_action<Process_<ToProcessEvt, Param1, Param2, Param3, void> >
Chris@16 1296 {
Chris@16 1297 template <class Event,class FSM,class STATE >
Chris@16 1298 struct state_action_result
Chris@16 1299 {
Chris@16 1300 typedef void type;
Chris@16 1301 };
Chris@16 1302 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1303 struct transition_action_result
Chris@16 1304 {
Chris@16 1305 typedef void type;
Chris@16 1306 };
Chris@16 1307
Chris@16 1308 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1309
Chris@16 1310 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1311 void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 1312 {
Chris@16 1313 (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
Chris@16 1314 (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
Chris@16 1315 (Param3()(evt,fsm,src,tgt)).process_event(ToProcessEvt());
Chris@16 1316 }
Chris@16 1317 template <class Event,class FSM,class STATE>
Chris@16 1318 void operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 1319 {
Chris@16 1320 (Param1()(evt,fsm,state)).process_event(ToProcessEvt());
Chris@16 1321 (Param2()(evt,fsm,state)).process_event(ToProcessEvt());
Chris@16 1322 (Param3()(evt,fsm,state)).process_event(ToProcessEvt());
Chris@16 1323 }
Chris@16 1324 };
Chris@16 1325
Chris@16 1326 //version for process_(event_)
Chris@16 1327 template <>
Chris@16 1328 struct Process_ <GetEvent_<void>,void,void,void,void>
Chris@16 1329 : euml_action<Process_<GetEvent_<void>, void, void, void, void > >
Chris@16 1330 {
Chris@16 1331 template <class Event,class FSM,class STATE >
Chris@16 1332 struct state_action_result
Chris@16 1333 {
Chris@16 1334 typedef void type;
Chris@16 1335 };
Chris@16 1336 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1337 struct transition_action_result
Chris@16 1338 {
Chris@16 1339 typedef void type;
Chris@16 1340 };
Chris@16 1341
Chris@16 1342 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1343
Chris@16 1344 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1345 void operator()(EVT const& evt,FSM& fsm,SourceState& ,TargetState& )const
Chris@16 1346 {
Chris@16 1347 fsm.process_event(evt);
Chris@16 1348 }
Chris@16 1349 template <class Event,class FSM,class STATE>
Chris@16 1350 void operator()(Event const& evt,FSM& fsm,STATE& )const
Chris@16 1351 {
Chris@16 1352 fsm.process_event(evt);
Chris@16 1353 }
Chris@16 1354 };
Chris@16 1355
Chris@16 1356 struct process_tag {};
Chris@16 1357 struct Process_Helper: proto::extends< proto::terminal<process_tag>::type, Process_Helper, boost::msm::sm_domain>
Chris@16 1358 {
Chris@16 1359 Process_Helper(){}
Chris@16 1360 using proto::extends< proto::terminal<process_tag>::type, Process_Helper, boost::msm::sm_domain>::operator=;
Chris@16 1361 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 1362 #ifdef BOOST_MSVC
Chris@16 1363 ,class Arg6
Chris@16 1364 #endif
Chris@16 1365 >
Chris@16 1366 struct In
Chris@16 1367 {
Chris@16 1368 typedef Process_<Arg1,Arg2,Arg3,Arg4,Arg5> type;
Chris@16 1369 };
Chris@16 1370 };
Chris@16 1371 Process_Helper const process_ = Process_Helper();
Chris@16 1372
Chris@16 1373 template <class Param1, class Param2, class Param3, class Param4>
Chris@16 1374 struct Reprocess_ : euml_action<Reprocess_<Param1, Param2, Param3, Param4> >
Chris@16 1375 {
Chris@16 1376 template <class Event,class FSM,class STATE >
Chris@16 1377 struct state_action_result
Chris@16 1378 {
Chris@16 1379 typedef void type;
Chris@16 1380 };
Chris@16 1381 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1382 struct transition_action_result
Chris@16 1383 {
Chris@16 1384 typedef void type;
Chris@16 1385 };
Chris@16 1386
Chris@16 1387 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1388
Chris@16 1389 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1390 void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 1391 {
Chris@16 1392 (Param1()(evt,fsm,src,tgt)).process_event(evt);
Chris@16 1393 (Param2()(evt,fsm,src,tgt)).process_event(evt);
Chris@16 1394 (Param3()(evt,fsm,src,tgt)).process_event(evt);
Chris@16 1395 (Param4()(evt,fsm,src,tgt)).process_event(evt);
Chris@16 1396 }
Chris@16 1397 template <class Event,class FSM,class STATE>
Chris@16 1398 void operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 1399 {
Chris@16 1400 (Param1()(evt,fsm,state)).process_event(evt);
Chris@16 1401 (Param2()(evt,fsm,state)).process_event(evt);
Chris@16 1402 (Param3()(evt,fsm,state)).process_event(evt);
Chris@16 1403 (Param4()(evt,fsm,state)).process_event(evt);
Chris@16 1404 }
Chris@16 1405 };
Chris@16 1406 template <>
Chris@16 1407 struct Reprocess_ <void,void,void,void>
Chris@16 1408 : euml_action<Reprocess_<void, void, void, void > >
Chris@16 1409 {
Chris@16 1410 template <class Event,class FSM,class STATE >
Chris@16 1411 struct state_action_result
Chris@16 1412 {
Chris@16 1413 typedef void type;
Chris@16 1414 };
Chris@16 1415 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1416 struct transition_action_result
Chris@16 1417 {
Chris@16 1418 typedef void type;
Chris@16 1419 };
Chris@16 1420
Chris@16 1421 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1422
Chris@16 1423 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1424 void operator()(EVT const& evt,FSM& fsm,SourceState& ,TargetState& )const
Chris@16 1425 {
Chris@16 1426 fsm.process_event(evt);
Chris@16 1427 }
Chris@16 1428 template <class Event,class FSM,class STATE>
Chris@16 1429 void operator()(Event const& evt,FSM& fsm,STATE& )const
Chris@16 1430 {
Chris@16 1431 fsm.process_event(evt);
Chris@16 1432 }
Chris@16 1433 };
Chris@16 1434
Chris@16 1435 template <class Param1>
Chris@16 1436 struct Reprocess_ <Param1,void,void,void>
Chris@16 1437 : euml_action<Reprocess_<Param1, void, void, void> >
Chris@16 1438 {
Chris@16 1439 template <class Event,class FSM,class STATE >
Chris@16 1440 struct state_action_result
Chris@16 1441 {
Chris@16 1442 typedef void type;
Chris@16 1443 };
Chris@16 1444 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1445 struct transition_action_result
Chris@16 1446 {
Chris@16 1447 typedef void type;
Chris@16 1448 };
Chris@16 1449
Chris@16 1450 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1451
Chris@16 1452 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1453 void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 1454 {
Chris@16 1455 (Param1()(evt,fsm,src,tgt)).process_event(evt);
Chris@16 1456 }
Chris@16 1457 template <class Event,class FSM,class STATE>
Chris@16 1458 void operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 1459 {
Chris@16 1460 (Param1()(evt,fsm,state)).process_event(evt);
Chris@16 1461 }
Chris@16 1462 };
Chris@16 1463
Chris@16 1464 template <class Param1, class Param2>
Chris@16 1465 struct Reprocess_ <Param1,Param2,void,void>
Chris@16 1466 : euml_action<Reprocess_<Param1, Param2, void, void> >
Chris@16 1467 {
Chris@16 1468 template <class Event,class FSM,class STATE >
Chris@16 1469 struct state_action_result
Chris@16 1470 {
Chris@16 1471 typedef void type;
Chris@16 1472 };
Chris@16 1473 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1474 struct transition_action_result
Chris@16 1475 {
Chris@16 1476 typedef void type;
Chris@16 1477 };
Chris@16 1478
Chris@16 1479 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1480
Chris@16 1481 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1482 void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 1483 {
Chris@16 1484 (Param1()(evt,fsm,src,tgt)).process_event(evt);
Chris@16 1485 (Param2()(evt,fsm,src,tgt)).process_event(evt);
Chris@16 1486 }
Chris@16 1487 template <class Event,class FSM,class STATE>
Chris@16 1488 void operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 1489 {
Chris@16 1490 (Param1()(evt,fsm,state)).process_event(evt);
Chris@16 1491 (Param2()(evt,fsm,state)).process_event(evt);
Chris@16 1492 }
Chris@16 1493 };
Chris@16 1494
Chris@16 1495 template <class Param1, class Param2, class Param3>
Chris@16 1496 struct Reprocess_ <Param1,Param2,Param3,void>
Chris@16 1497 : euml_action<Reprocess_<Param1, Param2, Param3, void> >
Chris@16 1498 {
Chris@16 1499 template <class Event,class FSM,class STATE >
Chris@16 1500 struct state_action_result
Chris@16 1501 {
Chris@16 1502 typedef void type;
Chris@16 1503 };
Chris@16 1504 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1505 struct transition_action_result
Chris@16 1506 {
Chris@16 1507 typedef void type;
Chris@16 1508 };
Chris@16 1509
Chris@16 1510 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1511
Chris@16 1512 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1513 void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 1514 {
Chris@16 1515 (Param1()(evt,fsm,src,tgt)).process_event(evt);
Chris@16 1516 (Param2()(evt,fsm,src,tgt)).process_event(evt);
Chris@16 1517 (Param3()(evt,fsm,src,tgt)).process_event(evt);
Chris@16 1518 }
Chris@16 1519 template <class Event,class FSM,class STATE>
Chris@16 1520 void operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 1521 {
Chris@16 1522 (Param1()(evt,fsm,state)).process_event(evt);
Chris@16 1523 (Param2()(evt,fsm,state)).process_event(evt);
Chris@16 1524 (Param3()(evt,fsm,state)).process_event(evt);
Chris@16 1525 }
Chris@16 1526 };
Chris@16 1527 struct reprocess_tag {};
Chris@16 1528 struct Reprocess_Helper: proto::extends< proto::terminal<reprocess_tag>::type, Reprocess_Helper, boost::msm::sm_domain>
Chris@16 1529 {
Chris@16 1530 Reprocess_Helper(){}
Chris@16 1531 using proto::extends< proto::terminal<reprocess_tag>::type, Reprocess_Helper, boost::msm::sm_domain>::operator=;
Chris@16 1532 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 1533 #ifdef BOOST_MSVC
Chris@16 1534 ,class Arg6
Chris@16 1535 #endif
Chris@16 1536 >
Chris@16 1537 struct In
Chris@16 1538 {
Chris@16 1539 typedef Reprocess_<Arg1,Arg2,Arg3,Arg4> type;
Chris@16 1540 };
Chris@16 1541 };
Chris@16 1542 Reprocess_Helper const reprocess_ = Reprocess_Helper();
Chris@16 1543
Chris@16 1544 template <class ToProcessEvt,class Value,class Param1, class Param2, class Param3>
Chris@16 1545 struct Process2_ : euml_action<Process2_<ToProcessEvt,Value, Param1, Param2, Param3> >
Chris@16 1546 {
Chris@16 1547 template <class Event,class FSM,class STATE >
Chris@16 1548 struct state_action_result
Chris@16 1549 {
Chris@16 1550 typedef void type;
Chris@16 1551 };
Chris@16 1552 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1553 struct transition_action_result
Chris@16 1554 {
Chris@16 1555 typedef void type;
Chris@16 1556 };
Chris@16 1557
Chris@16 1558 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1559
Chris@16 1560 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1561 void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 1562 {
Chris@16 1563 (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
Chris@16 1564 (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
Chris@16 1565 (Param3()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
Chris@16 1566 }
Chris@16 1567 template <class Event,class FSM,class STATE>
Chris@16 1568 void operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 1569 {
Chris@16 1570 (Param1()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state)));
Chris@16 1571 (Param2()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state)));
Chris@16 1572 (Param3()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state)));
Chris@16 1573 }
Chris@16 1574 };
Chris@16 1575
Chris@16 1576 template <class ToProcessEvt,class Value>
Chris@16 1577 struct Process2_ <ToProcessEvt,Value,void,void,void>
Chris@16 1578 : euml_action<Process2_<ToProcessEvt,Value, void, void, void > >
Chris@16 1579 {
Chris@16 1580 template <class Event,class FSM,class STATE >
Chris@16 1581 struct state_action_result
Chris@16 1582 {
Chris@16 1583 typedef void type;
Chris@16 1584 };
Chris@16 1585 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1586 struct transition_action_result
Chris@16 1587 {
Chris@16 1588 typedef void type;
Chris@16 1589 };
Chris@16 1590
Chris@16 1591 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1592
Chris@16 1593 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1594 void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 1595 {
Chris@16 1596 fsm.process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
Chris@16 1597 }
Chris@16 1598 template <class Event,class FSM,class STATE>
Chris@16 1599 void operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 1600 {
Chris@16 1601 fsm.process_event(ToProcessEvt(Value()(evt,fsm,state)));
Chris@16 1602 }
Chris@16 1603 };
Chris@16 1604
Chris@16 1605 template <class ToProcessEvt,class Value,class Param1>
Chris@16 1606 struct Process2_ <ToProcessEvt,Value,Param1,void,void>
Chris@16 1607 : euml_action<Process2_<ToProcessEvt,Value, Param1, void, void> >
Chris@16 1608 {
Chris@16 1609 template <class Event,class FSM,class STATE >
Chris@16 1610 struct state_action_result
Chris@16 1611 {
Chris@16 1612 typedef void type;
Chris@16 1613 };
Chris@16 1614 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1615 struct transition_action_result
Chris@16 1616 {
Chris@16 1617 typedef void type;
Chris@16 1618 };
Chris@16 1619
Chris@16 1620 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1621
Chris@16 1622 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1623 void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 1624 {
Chris@16 1625 (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
Chris@16 1626 }
Chris@16 1627 template <class Event,class FSM,class STATE>
Chris@16 1628 void operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 1629 {
Chris@16 1630 (Param1()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state)));
Chris@16 1631 }
Chris@16 1632 };
Chris@16 1633
Chris@16 1634 template <class ToProcessEvt,class Value,class Param1, class Param2>
Chris@16 1635 struct Process2_ <ToProcessEvt,Value,Param1,Param2,void>
Chris@16 1636 : euml_action<Process2_<ToProcessEvt,Value, Param1, Param2, void> >
Chris@16 1637 {
Chris@16 1638 template <class Event,class FSM,class STATE >
Chris@16 1639 struct state_action_result
Chris@16 1640 {
Chris@16 1641 typedef void type;
Chris@16 1642 };
Chris@16 1643 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1644 struct transition_action_result
Chris@16 1645 {
Chris@16 1646 typedef void type;
Chris@16 1647 };
Chris@16 1648
Chris@16 1649 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1650
Chris@16 1651 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1652 void operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 1653 {
Chris@16 1654 (Param1()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
Chris@16 1655 (Param2()(evt,fsm,src,tgt)).process_event(ToProcessEvt(Value()(evt,fsm,src,tgt)));
Chris@16 1656 }
Chris@16 1657 template <class Event,class FSM,class STATE>
Chris@16 1658 void operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 1659 {
Chris@16 1660 (Param1()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state)));
Chris@16 1661 (Param2()(evt,fsm,state)).process_event(ToProcessEvt(Value()(evt,fsm,state)));
Chris@16 1662 }
Chris@16 1663 };
Chris@16 1664
Chris@16 1665 struct process2_tag {};
Chris@16 1666 struct Process2_Helper : proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, boost::msm::sm_domain>
Chris@16 1667 {
Chris@16 1668 Process2_Helper(){}
Chris@16 1669 using proto::extends< proto::terminal<process2_tag>::type, Process2_Helper, boost::msm::sm_domain>::operator=;
Chris@16 1670 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 1671 #ifdef BOOST_MSVC
Chris@16 1672 ,class Arg6
Chris@16 1673 #endif
Chris@16 1674 >
Chris@16 1675 struct In
Chris@16 1676 {
Chris@16 1677 typedef Process2_<Arg1,Arg2,Arg3,Arg4,Arg5> type;
Chris@16 1678 };
Chris@16 1679 };
Chris@16 1680 Process2_Helper const process2_ = Process2_Helper();
Chris@16 1681
Chris@16 1682 template <class Flag,class Param1=void, class Enable=void >
Chris@16 1683 struct Get_Flag_ : euml_action<Get_Flag_<Flag,Param1,Enable> > {};
Chris@16 1684
Chris@16 1685 template <class Flag,class Param1>
Chris@16 1686 struct Get_Flag_ <Flag,Param1
Chris@16 1687 , typename ::boost::enable_if<typename ::boost::is_same<Param1,void>::type >::type>
Chris@16 1688 : euml_action<Get_Flag_<Flag, Param1> >
Chris@16 1689 {
Chris@16 1690 template <class Event,class FSM,class STATE >
Chris@16 1691 struct state_action_result
Chris@16 1692 {
Chris@16 1693 typedef bool type;
Chris@16 1694 };
Chris@16 1695 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1696 struct transition_action_result
Chris@16 1697 {
Chris@16 1698 typedef bool type;
Chris@16 1699 };
Chris@16 1700
Chris@16 1701 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1702
Chris@16 1703 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1704 bool operator()(EVT const&,FSM& fsm,SourceState& ,TargetState& )const
Chris@16 1705 {
Chris@16 1706 return fsm.template is_flag_active<Flag>();
Chris@16 1707 }
Chris@16 1708 template <class Event,class FSM,class STATE>
Chris@16 1709 bool operator()(Event const& ,FSM& fsm,STATE& )const
Chris@16 1710 {
Chris@16 1711 return fsm.template is_flag_active<Flag>();
Chris@16 1712 }
Chris@16 1713 };
Chris@16 1714
Chris@16 1715 template <class Flag,class Param1>
Chris@16 1716 struct Get_Flag_ <Flag,Param1
Chris@16 1717 , typename ::boost::disable_if<
Chris@16 1718 typename ::boost::is_same<Param1,void>::type
Chris@16 1719 >::type>
Chris@16 1720 : euml_action<Get_Flag_<Flag, Param1> >
Chris@16 1721 {
Chris@16 1722 template <class Event,class FSM,class STATE >
Chris@16 1723 struct state_action_result
Chris@16 1724 {
Chris@16 1725 typedef bool type;
Chris@16 1726 };
Chris@16 1727 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1728 struct transition_action_result
Chris@16 1729 {
Chris@16 1730 typedef bool type;
Chris@16 1731 };
Chris@16 1732
Chris@16 1733 typedef ::boost::mpl::set<state_action_tag,action_tag> tag_type;
Chris@16 1734
Chris@16 1735 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1736 bool operator()(EVT const& evt,FSM& fsm,SourceState& src,TargetState& tgt)const
Chris@16 1737 {
Chris@16 1738 return (Param1()(evt,fsm,src,tgt)).template is_flag_active<Flag>();
Chris@16 1739 }
Chris@16 1740 template <class Event,class FSM,class STATE>
Chris@16 1741 bool operator()(Event const& evt,FSM& fsm,STATE& state)const
Chris@16 1742 {
Chris@16 1743 return (Param1()(evt,fsm,state)).template is_flag_active<Flag>();
Chris@16 1744 }
Chris@16 1745 };
Chris@16 1746
Chris@16 1747 struct Get_Flag_Helper: proto::extends< proto::terminal<fsm_artefact_tag>::type, Get_Flag_Helper, boost::msm::sm_domain>
Chris@16 1748 {
Chris@16 1749 Get_Flag_Helper(){}
Chris@16 1750 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 1751 #ifdef BOOST_MSVC
Chris@16 1752 ,class Arg6
Chris@16 1753 #endif
Chris@16 1754 >
Chris@16 1755 struct In
Chris@16 1756 {
Chris@16 1757 typedef Get_Flag_<Arg1,Arg2> type;
Chris@16 1758 };
Chris@16 1759 };
Chris@16 1760 Get_Flag_Helper const is_flag_ = Get_Flag_Helper();
Chris@16 1761
Chris@16 1762 // deferring an event
Chris@16 1763 struct DeferEvent_ : euml_action< DeferEvent_ >
Chris@16 1764 {
Chris@16 1765 typedef ::boost::mpl::set<action_tag> tag_type;
Chris@16 1766 // mark as deferring to avoid stack overflows in certain conditions
Chris@16 1767 typedef int deferring_action;
Chris@16 1768 template <class EVT,class FSM,class SourceState,class TargetState>
Chris@16 1769 void operator()(EVT const& evt,FSM& fsm,SourceState& ,TargetState& ) const
Chris@16 1770 {
Chris@16 1771 fsm.defer_event(evt);
Chris@16 1772 }
Chris@16 1773 };
Chris@16 1774 struct Defer_Helper : proto::extends< proto::terminal<fsm_artefact_tag>::type, Defer_Helper, boost::msm::sm_domain>
Chris@16 1775 {
Chris@16 1776 Defer_Helper(){}
Chris@16 1777 using proto::extends< proto::terminal<fsm_artefact_tag>::type, Defer_Helper, boost::msm::sm_domain>::operator=;
Chris@16 1778 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 1779 #ifdef BOOST_MSVC
Chris@16 1780 ,class Arg6
Chris@16 1781 #endif
Chris@16 1782 >
Chris@16 1783 struct In
Chris@16 1784 {
Chris@16 1785 typedef DeferEvent_ type;
Chris@16 1786 };
Chris@16 1787 };
Chris@16 1788 Defer_Helper const defer_ = Defer_Helper();
Chris@16 1789
Chris@16 1790 struct explicit_tag {};
Chris@16 1791 struct Explicit_Helper : proto::extends< proto::terminal<explicit_tag>::type, Explicit_Helper, boost::msm::sm_domain>
Chris@16 1792 {
Chris@16 1793 Explicit_Helper(){}
Chris@16 1794 using proto::extends< proto::terminal<explicit_tag>::type, Explicit_Helper, boost::msm::sm_domain>::operator=;
Chris@16 1795 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 1796 #ifdef BOOST_MSVC
Chris@16 1797 ,class Arg6
Chris@16 1798 #endif
Chris@16 1799 >
Chris@16 1800 struct In
Chris@16 1801 {
Chris@16 1802 typedef typename Arg1::template direct<Arg2> type;
Chris@16 1803 };
Chris@16 1804 };
Chris@16 1805 Explicit_Helper const explicit_ = Explicit_Helper();
Chris@16 1806
Chris@16 1807 struct entry_pt_tag {};
Chris@16 1808 struct Entry_Pt_Helper : proto::extends< proto::terminal<entry_pt_tag>::type, Entry_Pt_Helper, boost::msm::sm_domain>
Chris@16 1809 {
Chris@16 1810 Entry_Pt_Helper(){}
Chris@16 1811 using proto::extends< proto::terminal<entry_pt_tag>::type, Entry_Pt_Helper, boost::msm::sm_domain>::operator=;
Chris@16 1812 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 1813 #ifdef BOOST_MSVC
Chris@16 1814 ,class Arg6
Chris@16 1815 #endif
Chris@16 1816 >
Chris@16 1817 struct In
Chris@16 1818 {
Chris@16 1819 typedef typename Arg1::template entry_pt<Arg2> type;
Chris@16 1820 };
Chris@16 1821 };
Chris@16 1822 Entry_Pt_Helper const entry_pt_ = Entry_Pt_Helper();
Chris@16 1823
Chris@16 1824 struct exit_pt_tag {};
Chris@16 1825 struct Exit_Pt_Helper : proto::extends< proto::terminal<exit_pt_tag>::type, Exit_Pt_Helper, boost::msm::sm_domain>
Chris@16 1826 {
Chris@16 1827 Exit_Pt_Helper(){}
Chris@16 1828 using proto::extends< proto::terminal<exit_pt_tag>::type, Exit_Pt_Helper, boost::msm::sm_domain>::operator=;
Chris@16 1829 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
Chris@16 1830 #ifdef BOOST_MSVC
Chris@16 1831 ,class Arg6
Chris@16 1832 #endif
Chris@16 1833 >
Chris@16 1834 struct In
Chris@16 1835 {
Chris@16 1836 typedef typename Arg1::template exit_pt<Arg2> type;
Chris@16 1837 };
Chris@16 1838 };
Chris@16 1839 Exit_Pt_Helper const exit_pt_ = Exit_Pt_Helper();
Chris@16 1840
Chris@16 1841 #ifdef BOOST_MSVC
Chris@16 1842 #define BOOST_MSM_EUML_FUNCTION(functor,function,function_name,result_trans,result_state) \
Chris@16 1843 template <class Param1=void , class Param2=void , class Param3=void , class Param4=void, \
Chris@16 1844 class Param5=void,class Param6=void,class Enable=void > \
Chris@16 1845 struct functor : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6,Enable> > {}; \
Chris@16 1846 template <class Param1, class Param2, class Param3, class Param4, class Param5, class Param6> \
Chris@16 1847 struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
Chris@16 1848 typename ::boost::enable_if<typename ::boost::is_same<Param1,void>::type>::type> \
Chris@16 1849 : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
Chris@16 1850 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 1851 typedef result_state type;} ; \
Chris@16 1852 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1853 struct transition_action_result { typedef result_trans type;}; \
Chris@16 1854 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 1855 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1856 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type \
Chris@16 1857 operator()(EVT const& , FSM& ,SourceState& ,TargetState& )const { \
Chris@16 1858 return function ();} \
Chris@16 1859 template <class Event,class FSM,class STATE> \
Chris@16 1860 typename state_action_result<Event,FSM,STATE>::type \
Chris@16 1861 operator()(Event const& ,FSM& ,STATE& )const { \
Chris@16 1862 return function ();} }; \
Chris@16 1863 template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
Chris@16 1864 struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
Chris@16 1865 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 1866 typename ::boost::is_same<Param1,void>::type,typename ::boost::mpl::not_< \
Chris@16 1867 typename ::boost::is_same<Param2,void>::type>::type>::type >::type> \
Chris@16 1868 : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
Chris@16 1869 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 1870 typedef result_state type;} ; \
Chris@16 1871 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1872 struct transition_action_result { typedef result_trans type;}; \
Chris@16 1873 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 1874 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1875 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 1876 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 1877 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 1878 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 1879 return function (Param1()(evt,fsm,src,tgt));} \
Chris@16 1880 template <class Event,class FSM,class STATE> \
Chris@16 1881 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 1882 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 1883 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 1884 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 1885 return function (Param1()(evt,fsm,state));} }; \
Chris@16 1886 template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
Chris@16 1887 struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
Chris@16 1888 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 1889 typename ::boost::is_same<Param2,void>::type,typename ::boost::mpl::not_< \
Chris@16 1890 typename ::boost::is_same<Param3,void>::type>::type>::type >::type> \
Chris@16 1891 : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
Chris@16 1892 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 1893 typedef result_state type;} ; \
Chris@16 1894 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1895 struct transition_action_result { typedef result_trans type;}; \
Chris@16 1896 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 1897 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1898 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 1899 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 1900 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 1901 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 1902 return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));} \
Chris@16 1903 template <class Event,class FSM,class STATE> \
Chris@16 1904 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 1905 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 1906 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 1907 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 1908 return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state));} }; \
Chris@16 1909 template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
Chris@16 1910 struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
Chris@16 1911 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 1912 typename ::boost::is_same<Param3,void>::type,typename ::boost::mpl::not_< \
Chris@16 1913 typename ::boost::is_same<Param4,void>::type>::type>::type >::type> \
Chris@16 1914 : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
Chris@16 1915 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 1916 typedef result_state type;} ; \
Chris@16 1917 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1918 struct transition_action_result { typedef result_trans type;}; \
Chris@16 1919 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 1920 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1921 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 1922 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 1923 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 1924 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 1925 return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));} \
Chris@16 1926 template <class Event,class FSM,class STATE> \
Chris@16 1927 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 1928 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 1929 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 1930 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 1931 return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state));} }; \
Chris@16 1932 template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
Chris@16 1933 struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
Chris@16 1934 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 1935 typename ::boost::is_same<Param4,void>::type,typename ::boost::mpl::not_< \
Chris@16 1936 typename ::boost::is_same<Param5,void>::type>::type>::type >::type> \
Chris@16 1937 : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
Chris@16 1938 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 1939 typedef result_state type;} ; \
Chris@16 1940 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1941 struct transition_action_result { typedef result_trans type;}; \
Chris@16 1942 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 1943 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1944 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 1945 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 1946 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 1947 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 1948 return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
Chris@16 1949 ,Param4()(evt,fsm,src,tgt));} \
Chris@16 1950 template <class Event,class FSM,class STATE> \
Chris@16 1951 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 1952 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 1953 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 1954 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 1955 return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
Chris@16 1956 ,Param4()(evt,fsm,state));} }; \
Chris@16 1957 template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
Chris@16 1958 struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
Chris@16 1959 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 1960 typename ::boost::is_same<Param5,void>::type,typename ::boost::mpl::not_< \
Chris@16 1961 typename ::boost::is_same<Param6,void>::type>::type>::type >::type> \
Chris@16 1962 : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
Chris@16 1963 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 1964 typedef result_state type;} ; \
Chris@16 1965 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1966 struct transition_action_result { typedef result_trans type;}; \
Chris@16 1967 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 1968 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1969 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 1970 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 1971 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 1972 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 1973 return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
Chris@16 1974 ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt));} \
Chris@16 1975 template <class Event,class FSM,class STATE> \
Chris@16 1976 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 1977 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 1978 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 1979 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 1980 return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
Chris@16 1981 ,Param4()(evt,fsm,state),Param5()(evt,fsm,state));} }; \
Chris@16 1982 template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
Chris@16 1983 struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
Chris@16 1984 typename ::boost::disable_if<typename ::boost::is_same<Param6,void>::type>::type> \
Chris@16 1985 : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
Chris@16 1986 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 1987 typedef result_state type;} ; \
Chris@16 1988 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1989 struct transition_action_result { typedef result_trans type;}; \
Chris@16 1990 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 1991 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 1992 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 1993 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 1994 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 1995 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 1996 return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
Chris@16 1997 ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt),Param6()(evt,fsm,src,tgt));} \
Chris@16 1998 template <class Event,class FSM,class STATE> \
Chris@16 1999 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2000 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2001 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2002 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2003 return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
Chris@16 2004 ,Param4()(evt,fsm,state),Param5()(evt,fsm,state),Param6()(evt,fsm,state));} }; \
Chris@16 2005 struct function_name ## tag{}; \
Chris@16 2006 struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type, \
Chris@16 2007 functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){} \
Chris@16 2008 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5,class Arg6> \
Chris@16 2009 struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5,Arg6> type;}; }; \
Chris@16 2010 functor ## Helper const function_name = functor ## Helper ();
Chris@16 2011
Chris@16 2012 #define BOOST_MSM_EUML_METHOD(functor,function,function_name,result_trans,result_state) \
Chris@16 2013 template <class Param1=void , class Param2=void , class Param3=void , class Param4=void, \
Chris@16 2014 class Param5=void,class Param6=void,class Enable=void > \
Chris@16 2015 struct functor : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6,Enable> > {}; \
Chris@16 2016 template <class Param1, class Param2, class Param3, class Param4, class Param5, class Param6> \
Chris@16 2017 struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
Chris@16 2018 typename ::boost::enable_if<typename ::boost::is_same<Param2,void>::type>::type> \
Chris@16 2019 : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
Chris@16 2020 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2021 typedef result_state type;} ; \
Chris@16 2022 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2023 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2024 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2025 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2026 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2027 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2028 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2029 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2030 return (Param1()(evt,fsm,src,tgt)).function();} \
Chris@16 2031 template <class Event,class FSM,class STATE> \
Chris@16 2032 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2033 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2034 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2035 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2036 return (Param1()(evt,fsm,state)).function();} }; \
Chris@16 2037 template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
Chris@16 2038 struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
Chris@16 2039 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 2040 typename ::boost::is_same<Param2,void>::type,typename ::boost::mpl::not_< \
Chris@16 2041 typename ::boost::is_same<Param3,void>::type>::type>::type >::type> \
Chris@16 2042 : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
Chris@16 2043 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2044 typedef result_state type;} ; \
Chris@16 2045 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2046 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2047 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2048 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2049 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2050 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2051 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2052 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2053 return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt));} \
Chris@16 2054 template <class Event,class FSM,class STATE> \
Chris@16 2055 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2056 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2057 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2058 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2059 return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state));} }; \
Chris@16 2060 template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
Chris@16 2061 struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
Chris@16 2062 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 2063 typename ::boost::is_same<Param3,void>::type,typename ::boost::mpl::not_< \
Chris@16 2064 typename ::boost::is_same<Param4,void>::type>::type>::type >::type> \
Chris@16 2065 : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
Chris@16 2066 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2067 typedef result_state type;} ; \
Chris@16 2068 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2069 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2070 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2071 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2072 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2073 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2074 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2075 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2076 return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));} \
Chris@16 2077 template <class Event,class FSM,class STATE> \
Chris@16 2078 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2079 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2080 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2081 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2082 return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state));} }; \
Chris@16 2083 template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
Chris@16 2084 struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
Chris@16 2085 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 2086 typename ::boost::is_same<Param4,void>::type,typename ::boost::mpl::not_< \
Chris@16 2087 typename ::boost::is_same<Param5,void>::type>::type>::type >::type> \
Chris@16 2088 : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
Chris@16 2089 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2090 typedef result_state type;} ; \
Chris@16 2091 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2092 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2093 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2094 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2095 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2096 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2097 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2098 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2099 return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
Chris@16 2100 ,Param4()(evt,fsm,src,tgt));} \
Chris@16 2101 template <class Event,class FSM,class STATE> \
Chris@16 2102 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2103 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2104 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2105 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2106 return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
Chris@16 2107 ,Param4()(evt,fsm,state));} }; \
Chris@16 2108 template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
Chris@16 2109 struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
Chris@16 2110 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 2111 typename ::boost::is_same<Param5,void>::type,typename ::boost::mpl::not_< \
Chris@16 2112 typename ::boost::is_same<Param6,void>::type>::type>::type >::type> \
Chris@16 2113 : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
Chris@16 2114 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2115 typedef result_state type;} ; \
Chris@16 2116 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2117 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2118 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2119 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2120 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2121 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2122 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2123 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2124 return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
Chris@16 2125 ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt));} \
Chris@16 2126 template <class Event,class FSM,class STATE> \
Chris@16 2127 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2128 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2129 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2130 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2131 return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
Chris@16 2132 ,Param4()(evt,fsm,state),Param5()(evt,fsm,state));} }; \
Chris@16 2133 template <class Param1, class Param2, class Param3, class Param4, class Param5,class Param6> \
Chris@16 2134 struct functor<Param1,Param2,Param3,Param4,Param5,Param6, \
Chris@16 2135 typename ::boost::disable_if<typename ::boost::is_same<Param6,void>::type>::type> \
Chris@16 2136 : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Param6> > { \
Chris@16 2137 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2138 typedef result_state type;} ; \
Chris@16 2139 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2140 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2141 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2142 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2143 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2144 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2145 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2146 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2147 return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
Chris@16 2148 ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt),Param6()(evt,fsm,src,tgt));} \
Chris@16 2149 template <class Event,class FSM,class STATE> \
Chris@16 2150 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2151 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2152 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2153 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2154 return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
Chris@16 2155 ,Param4()(evt,fsm,state),Param5()(evt,fsm,state),Param6()(evt,fsm,state));} }; \
Chris@16 2156 struct function_name ## tag{}; \
Chris@16 2157 struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type, \
Chris@16 2158 functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){} \
Chris@16 2159 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5,class Arg6> \
Chris@16 2160 struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5,Arg6> type;}; }; \
Chris@16 2161 functor ## Helper const function_name = functor ## Helper ();
Chris@16 2162
Chris@16 2163 #else
Chris@16 2164
Chris@16 2165 #define BOOST_MSM_EUML_FUNCTION(functor,function,function_name,result_trans,result_state) \
Chris@16 2166 template <class Param1=void , class Param2=void , class Param3=void , class Param4=void, \
Chris@16 2167 class Param5=void,class Enable=void > \
Chris@16 2168 struct functor : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Enable> > {}; \
Chris@16 2169 template <class Param1, class Param2, class Param3, class Param4, class Param5> \
Chris@16 2170 struct functor<Param1,Param2,Param3,Param4,Param5, \
Chris@16 2171 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 2172 typename ::boost::is_same<Param1,void>::type,typename ::boost::mpl::not_< \
Chris@16 2173 typename ::boost::is_same<Param2,void>::type>::type>::type >::type> \
Chris@16 2174 : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
Chris@16 2175 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2176 typedef result_state type;} ; \
Chris@16 2177 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2178 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2179 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2180 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2181 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2182 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2183 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2184 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2185 return function (Param1()(evt,fsm,src,tgt));} \
Chris@16 2186 template <class Event,class FSM,class STATE> \
Chris@16 2187 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2188 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2189 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2190 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2191 return function (Param1()(evt,fsm,state));} }; \
Chris@16 2192 template <class Param1, class Param2, class Param3, class Param4, class Param5> \
Chris@16 2193 struct functor<Param1,Param2,Param3,Param4,Param5, \
Chris@16 2194 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 2195 typename ::boost::is_same<Param2,void>::type,typename ::boost::mpl::not_< \
Chris@16 2196 typename ::boost::is_same<Param3,void>::type>::type>::type >::type> \
Chris@16 2197 : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
Chris@16 2198 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2199 typedef result_state type;} ; \
Chris@16 2200 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2201 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2202 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2203 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2204 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2205 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2206 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2207 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2208 return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt));} \
Chris@16 2209 template <class Event,class FSM,class STATE> \
Chris@16 2210 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2211 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2212 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2213 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2214 return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state));} }; \
Chris@16 2215 template <class Param1, class Param2, class Param3, class Param4, class Param5> \
Chris@16 2216 struct functor<Param1,Param2,Param3,Param4,Param5, \
Chris@16 2217 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 2218 typename ::boost::is_same<Param3,void>::type,typename ::boost::mpl::not_< \
Chris@16 2219 typename ::boost::is_same<Param4,void>::type>::type>::type >::type> \
Chris@16 2220 : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
Chris@16 2221 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2222 typedef result_state type;} ; \
Chris@16 2223 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2224 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2225 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2226 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2227 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2228 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2229 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2230 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2231 return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));} \
Chris@16 2232 template <class Event,class FSM,class STATE> \
Chris@16 2233 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2234 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2235 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2236 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2237 return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state));} }; \
Chris@16 2238 template <class Param1, class Param2, class Param3, class Param4, class Param5> \
Chris@16 2239 struct functor<Param1,Param2,Param3,Param4,Param5, \
Chris@16 2240 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 2241 typename ::boost::is_same<Param4,void>::type,typename ::boost::mpl::not_< \
Chris@16 2242 typename ::boost::is_same<Param5,void>::type>::type>::type >::type> \
Chris@16 2243 : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
Chris@16 2244 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2245 typedef result_state type;} ; \
Chris@16 2246 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2247 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2248 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2249 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2250 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2251 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2252 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2253 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2254 return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
Chris@16 2255 ,Param4()(evt,fsm,src,tgt));} \
Chris@16 2256 template <class Event,class FSM,class STATE> \
Chris@16 2257 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2258 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2259 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2260 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2261 return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
Chris@16 2262 ,Param4()(evt,fsm,state));} }; \
Chris@16 2263 template <class Param1, class Param2, class Param3, class Param4, class Param5> \
Chris@16 2264 struct functor<Param1,Param2,Param3,Param4,Param5, \
Chris@16 2265 typename ::boost::disable_if<typename ::boost::is_same<Param5,void>::type>::type> \
Chris@16 2266 : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
Chris@16 2267 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2268 typedef result_state type;} ; \
Chris@16 2269 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2270 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2271 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2272 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2273 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2274 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2275 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2276 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2277 return function (Param1()(evt,fsm,src,tgt),Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
Chris@16 2278 ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt));} \
Chris@16 2279 template <class Event,class FSM,class STATE> \
Chris@16 2280 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2281 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2282 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2283 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2284 return function (Param1()(evt,fsm,state),Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
Chris@16 2285 ,Param4()(evt,fsm,state),Param5()(evt,fsm,state));} }; \
Chris@16 2286 struct function_name ## tag{}; \
Chris@16 2287 struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type, \
Chris@16 2288 functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){} \
Chris@16 2289 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5> \
Chris@16 2290 struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5> type;}; }; \
Chris@16 2291 functor ## Helper const function_name = functor ## Helper ();
Chris@16 2292
Chris@16 2293 #define BOOST_MSM_EUML_METHOD(functor,function,function_name,result_trans,result_state) \
Chris@16 2294 template <class Param1=void , class Param2=void , class Param3=void , class Param4=void, \
Chris@16 2295 class Param5=void,class Enable=void > \
Chris@16 2296 struct functor : euml_action<functor<Param1,Param2,Param3,Param4,Param5,Enable> > {}; \
Chris@16 2297 template <class Param1, class Param2, class Param3, class Param4, class Param5> \
Chris@16 2298 struct functor<Param1,Param2,Param3,Param4,Param5, \
Chris@16 2299 typename ::boost::enable_if<typename ::boost::is_same<Param2,void>::type>::type> \
Chris@16 2300 : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
Chris@16 2301 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2302 typedef result_state type;} ; \
Chris@16 2303 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2304 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2305 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2306 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2307 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2308 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2309 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2310 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2311 return (Param1()(evt,fsm,src,tgt)).function();} \
Chris@16 2312 template <class Event,class FSM,class STATE> \
Chris@16 2313 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2314 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2315 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2316 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2317 return (Param1()(evt,fsm,state)).function();} }; \
Chris@16 2318 template <class Param1, class Param2, class Param3, class Param4, class Param5> \
Chris@16 2319 struct functor<Param1,Param2,Param3,Param4,Param5, \
Chris@16 2320 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 2321 typename ::boost::is_same<Param2,void>::type,typename ::boost::mpl::not_< \
Chris@16 2322 typename ::boost::is_same<Param3,void>::type>::type>::type >::type> \
Chris@16 2323 : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
Chris@16 2324 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2325 typedef result_state type;} ; \
Chris@16 2326 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2327 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2328 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2329 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2330 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2331 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2332 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2333 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2334 return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt));} \
Chris@16 2335 template <class Event,class FSM,class STATE> \
Chris@16 2336 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2337 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2338 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2339 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2340 return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state));} }; \
Chris@16 2341 template <class Param1, class Param2, class Param3, class Param4, class Param5> \
Chris@16 2342 struct functor<Param1,Param2,Param3,Param4,Param5, \
Chris@16 2343 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 2344 typename ::boost::is_same<Param3,void>::type,typename ::boost::mpl::not_< \
Chris@16 2345 typename ::boost::is_same<Param4,void>::type>::type>::type >::type> \
Chris@16 2346 : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
Chris@16 2347 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2348 typedef result_state type;} ; \
Chris@16 2349 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2350 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2351 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2352 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2353 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2354 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2355 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2356 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2357 return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt));} \
Chris@16 2358 template <class Event,class FSM,class STATE> \
Chris@16 2359 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2360 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2361 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2362 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2363 return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state));} }; \
Chris@16 2364 template <class Param1, class Param2, class Param3, class Param4, class Param5> \
Chris@16 2365 struct functor<Param1,Param2,Param3,Param4,Param5, \
Chris@16 2366 typename ::boost::disable_if<typename ::boost::mpl::or_< \
Chris@16 2367 typename ::boost::is_same<Param4,void>::type,typename ::boost::mpl::not_< \
Chris@16 2368 typename ::boost::is_same<Param5,void>::type>::type>::type >::type> \
Chris@16 2369 : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
Chris@16 2370 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2371 typedef result_state type;} ; \
Chris@16 2372 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2373 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2374 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2375 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2376 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2377 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2378 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2379 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2380 return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
Chris@16 2381 ,Param4()(evt,fsm,src,tgt));} \
Chris@16 2382 template <class Event,class FSM,class STATE> \
Chris@16 2383 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2384 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2385 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2386 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2387 return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
Chris@16 2388 ,Param4()(evt,fsm,state));} }; \
Chris@16 2389 template <class Param1, class Param2, class Param3, class Param4, class Param5> \
Chris@16 2390 struct functor<Param1,Param2,Param3,Param4,Param5, \
Chris@16 2391 typename ::boost::disable_if<typename ::boost::is_same<Param5,void>::type>::type> \
Chris@16 2392 : euml_action<functor<Param1,Param2,Param3,Param4,Param5> > { \
Chris@16 2393 template <class Event,class FSM,class STATE > struct state_action_result { \
Chris@16 2394 typedef result_state type;} ; \
Chris@16 2395 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2396 struct transition_action_result { typedef result_trans type;}; \
Chris@16 2397 typedef ::boost::mpl::set<boost::msm::front::state_action_tag,boost::msm::front::action_tag> tag_type; \
Chris@16 2398 template <class EVT,class FSM,class SourceState,class TargetState> \
Chris@16 2399 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2400 typename Param1::tag_type,boost::msm::front::action_tag>::type, \
Chris@16 2401 typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type \
Chris@16 2402 operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const { \
Chris@16 2403 return (Param1()(evt,fsm,src,tgt)).function(Param2()(evt,fsm,src,tgt),Param3()(evt,fsm,src,tgt) \
Chris@16 2404 ,Param4()(evt,fsm,src,tgt),Param5()(evt,fsm,src,tgt));} \
Chris@16 2405 template <class Event,class FSM,class STATE> \
Chris@16 2406 typename ::boost::enable_if<typename ::boost::mpl::has_key< \
Chris@16 2407 typename Param1::tag_type,boost::msm::front::state_action_tag>::type, \
Chris@16 2408 typename state_action_result<Event,FSM,STATE>::type >::type \
Chris@16 2409 operator()(Event const& evt,FSM& fsm,STATE& state )const { \
Chris@16 2410 return (Param1()(evt,fsm,state)).function(Param2()(evt,fsm,state),Param3()(evt,fsm,state) \
Chris@16 2411 ,Param4()(evt,fsm,state),Param5()(evt,fsm,state));} }; \
Chris@16 2412 struct function_name ## tag{}; \
Chris@16 2413 struct functor ## Helper : proto::extends< proto::terminal< function_name ## tag >::type, \
Chris@16 2414 functor ## Helper , boost::msm::sm_domain> { functor ## Helper(){} \
Chris@16 2415 template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5> \
Chris@16 2416 struct In {typedef functor <Arg1,Arg2,Arg3,Arg4,Arg5> type;}; }; \
Chris@16 2417 functor ## Helper const function_name = functor ## Helper ();
Chris@16 2418
Chris@16 2419 #endif
Chris@16 2420
Chris@16 2421 #define RESULT_TYPE2_PARAM1 typename get_result_type2<Param1,Event,FSM,STATE>::type
Chris@16 2422 #define RESULT_TYPE_PARAM1 typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type
Chris@16 2423 #define RESULT_TYPE2_PARAM2 typename get_result_type2<Param2,Event,FSM,STATE>::type
Chris@16 2424 #define RESULT_TYPE_PARAM2 typename get_result_type<Param2,EVT,FSM,SourceState,TargetState>::type
Chris@16 2425 #define RESULT_TYPE2_PARAM3 typename get_result_type2<Param3,Event,FSM,STATE>::type
Chris@16 2426 #define RESULT_TYPE_PARAM3 typename get_result_type<Param3,EVT,FSM,SourceState,TargetState>::type
Chris@16 2427 #define RESULT_TYPE2_PARAM4 typename get_result_type2<Param4,Event,FSM,STATE>::type
Chris@16 2428 #define RESULT_TYPE_PARAM4 typename get_result_type<Param4,EVT,FSM,SourceState,TargetState>::type
Chris@16 2429 #define RESULT_TYPE2_PARAM5 typename get_result_type2<Param5,Event,FSM,STATE>::type
Chris@16 2430 #define RESULT_TYPE_PARAM5 typename get_result_type<Param5,EVT,FSM,SourceState,TargetState>::type
Chris@16 2431 #define RESULT_TYPE2_PARAM6 typename get_result_type2<Param6,Event,FSM,STATE>::type
Chris@16 2432 #define RESULT_TYPE_PARAM6 typename get_result_type<Param6,EVT,FSM,SourceState,TargetState>::type
Chris@16 2433
Chris@16 2434
Chris@16 2435 #define RESULT_TYPE2_DIFF_TYPE_ITER_TRAITS_PARAM1 typename std::iterator_traits<typename get_result_type2<Param1,Event,FSM,STATE>::type>::difference_type
Chris@16 2436 #define RESULT_TYPE_DIFF_TYPE_ITER_TRAITS_PARAM1 typename std::iterator_traits<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::difference_type
Chris@16 2437
Chris@16 2438 #define RESULT_TYPE2_REMOVE_REF_PARAM1 typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type
Chris@16 2439 #define RESULT_TYPE_REMOVE_REF_PARAM1 typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type
Chris@16 2440
Chris@16 2441 #define RESULT_TYPE2_PAIR_REMOVE_REF_PARAM1 std::pair<RESULT_TYPE2_REMOVE_REF_PARAM1,RESULT_TYPE2_REMOVE_REF_PARAM1>
Chris@16 2442 #define RESULT_TYPE_PAIR_REMOVE_REF_PARAM1 std::pair<RESULT_TYPE_REMOVE_REF_PARAM1,RESULT_TYPE_REMOVE_REF_PARAM1>
Chris@16 2443
Chris@16 2444 #define RESULT_TYPE2_GET_REF_REMOVE_REF_PARAM1 typename get_reference<typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type>::type
Chris@16 2445 #define RESULT_TYPE_GET_REF_REMOVE_REF_PARAM1 typename get_reference<typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type>::type
Chris@16 2446
Chris@16 2447 #define RESULT_TYPE2_GET_ITERATOR_REMOVE_REF_PARAM1 typename get_iterator<typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type>::type
Chris@16 2448 #define RESULT_TYPE_GET_ITERATOR_REMOVE_REF_PARAM1 typename get_iterator<typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type>::type
Chris@16 2449
Chris@16 2450 #define RESULT_TYPE2_GET_REV_ITERATOR_REMOVE_REF_PARAM1 typename get_reverse_iterator<typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type>::type
Chris@16 2451 #define RESULT_TYPE_GET_REV_ITERATOR_REMOVE_REF_PARAM1 typename get_reverse_iterator<typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type>::type
Chris@16 2452
Chris@16 2453 #define RESULT_TYPE2_GET_SIZE_TYPE_REMOVE_REF_PARAM1 typename get_size_type<typename ::boost::remove_reference<typename get_result_type2<Param1,Event,FSM,STATE>::type>::type>::type
Chris@16 2454 #define RESULT_TYPE_GET_SIZE_TYPE_REMOVE_REF_PARAM1 typename get_size_type<typename ::boost::remove_reference<typename get_result_type<Param1,EVT,FSM,SourceState,TargetState>::type>::type>::type
Chris@16 2455
Chris@16 2456 #define BOOST_MSM_EUML_ACTION(instance_name) \
Chris@16 2457 struct instance_name ## _impl; \
Chris@101 2458 struct instance_name ## _helper : boost::msm::front::euml::euml_action<instance_name ## _impl> \
Chris@16 2459 { \
Chris@16 2460 instance_name ## _helper(){} \
Chris@16 2461 typedef instance_name ## _impl action_name; \
Chris@16 2462 }; \
Chris@16 2463 static instance_name ## _helper instance_name; \
Chris@16 2464 struct instance_name ## _impl : instance_name ## _helper
Chris@16 2465
Chris@16 2466 #define BOOST_MSM_EUML_DECLARE_ACTION(instance_name) \
Chris@16 2467 struct instance_name ; \
Chris@101 2468 struct instance_name ## _helper : boost::msm::front::euml::euml_action<instance_name > \
Chris@16 2469 { \
Chris@16 2470 instance_name ## _helper(){} \
Chris@16 2471 typedef instance_name action_name; \
Chris@16 2472 }; \
Chris@16 2473 struct instance_name : instance_name ## _helper
Chris@16 2474
Chris@16 2475
Chris@16 2476 #define BOOST_MSM_EUML_EVENT(instance_name) \
Chris@101 2477 struct instance_name ## _helper : boost::msm::front::euml::euml_event<instance_name ## _helper>{ \
Chris@16 2478 instance_name ## _helper(){} \
Chris@16 2479 instance_name ## _helper const& operator()() const {return *this;} }; \
Chris@16 2480 static instance_name ## _helper instance_name;
Chris@16 2481
Chris@16 2482 // an event matching any event
Chris@101 2483 struct kleene_ : boost::msm::front::euml::euml_event<kleene_>, public boost::any
Chris@16 2484 {
Chris@16 2485 kleene_() : boost::any(){}
Chris@16 2486 template<typename ValueType>
Chris@16 2487 kleene_(const ValueType & v) : boost::any(v){}
Chris@16 2488 };
Chris@16 2489 static kleene_ kleene;
Chris@16 2490
Chris@16 2491 #define BOOST_MSM_EUML_DECLARE_EVENT(instance_name) \
Chris@101 2492 struct instance_name : boost::msm::front::euml::euml_event<instance_name >{ \
Chris@16 2493 instance_name(){} \
Chris@16 2494 instance_name const& operator()() const {return *this;} };
Chris@16 2495
Chris@16 2496 #define MSM_EUML_CONCAT(param1,param2) param1
Chris@16 2497 #define MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE1(z, n, unused) ARG ## n arg ## n
Chris@16 2498 #define MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE2(z, n, unused) arg ## n
Chris@16 2499 #define MSM_EUML_EVENT_INSTANCE_HELPER_ATTRIBUTE_MAP_ENTRY(z, n, unused) \
Chris@16 2500 typename boost::fusion::result_of::first< \
Chris@16 2501 typename ::boost::remove_reference< \
Chris@16 2502 typename boost::fusion::result_of::at_c<T, BOOST_PP_CAT( , n)>::type>::type>::type \
Chris@16 2503
Chris@16 2504 #define MSM_EUML_EVENT_HELPER_GET_ATTRIBUTE(z, n, unused) \
Chris@16 2505 get_attribute( \
Chris@16 2506 typename boost::fusion::result_of::first< \
Chris@16 2507 typename ::boost::remove_reference< \
Chris@16 2508 typename boost::fusion::result_of::at_c<T, n>::type>::type>::type())=arg ## n;
Chris@16 2509
Chris@16 2510 #define MSM_EUML_EVENT_HELPER_CONSTRUCTORS(z, n, mytuple) \
Chris@16 2511 template <BOOST_PP_ENUM_PARAMS(n, class ARG)> \
Chris@16 2512 BOOST_PP_CAT(BOOST_PP_TUPLE_ELEM(2, 0, mytuple) , _helper)(BOOST_PP_ENUM(n, MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE1, ~ )): \
Chris@16 2513 BOOST_PP_TUPLE_ELEM(2, 1, mytuple)(){ \
Chris@16 2514 init(BOOST_PP_ENUM(n, MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE2, ~ ),attribute_vec());}
Chris@16 2515
Chris@16 2516 #define MSM_EUML_EVENT_INSTANCE_HELPER_ATTRIBUTE_MAP(z, n, unused) \
Chris@16 2517 template <BOOST_PP_ENUM_PARAMS(n, class ARG),class T> \
Chris@16 2518 void init(BOOST_PP_ENUM(n, MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE1, ~ ), \
Chris@16 2519 T,typename ::boost::enable_if< typename boost::mpl::eval_if< typename ::boost::fusion::traits::is_sequence<T>::type,size_helper<T,n>,::boost::mpl::false_>::type,void >::type* =0) \
Chris@16 2520 { \
Chris@16 2521 BOOST_PP_REPEAT_FROM_TO(0,n , \
Chris@16 2522 MSM_EUML_EVENT_HELPER_GET_ATTRIBUTE, ~) \
Chris@16 2523 }
Chris@16 2524
Chris@16 2525 #define MSM_EUML_EVENT_INSTANCE_HELPER_OPERATOR_IMPL(z, n, instance) \
Chris@16 2526 template <BOOST_PP_ENUM_PARAMS(n, class ARG)> \
Chris@16 2527 BOOST_PP_CAT(instance,_helper) operator() \
Chris@16 2528 (BOOST_PP_ENUM(n, MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE1, ~ ))const{ \
Chris@16 2529 return BOOST_PP_CAT(instance,_helper) (BOOST_PP_ENUM(n, MSM_EUML_EVENT_INSTANCE_HELPER_EXECUTE2, ~ ));}
Chris@101 2530
Chris@101 2531 #if defined(FUSION_MAX_MAP_SIZE)
Chris@16 2532
Chris@101 2533 #define BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(instance_name, attributes_name) \
Chris@16 2534 struct instance_name ## _helper : \
Chris@101 2535 boost::msm::front::euml::euml_event<instance_name ## _helper> , public attributes_name \
Chris@16 2536 { \
Chris@16 2537 template <class T,int checked_size> struct size_helper \
Chris@16 2538 { \
Chris@16 2539 typedef typename ::boost::mpl::less_equal< \
Chris@16 2540 typename ::boost::fusion::result_of::size<T>::type, \
Chris@16 2541 ::boost::mpl::int_<checked_size> >::type type; \
Chris@16 2542 }; \
Chris@16 2543 BOOST_PP_CAT(instance_name,_helper()) : attributes_name(){} \
Chris@16 2544 typedef attributes_name::attributes_type attribute_map; \
Chris@16 2545 typedef ::boost::fusion::result_of::as_vector<attribute_map>::type attribute_vec; \
Chris@16 2546 BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(FUSION_MAX_MAP_SIZE ,1), \
Chris@16 2547 MSM_EUML_EVENT_HELPER_CONSTRUCTORS, (instance_name,attributes_name)) \
Chris@16 2548 BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(FUSION_MAX_MAP_SIZE ,1), \
Chris@16 2549 MSM_EUML_EVENT_INSTANCE_HELPER_ATTRIBUTE_MAP, ~) \
Chris@16 2550 BOOST_PP_CAT(instance_name,_helper) operator()(){ \
Chris@16 2551 return BOOST_PP_CAT(instance_name,_helper)();} \
Chris@16 2552 BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(FUSION_MAX_MAP_SIZE ,1), \
Chris@16 2553 MSM_EUML_EVENT_INSTANCE_HELPER_OPERATOR_IMPL, instance_name) \
Chris@16 2554 }; \
Chris@16 2555 static instance_name ## _helper instance_name;
Chris@16 2556
Chris@101 2557 #else
Chris@101 2558
Chris@101 2559 #define BOOST_MSM_EUML_EVENT_WITH_ATTRIBUTES(instance_name, attributes_name) \
Chris@101 2560 struct instance_name ## _helper : \
Chris@101 2561 boost::msm::front::euml::euml_event<instance_name ## _helper> , public attributes_name \
Chris@101 2562 { \
Chris@101 2563 template <class T,int checked_size> struct size_helper \
Chris@101 2564 { \
Chris@101 2565 typedef typename ::boost::mpl::less_equal< \
Chris@101 2566 typename ::boost::fusion::result_of::size<T>::type, \
Chris@101 2567 ::boost::mpl::int_<checked_size> >::type type; \
Chris@101 2568 }; \
Chris@101 2569 BOOST_PP_CAT(instance_name,_helper()) : attributes_name(){} \
Chris@101 2570 typedef attributes_name::attributes_type attribute_map; \
Chris@101 2571 typedef ::boost::fusion::result_of::as_vector<attribute_map>::type attribute_vec; \
Chris@101 2572 BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(10 ,1), \
Chris@101 2573 MSM_EUML_EVENT_HELPER_CONSTRUCTORS, (instance_name,attributes_name)) \
Chris@101 2574 BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(10 ,1), \
Chris@101 2575 MSM_EUML_EVENT_INSTANCE_HELPER_ATTRIBUTE_MAP, ~) \
Chris@101 2576 BOOST_PP_CAT(instance_name,_helper) operator()(){ \
Chris@101 2577 return BOOST_PP_CAT(instance_name,_helper)();} \
Chris@101 2578 BOOST_PP_REPEAT_FROM_TO(1,BOOST_PP_ADD(10 ,1), \
Chris@101 2579 MSM_EUML_EVENT_INSTANCE_HELPER_OPERATOR_IMPL, instance_name) \
Chris@101 2580 }; \
Chris@101 2581 static instance_name ## _helper instance_name;
Chris@101 2582
Chris@101 2583 #endif
Chris@101 2584
Chris@16 2585 #define BOOST_MSM_EUML_EVENT_NAME(instance_name) instance_name ## _helper
Chris@16 2586
Chris@16 2587 #define BOOST_MSM_EUML_FLAG_NAME(instance_name) instance_name ## _helper
Chris@16 2588
Chris@16 2589 #define BOOST_MSM_EUML_FLAG(instance_name) \
Chris@101 2590 struct instance_name ## _helper : boost::msm::front::euml::euml_flag<instance_name ## _helper>{}; \
Chris@16 2591 static instance_name ## _helper instance_name;
Chris@16 2592
Chris@16 2593 #define BOOST_MSM_EUML_DECLARE_FLAG(instance_name) \
Chris@101 2594 struct instance_name : boost::msm::front::euml::euml_flag<instance_name >{};
Chris@16 2595
Chris@16 2596 #define BOOST_MSM_EUML_STATE_NAME(instance_name) instance_name ## _helper
Chris@16 2597
Chris@16 2598 #define BOOST_MSM_EUML_BUILD_STT_HELPER build_stt(
Chris@16 2599 #define BOOST_MSM_EUML_BUILD_INTERNAL_STT_HELPER build_internal_stt(
Chris@16 2600 #define BOOST_MSM_EUML_BUILD_STT_HELPER2(expr) expr)
Chris@16 2601 #define BOOST_MSM_EUML_ENTRY_STATE_HELPER(expr) ,expr
Chris@16 2602
Chris@16 2603
Chris@16 2604 #define BOOST_MSM_EUML_ATTRIBUTES(expr,instance_name) \
Chris@16 2605 typedef BOOST_TYPEOF(build_attributes expr) instance_name;
Chris@16 2606
Chris@16 2607 // following macros declare a state type but do not create an instance
Chris@16 2608 #define BOOST_MSM_EUML_DECLARE_STATE(expr,instance_name) \
Chris@16 2609 struct instance_name ## tag{}; \
Chris@16 2610 typedef BOOST_TYPEOF(build_state<instance_name ## tag> expr) instance_name;
Chris@16 2611
Chris@16 2612 #define BOOST_MSM_EUML_DECLARE_INTERRUPT_STATE(expr,instance_name) \
Chris@16 2613 struct instance_name ## tag{}; \
Chris@16 2614 typedef BOOST_TYPEOF(build_interrupt_state<instance_name ## tag> expr) instance_name;
Chris@16 2615
Chris@16 2616 #define BOOST_MSM_EUML_DECLARE_TERMINATE_STATE(expr,instance_name) \
Chris@16 2617 struct instance_name ## tag{}; \
Chris@16 2618 typedef BOOST_TYPEOF(build_terminate_state<instance_name ## tag> expr) instance_name;
Chris@16 2619
Chris@16 2620 #define BOOST_MSM_EUML_DECLARE_EXPLICIT_ENTRY_STATE(region,expr,instance_name) \
Chris@16 2621 struct instance_name ## tag{}; \
Chris@16 2622 typedef BOOST_TYPEOF(build_explicit_entry_state<instance_name ## tag BOOST_MSM_EUML_ENTRY_STATE_HELPER(region) > expr) instance_name;
Chris@16 2623
Chris@16 2624 #define BOOST_MSM_EUML_DECLARE_ENTRY_STATE(region,expr,instance_name) \
Chris@16 2625 struct instance_name ## tag{}; \
Chris@16 2626 typedef BOOST_TYPEOF(build_entry_state<instance_name ## tag BOOST_MSM_EUML_ENTRY_STATE_HELPER(region) > expr) instance_name;
Chris@16 2627
Chris@16 2628 #define BOOST_MSM_EUML_DECLARE_EXIT_STATE(expr,instance_name) \
Chris@16 2629 struct instance_name ## tag{}; \
Chris@16 2630 typedef BOOST_TYPEOF(build_exit_state<instance_name ## tag> expr) instance_name;
Chris@16 2631
Chris@16 2632 #define BOOST_MSM_EUML_DECLARE_STATE_MACHINE(expr,instance_name) \
Chris@16 2633 struct instance_name ## tag{}; \
Chris@16 2634 typedef BOOST_TYPEOF(build_sm<instance_name ## tag> expr) instance_name;
Chris@16 2635
Chris@16 2636 #define BOOST_MSM_EUML_DECLARE_TRANSITION_TABLE(expr,instance_name) \
Chris@16 2637 typedef int using_declared_table; \
Chris@16 2638 typedef BOOST_TYPEOF(BOOST_MSM_EUML_BUILD_STT_HELPER BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) instance_name;
Chris@16 2639
Chris@16 2640 #define BOOST_MSM_EUML_DECLARE_INTERNAL_TRANSITION_TABLE(expr) \
Chris@16 2641 typedef BOOST_TYPEOF( \
Chris@16 2642 BOOST_MSM_EUML_BUILD_INTERNAL_STT_HELPER BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) internal_transition_table;
Chris@16 2643
Chris@16 2644 // following macros declare a state type and create an instance
Chris@16 2645 #define BOOST_MSM_EUML_STATE(expr,instance_name) \
Chris@16 2646 struct instance_name ## tag{}; \
Chris@16 2647 typedef BOOST_TYPEOF(build_state<instance_name ## tag> expr) instance_name ## _helper; \
Chris@16 2648 static instance_name ## _helper instance_name;
Chris@16 2649
Chris@16 2650 #define BOOST_MSM_EUML_INTERRUPT_STATE(expr,instance_name) \
Chris@16 2651 struct instance_name ## tag{}; \
Chris@16 2652 typedef BOOST_TYPEOF(build_interrupt_state<instance_name ## tag> expr) instance_name ## _helper; \
Chris@16 2653 static instance_name ## _helper instance_name;
Chris@16 2654
Chris@16 2655 #define BOOST_MSM_EUML_TERMINATE_STATE(expr,instance_name) \
Chris@16 2656 struct instance_name ## tag{}; \
Chris@16 2657 typedef BOOST_TYPEOF(build_terminate_state<instance_name ## tag> expr) instance_name ## _helper; \
Chris@16 2658 static instance_name ## _helper instance_name;
Chris@16 2659
Chris@16 2660 #define BOOST_MSM_EUML_EXPLICIT_ENTRY_STATE(region,expr,instance_name) \
Chris@16 2661 struct instance_name ## tag{}; \
Chris@16 2662 typedef BOOST_TYPEOF(build_explicit_entry_state<instance_name ## tag BOOST_MSM_EUML_ENTRY_STATE_HELPER(region) > expr) instance_name ## _helper; \
Chris@16 2663 static instance_name ## _helper instance_name;
Chris@16 2664
Chris@16 2665 #define BOOST_MSM_EUML_ENTRY_STATE(region,expr,instance_name) \
Chris@16 2666 struct instance_name ## tag{}; \
Chris@16 2667 typedef BOOST_TYPEOF(build_entry_state<instance_name ## tag BOOST_MSM_EUML_ENTRY_STATE_HELPER(region) > expr) instance_name ## _helper; \
Chris@16 2668 static instance_name ## _helper instance_name;
Chris@16 2669
Chris@16 2670 #define BOOST_MSM_EUML_EXIT_STATE(expr,instance_name) \
Chris@16 2671 struct instance_name ## tag{}; \
Chris@16 2672 typedef BOOST_TYPEOF(build_exit_state<instance_name ## tag> expr) instance_name ## _helper; \
Chris@16 2673 static instance_name ## _helper instance_name;
Chris@16 2674
Chris@16 2675
Chris@16 2676 #ifndef BOOST_MSVC
Chris@16 2677
Chris@16 2678 #define BOOST_MSM_EUML_TRANSITION_TABLE(expr,instance_name) \
Chris@16 2679 typedef BOOST_TYPEOF(BOOST_MSM_EUML_BUILD_STT_HELPER BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) instance_name ## _def; \
Chris@16 2680 struct instance_name ## _helper : public instance_name ## _def{instance_name ## _helper(){}}; \
Chris@16 2681 static instance_name ## _helper instance_name;
Chris@16 2682
Chris@16 2683 #define BOOST_MSM_EUML_INTERNAL_TRANSITION_TABLE(expr,instance_name) \
Chris@16 2684 typedef BOOST_TYPEOF(BOOST_MSM_EUML_BUILD_INTERNAL_STT_HELPER BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) instance_name ## _def; \
Chris@16 2685 struct instance_name ## _helper : public instance_name ## _def{instance_name ## _helper(){}}; \
Chris@16 2686 static instance_name ## _helper instance_name;
Chris@16 2687
Chris@16 2688 #else
Chris@16 2689
Chris@16 2690 #define BOOST_MSM_EUML_TRANSITION_TABLE(expr,instance_name) \
Chris@16 2691 struct instance_name ## _helper : \
Chris@16 2692 public BOOST_TYPEOF(BOOST_MSM_EUML_BUILD_STT_HELPER BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) \
Chris@16 2693 {instance_name ## _helper(){}} ; \
Chris@16 2694 static instance_name ## _helper instance_name;
Chris@16 2695
Chris@16 2696 #define BOOST_MSM_EUML_INTERNAL_TRANSITION_TABLE(expr,instance_name) \
Chris@16 2697 struct instance_name ## _helper : \
Chris@16 2698 public BOOST_TYPEOF(BOOST_MSM_EUML_BUILD_INTERNAL_STT_HELPER BOOST_MSM_EUML_BUILD_STT_HELPER2(expr)) \
Chris@16 2699 {instance_name ## _helper(){}} ; \
Chris@16 2700 static instance_name ## _helper instance_name;
Chris@16 2701
Chris@16 2702 #endif
Chris@16 2703
Chris@16 2704 }}}} // boost::msm::front::euml
Chris@16 2705
Chris@16 2706 namespace boost { namespace msm{
Chris@16 2707 template<>
Chris@16 2708 struct is_kleene_event< boost::msm::front::euml::kleene_ >
Chris@16 2709 {
Chris@16 2710 typedef ::boost::mpl::true_ type;
Chris@16 2711 };
Chris@16 2712 }}
Chris@16 2713
Chris@16 2714 #endif // BOOST_MSM_FRONT_EUML_COMMON_H