operator.hpp 56 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568
  1. // Copyright 2008 Christophe Henry
  2. // henry UNDERSCORE christophe AT hotmail DOT com
  3. // This is an extended version of the state machine available in the boost::mpl library
  4. // Distributed under the same license as the original.
  5. // Copyright for the original version:
  6. // Copyright 2005 David Abrahams and Aleksey Gurtovoy. Distributed
  7. // under the Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at
  9. // http://www.boost.org/LICENSE_1_0.txt)
  10. #ifndef BOOST_MSM_FRONT_EUML_OPERATOR_H
  11. #define BOOST_MSM_FRONT_EUML_OPERATOR_H
  12. #include <iterator>
  13. #include <boost/msm/front/euml/common.hpp>
  14. #include <boost/type_traits/remove_reference.hpp>
  15. #include <boost/utility/enable_if.hpp>
  16. #include <boost/mpl/has_key.hpp>
  17. #include <boost/mpl/eval_if.hpp>
  18. #include <boost/mpl/set.hpp>
  19. #include <boost/type_traits.hpp>
  20. #include <boost/fusion/container/set.hpp>
  21. BOOST_MPL_HAS_XXX_TRAIT_DEF(reference)
  22. BOOST_MPL_HAS_XXX_TRAIT_DEF(key_type)
  23. namespace boost { namespace msm { namespace front { namespace euml
  24. {
  25. template <class T1,class T2>
  26. struct Or_ : euml_action<Or_<T1,T2> >
  27. {
  28. template <class EVT,class FSM,class SourceState,class TargetState>
  29. bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)
  30. {
  31. return (T1()(evt,fsm,src,tgt) || T2()(evt,fsm,src,tgt));
  32. }
  33. template <class Event,class FSM,class STATE>
  34. bool operator()(Event const& evt,FSM& fsm,STATE& state)
  35. {
  36. return (T1()(evt,fsm,state) || T2()(evt,fsm,state));
  37. }
  38. };
  39. template <class T1,class T2>
  40. struct And_ : euml_action<And_<T1,T2> >
  41. {
  42. template <class EVT,class FSM,class SourceState,class TargetState>
  43. bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)
  44. {
  45. return (T1()(evt,fsm,src,tgt) && T2()(evt,fsm,src,tgt));
  46. }
  47. template <class Event,class FSM,class STATE>
  48. bool operator()(Event const& evt,FSM& fsm,STATE& state)
  49. {
  50. return (T1()(evt,fsm,state) && T2()(evt,fsm,state));
  51. }
  52. };
  53. template <class T1>
  54. struct Not_ : euml_action<Not_<T1> >
  55. {
  56. template <class EVT,class FSM,class SourceState,class TargetState>
  57. bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)
  58. {
  59. return !(T1()(evt,fsm,src,tgt));
  60. }
  61. template <class Event,class FSM,class STATE>
  62. bool operator()(Event const& evt,FSM& fsm,STATE& state)
  63. {
  64. return !(T1()(evt,fsm,state));
  65. }
  66. };
  67. template <class Condition,class Action1,class Action2, class Enable=void >
  68. struct If_Else_ : euml_action<If_Else_<Condition,Action1,Action2,Enable> > {};
  69. template <class Condition,class Action1,class Action2>
  70. struct If_Else_<Condition,Action1,Action2
  71. , typename ::boost::enable_if<typename has_tag_type<Action1>::type >::type>
  72. : euml_action<If_Else_<Condition,Action1,Action2> >
  73. {
  74. template <class Event,class FSM,class STATE >
  75. struct state_action_result
  76. {
  77. typedef typename get_result_type2<Action1,Event,FSM,STATE>::type type;
  78. };
  79. template <class EVT,class FSM,class SourceState,class TargetState>
  80. struct transition_action_result
  81. {
  82. typedef typename get_result_type<Action1,EVT,FSM,SourceState,TargetState>::type type;
  83. };
  84. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  85. template <class EVT,class FSM,class SourceState,class TargetState>
  86. typename ::boost::enable_if<
  87. typename ::boost::mpl::has_key<
  88. typename Action1::tag_type,action_tag>::type,
  89. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  90. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  91. {
  92. if (Condition()(evt,fsm,src,tgt))
  93. {
  94. return Action1()(evt,fsm,src,tgt);
  95. }
  96. return Action2()(evt,fsm,src,tgt);
  97. }
  98. template <class Event,class FSM,class STATE>
  99. typename ::boost::enable_if<
  100. typename ::boost::mpl::has_key<
  101. typename Action1::tag_type,state_action_tag>::type,
  102. typename state_action_result<Event,FSM,STATE>::type >::type
  103. operator()(Event const& evt,FSM& fsm,STATE& state )const
  104. {
  105. if (Condition()(evt,fsm,state))
  106. {
  107. return Action1()(evt,fsm,state);
  108. }
  109. return Action2()(evt,fsm,state);
  110. }
  111. };
  112. template <class Condition,class Action1,class Action2>
  113. struct If_Else_<Condition,Action1,Action2
  114. , typename ::boost::disable_if<typename has_tag_type<Action1>::type >::type>
  115. : euml_action<If_Else_<Condition,Action1,Action2> >
  116. {
  117. template <class Event,class FSM,class STATE >
  118. struct state_action_result
  119. {
  120. typedef bool type;
  121. };
  122. template <class EVT,class FSM,class SourceState,class TargetState>
  123. struct transition_action_result
  124. {
  125. typedef bool type;
  126. };
  127. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  128. template <class EVT,class FSM,class SourceState,class TargetState>
  129. bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  130. {
  131. if (Condition()(evt,fsm,src,tgt))
  132. {
  133. return Action1()(evt,fsm,src,tgt);
  134. }
  135. return Action2()(evt,fsm,src,tgt);
  136. }
  137. template <class Event,class FSM,class STATE>
  138. bool operator()(Event const& evt,FSM& fsm,STATE& state )const
  139. {
  140. if (Condition()(evt,fsm,state))
  141. {
  142. return Action1()(evt,fsm,state);
  143. }
  144. return Action2()(evt,fsm,state);
  145. }
  146. };
  147. struct if_tag
  148. {
  149. };
  150. struct If : proto::extends<proto::terminal<if_tag>::type, If, boost::msm::sm_domain>
  151. {
  152. If(){}
  153. using proto::extends< proto::terminal<if_tag>::type, If, boost::msm::sm_domain>::operator=;
  154. template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
  155. #ifdef BOOST_MSVC
  156. ,class Arg6
  157. #endif
  158. >
  159. struct In
  160. {
  161. typedef If_Else_<Arg1,Arg2,Arg3> type;
  162. };
  163. };
  164. If const if_then_else_;
  165. template <class Condition,class Action1, class Enable=void >
  166. struct If_Then_ : euml_action<If_Then_<Condition,Action1,Enable> > {};
  167. template <class Condition,class Action1>
  168. struct If_Then_<Condition,Action1
  169. , typename ::boost::enable_if<typename has_tag_type<Action1>::type >::type>
  170. : euml_action<If_Then_<Condition,Action1> >
  171. {
  172. template <class Event,class FSM,class STATE >
  173. struct state_action_result
  174. {
  175. typedef typename get_result_type2<Action1,Event,FSM,STATE>::type type;
  176. };
  177. template <class EVT,class FSM,class SourceState,class TargetState>
  178. struct transition_action_result
  179. {
  180. typedef typename get_result_type<Action1,EVT,FSM,SourceState,TargetState>::type type;
  181. };
  182. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  183. template <class EVT,class FSM,class SourceState,class TargetState>
  184. typename ::boost::enable_if<
  185. typename ::boost::mpl::has_key<
  186. typename Action1::tag_type,action_tag>::type,
  187. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  188. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  189. {
  190. if (Condition()(evt,fsm,src,tgt))
  191. {
  192. return Action1()(evt,fsm,src,tgt);
  193. }
  194. }
  195. template <class Event,class FSM,class STATE>
  196. typename ::boost::enable_if<
  197. typename ::boost::mpl::has_key<
  198. typename Action1::tag_type,state_action_tag>::type,
  199. typename state_action_result<Event,FSM,STATE>::type >::type
  200. operator()(Event const& evt,FSM& fsm,STATE& state )const
  201. {
  202. if (Condition()(evt,fsm,state))
  203. {
  204. return Action1()(evt,fsm,state);
  205. }
  206. }
  207. };
  208. template <class Condition,class Action1>
  209. struct If_Then_<Condition,Action1
  210. , typename ::boost::disable_if<typename has_tag_type<Action1>::type >::type>
  211. : euml_action<If_Then_<Condition,Action1> >
  212. {
  213. template <class Event,class FSM,class STATE >
  214. struct state_action_result
  215. {
  216. typedef bool type;
  217. };
  218. template <class EVT,class FSM,class SourceState,class TargetState>
  219. struct transition_action_result
  220. {
  221. typedef bool type;
  222. };
  223. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  224. template <class EVT,class FSM,class SourceState,class TargetState>
  225. bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  226. {
  227. if (Condition()(evt,fsm,src,tgt))
  228. {
  229. return Action1()(evt,fsm,src,tgt);
  230. }
  231. }
  232. template <class Event,class FSM,class STATE>
  233. bool operator()(Event const& evt,FSM& fsm,STATE& state )const
  234. {
  235. if (Condition()(evt,fsm,state))
  236. {
  237. return Action1()(evt,fsm,state);
  238. }
  239. }
  240. };
  241. struct if_then_tag
  242. {
  243. };
  244. struct If_Then : proto::extends< proto::terminal<if_then_tag>::type, If_Then, boost::msm::sm_domain>
  245. {
  246. If_Then(){}
  247. using proto::extends< proto::terminal<if_then_tag>::type, If_Then, boost::msm::sm_domain>::operator=;
  248. template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
  249. #ifdef BOOST_MSVC
  250. ,class Arg6
  251. #endif
  252. >
  253. struct In
  254. {
  255. typedef If_Then_<Arg1,Arg2> type;
  256. };
  257. };
  258. If_Then const if_then_;
  259. template <class Condition,class Body>
  260. struct While_Do_ : euml_action<While_Do_<Condition,Body> >
  261. {
  262. template <class Event,class FSM,class STATE >
  263. struct state_action_result
  264. {
  265. typedef void type;
  266. };
  267. template <class EVT,class FSM,class SourceState,class TargetState>
  268. struct transition_action_result
  269. {
  270. typedef void type;
  271. };
  272. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  273. template <class EVT,class FSM,class SourceState,class TargetState>
  274. void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  275. {
  276. Body body_;
  277. Condition cond_;
  278. while (cond_(evt,fsm,src,tgt))
  279. {
  280. body_(evt,fsm,src,tgt);
  281. }
  282. }
  283. template <class Event,class FSM,class STATE>
  284. void operator()(Event const& evt,FSM& fsm,STATE& state )const
  285. {
  286. Body body_;
  287. Condition cond_;
  288. while (cond_(evt,fsm,state))
  289. {
  290. body_(evt,fsm,state);
  291. }
  292. }
  293. };
  294. struct while_do_tag
  295. {
  296. };
  297. struct While_Do_Helper : proto::extends< proto::terminal<while_do_tag>::type, While_Do_Helper, boost::msm::sm_domain>
  298. {
  299. While_Do_Helper(){}
  300. using proto::extends< proto::terminal<while_do_tag>::type, While_Do_Helper, boost::msm::sm_domain>::operator=;
  301. template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
  302. #ifdef BOOST_MSVC
  303. ,class Arg6
  304. #endif
  305. >
  306. struct In
  307. {
  308. typedef While_Do_<Arg1,Arg2> type;
  309. };
  310. };
  311. While_Do_Helper const while_;
  312. template <class Condition,class Body>
  313. struct Do_While_ : euml_action<Do_While_<Condition,Body> >
  314. {
  315. template <class Event,class FSM,class STATE >
  316. struct state_action_result
  317. {
  318. typedef void type;
  319. };
  320. template <class EVT,class FSM,class SourceState,class TargetState>
  321. struct transition_action_result
  322. {
  323. typedef void type;
  324. };
  325. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  326. template <class EVT,class FSM,class SourceState,class TargetState>
  327. void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  328. {
  329. Condition cond_;
  330. Body body_;
  331. do
  332. {
  333. body_(evt,fsm,src,tgt);
  334. } while (cond_(evt,fsm,src,tgt));
  335. }
  336. template <class Event,class FSM,class STATE>
  337. void operator()(Event const& evt,FSM& fsm,STATE& state )const
  338. {
  339. Condition cond_;
  340. Body body_;
  341. do
  342. {
  343. body_(evt,fsm,state);
  344. } while (cond_(evt,fsm,state));
  345. }
  346. };
  347. struct do_while_tag
  348. {
  349. };
  350. struct Do_While_Helper : proto::extends< proto::terminal<do_while_tag>::type, Do_While_Helper, boost::msm::sm_domain>
  351. {
  352. Do_While_Helper(){}
  353. using proto::extends< proto::terminal<do_while_tag>::type, Do_While_Helper, boost::msm::sm_domain>::operator=;
  354. template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
  355. #ifdef BOOST_MSVC
  356. ,class Arg6
  357. #endif
  358. >
  359. struct In
  360. {
  361. typedef Do_While_<Arg1,Arg2> type;
  362. };
  363. };
  364. Do_While_Helper const do_while_;
  365. template <class Begin,class End,class EndLoop,class Body>
  366. struct For_Loop_ : euml_action<For_Loop_<Begin,End,EndLoop,Body> >
  367. {
  368. template <class Event,class FSM,class STATE >
  369. struct state_action_result
  370. {
  371. typedef void type;
  372. };
  373. template <class EVT,class FSM,class SourceState,class TargetState>
  374. struct transition_action_result
  375. {
  376. typedef void type;
  377. };
  378. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  379. template <class EVT,class FSM,class SourceState,class TargetState>
  380. void operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  381. {
  382. End end_;
  383. EndLoop end_loop_;
  384. Body body_;
  385. for(Begin()(evt,fsm,src,tgt);end_(evt,fsm,src,tgt);end_loop_(evt,fsm,src,tgt))
  386. {
  387. body_(evt,fsm,src,tgt);
  388. }
  389. }
  390. template <class Event,class FSM,class STATE>
  391. void operator()(Event const& evt,FSM& fsm,STATE& state )const
  392. {
  393. End end_;
  394. EndLoop end_loop_;
  395. Body body_;
  396. for(Begin()(evt,fsm,state);end_(evt,fsm,state);end_loop_(evt,fsm,state))
  397. {
  398. body_(evt,fsm,state);
  399. }
  400. }
  401. };
  402. struct for_loop_tag
  403. {
  404. };
  405. struct For_Loop_Helper : proto::extends< proto::terminal<for_loop_tag>::type, For_Loop_Helper, boost::msm::sm_domain>
  406. {
  407. For_Loop_Helper(){}
  408. using proto::extends< proto::terminal<for_loop_tag>::type, For_Loop_Helper, boost::msm::sm_domain>::operator=;
  409. template <class Arg1,class Arg2,class Arg3,class Arg4,class Arg5
  410. #ifdef BOOST_MSVC
  411. ,class Arg6
  412. #endif
  413. >
  414. struct In
  415. {
  416. typedef For_Loop_<Arg1,Arg2,Arg3,Arg4> type;
  417. };
  418. };
  419. For_Loop_Helper const for_;
  420. template <class T>
  421. struct Deref_ : euml_action<Deref_<T> >
  422. {
  423. Deref_(){}
  424. using euml_action<Deref_<T> >::operator=;
  425. template <class Event,class FSM,class STATE >
  426. struct state_action_result
  427. {
  428. typedef typename ::boost::add_reference<
  429. typename std::iterator_traits <
  430. typename ::boost::remove_reference<
  431. typename get_result_type2<T,Event,FSM,STATE>::type>::type>::value_type>::type type;
  432. };
  433. template <class EVT,class FSM,class SourceState,class TargetState>
  434. struct transition_action_result
  435. {
  436. typedef typename ::boost::add_reference<
  437. typename std::iterator_traits<
  438. typename ::boost::remove_reference<
  439. typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type
  440. >::value_type
  441. >::type type;
  442. };
  443. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  444. template <class EVT,class FSM,class SourceState,class TargetState>
  445. typename ::boost::enable_if<
  446. typename ::boost::mpl::has_key<
  447. typename T::tag_type,action_tag>::type,
  448. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  449. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  450. {
  451. return *(T()(evt,fsm,src,tgt));
  452. }
  453. template <class Event,class FSM,class STATE>
  454. typename ::boost::enable_if<
  455. typename ::boost::mpl::has_key<
  456. typename T::tag_type,state_action_tag>::type,
  457. typename state_action_result<Event,FSM,STATE>::type >::type
  458. operator()(Event const& evt,FSM& fsm,STATE& state )const
  459. {
  460. return *(T()(evt,fsm,state));
  461. }
  462. };
  463. template <class T>
  464. struct Pre_inc_ : euml_action<Pre_inc_<T> >
  465. {
  466. using euml_action<Pre_inc_<T> >::operator=;
  467. template <class Event,class FSM,class STATE >
  468. struct state_action_result
  469. {
  470. typedef typename get_result_type2<T,Event,FSM,STATE>::type type;
  471. };
  472. template <class EVT,class FSM,class SourceState,class TargetState>
  473. struct transition_action_result
  474. {
  475. typedef typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type type;
  476. };
  477. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  478. template <class EVT,class FSM,class SourceState,class TargetState>
  479. typename ::boost::enable_if<
  480. typename ::boost::mpl::has_key<
  481. typename T::tag_type,action_tag>::type,
  482. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  483. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  484. {
  485. return ++T()(evt,fsm,src,tgt);
  486. }
  487. template <class Event,class FSM,class STATE>
  488. typename ::boost::enable_if<
  489. typename ::boost::mpl::has_key<
  490. typename T::tag_type,state_action_tag>::type,
  491. typename state_action_result<Event,FSM,STATE>::type >::type
  492. operator()(Event const& evt,FSM& fsm,STATE& state )const
  493. {
  494. return ++T()(evt,fsm,state);
  495. }
  496. };
  497. template <class T>
  498. struct Pre_dec_ : euml_action<Pre_dec_<T> >
  499. {
  500. using euml_action<Pre_dec_<T> >::operator=;
  501. template <class Event,class FSM,class STATE >
  502. struct state_action_result
  503. {
  504. typedef typename get_result_type2<T,Event,FSM,STATE>::type type;
  505. };
  506. template <class EVT,class FSM,class SourceState,class TargetState>
  507. struct transition_action_result
  508. {
  509. typedef typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type type;
  510. };
  511. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  512. template <class EVT,class FSM,class SourceState,class TargetState>
  513. typename ::boost::enable_if<
  514. typename ::boost::mpl::has_key<
  515. typename T::tag_type,action_tag>::type,
  516. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  517. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  518. {
  519. return --T()(evt,fsm,src,tgt);
  520. }
  521. template <class Event,class FSM,class STATE>
  522. typename ::boost::enable_if<
  523. typename ::boost::mpl::has_key<
  524. typename T::tag_type,state_action_tag>::type,
  525. typename state_action_result<Event,FSM,STATE>::type >::type
  526. operator()(Event const& evt,FSM& fsm,STATE& state )const
  527. {
  528. return --T()(evt,fsm,state);
  529. }
  530. };
  531. template <class T>
  532. struct Post_inc_ : euml_action<Post_inc_<T> >
  533. {
  534. using euml_action<Post_inc_<T> >::operator=;
  535. template <class Event,class FSM,class STATE >
  536. struct state_action_result
  537. {
  538. typedef typename ::boost::remove_reference<
  539. typename get_result_type2<T,Event,FSM,STATE>::type>::type type;
  540. };
  541. template <class EVT,class FSM,class SourceState,class TargetState>
  542. struct transition_action_result
  543. {
  544. typedef typename ::boost::remove_reference<
  545. typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type type;
  546. };
  547. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  548. template <class EVT,class FSM,class SourceState,class TargetState>
  549. typename ::boost::enable_if<
  550. typename ::boost::mpl::has_key<
  551. typename T::tag_type,action_tag>::type,
  552. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  553. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  554. {
  555. return T()(evt,fsm,src,tgt)++;
  556. }
  557. template <class Event,class FSM,class STATE>
  558. typename ::boost::enable_if<
  559. typename ::boost::mpl::has_key<
  560. typename T::tag_type,state_action_tag>::type,
  561. typename state_action_result<Event,FSM,STATE>::type >::type
  562. operator()(Event const& evt,FSM& fsm,STATE& state )const
  563. {
  564. return T()(evt,fsm,state)++;
  565. }
  566. };
  567. template <class T>
  568. struct Post_dec_ : euml_action<Post_dec_<T> >
  569. {
  570. using euml_action<Post_dec_<T> >::operator=;
  571. template <class Event,class FSM,class STATE >
  572. struct state_action_result
  573. {
  574. typedef typename ::boost::remove_reference<
  575. typename get_result_type2<T,Event,FSM,STATE>::type>::type type;
  576. };
  577. template <class EVT,class FSM,class SourceState,class TargetState>
  578. struct transition_action_result
  579. {
  580. typedef typename ::boost::remove_reference<
  581. typename get_result_type<T,EVT,FSM,SourceState,TargetState>::type>::type type;
  582. };
  583. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  584. template <class EVT,class FSM,class SourceState,class TargetState>
  585. typename ::boost::enable_if<
  586. typename ::boost::mpl::has_key<
  587. typename T::tag_type,action_tag>::type,
  588. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  589. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  590. {
  591. return T()(evt,fsm,src,tgt)--;
  592. }
  593. template <class Event,class FSM,class STATE>
  594. typename ::boost::enable_if<
  595. typename ::boost::mpl::has_key<
  596. typename T::tag_type,state_action_tag>::type,
  597. typename state_action_result<Event,FSM,STATE>::type >::type
  598. operator()(Event const& evt,FSM& fsm,STATE& state )const
  599. {
  600. return T()(evt,fsm,state)--;
  601. }
  602. };
  603. template <class T1,class T2>
  604. struct Plus_ : euml_action<Plus_<T1,T2> >
  605. {
  606. template <class Event,class FSM,class STATE >
  607. struct state_action_result
  608. {
  609. typedef typename ::boost::remove_reference<
  610. typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
  611. };
  612. template <class EVT,class FSM,class SourceState,class TargetState>
  613. struct transition_action_result
  614. {
  615. typedef typename ::boost::remove_reference<
  616. typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
  617. };
  618. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  619. template <class EVT,class FSM,class SourceState,class TargetState>
  620. typename ::boost::enable_if<
  621. typename ::boost::mpl::has_key<
  622. typename T1::tag_type,action_tag>::type,
  623. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  624. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  625. {
  626. return T1()(evt,fsm,src,tgt)+T2()(evt,fsm,src,tgt);
  627. }
  628. template <class Event,class FSM,class STATE>
  629. typename ::boost::enable_if<
  630. typename ::boost::mpl::has_key<
  631. typename T1::tag_type,state_action_tag>::type,
  632. typename state_action_result<Event,FSM,STATE>::type >::type
  633. operator()(Event const& evt,FSM& fsm,STATE& state )const
  634. {
  635. return T1()(evt,fsm,state)+T2()(evt,fsm,state);
  636. }
  637. };
  638. template <class T1,class T2>
  639. struct Minus_ : euml_action<Minus_<T1,T2> >
  640. {
  641. template <class Event,class FSM,class STATE >
  642. struct state_action_result
  643. {
  644. typedef typename ::boost::remove_reference<
  645. typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
  646. };
  647. template <class EVT,class FSM,class SourceState,class TargetState>
  648. struct transition_action_result
  649. {
  650. typedef typename ::boost::remove_reference<
  651. typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
  652. };
  653. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  654. template <class EVT,class FSM,class SourceState,class TargetState>
  655. typename ::boost::enable_if<
  656. typename ::boost::mpl::has_key<
  657. typename T1::tag_type,action_tag>::type,
  658. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  659. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  660. {
  661. return T1()(evt,fsm,src,tgt)-T2()(evt,fsm,src,tgt);
  662. }
  663. template <class Event,class FSM,class STATE>
  664. typename ::boost::enable_if<
  665. typename ::boost::mpl::has_key<
  666. typename T1::tag_type,state_action_tag>::type,
  667. typename state_action_result<Event,FSM,STATE>::type >::type
  668. operator()(Event const& evt,FSM& fsm,STATE& state )const
  669. {
  670. return T1()(evt,fsm,state)-T2()(evt,fsm,state);
  671. }
  672. };
  673. template <class T1,class T2>
  674. struct Multiplies_ : euml_action<Multiplies_<T1,T2> >
  675. {
  676. template <class Event,class FSM,class STATE >
  677. struct state_action_result
  678. {
  679. typedef typename ::boost::remove_reference<
  680. typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
  681. };
  682. template <class EVT,class FSM,class SourceState,class TargetState>
  683. struct transition_action_result
  684. {
  685. typedef typename ::boost::remove_reference<
  686. typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
  687. };
  688. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  689. template <class EVT,class FSM,class SourceState,class TargetState>
  690. typename ::boost::enable_if<
  691. typename ::boost::mpl::has_key<
  692. typename T1::tag_type,action_tag>::type,
  693. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  694. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  695. {
  696. return T1()(evt,fsm,src,tgt)*T2()(evt,fsm,src,tgt);
  697. }
  698. template <class Event,class FSM,class STATE>
  699. typename ::boost::enable_if<
  700. typename ::boost::mpl::has_key<
  701. typename T1::tag_type,state_action_tag>::type,
  702. typename state_action_result<Event,FSM,STATE>::type >::type
  703. operator()(Event const& evt,FSM& fsm,STATE& state )const
  704. {
  705. return T1()(evt,fsm,state)*T2()(evt,fsm,state);
  706. }
  707. };
  708. template <class T1,class T2>
  709. struct Divides_ : euml_action<Divides_<T1,T2> >
  710. {
  711. template <class Event,class FSM,class STATE >
  712. struct state_action_result
  713. {
  714. typedef typename ::boost::remove_reference<
  715. typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
  716. };
  717. template <class EVT,class FSM,class SourceState,class TargetState>
  718. struct transition_action_result
  719. {
  720. typedef typename ::boost::remove_reference<
  721. typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
  722. };
  723. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  724. template <class EVT,class FSM,class SourceState,class TargetState>
  725. typename ::boost::enable_if<
  726. typename ::boost::mpl::has_key<
  727. typename T1::tag_type,action_tag>::type,
  728. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  729. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  730. {
  731. return T1()(evt,fsm,src,tgt)/T2()(evt,fsm,src,tgt);
  732. }
  733. template <class Event,class FSM,class STATE>
  734. typename ::boost::enable_if<
  735. typename ::boost::mpl::has_key<
  736. typename T1::tag_type,state_action_tag>::type,
  737. typename state_action_result<Event,FSM,STATE>::type >::type
  738. operator()(Event const& evt,FSM& fsm,STATE& state )const
  739. {
  740. return T1()(evt,fsm,state)/T2()(evt,fsm,state);
  741. }
  742. };
  743. template <class T1,class T2>
  744. struct Modulus_ : euml_action<Modulus_<T1,T2> >
  745. {
  746. template <class Event,class FSM,class STATE >
  747. struct state_action_result
  748. {
  749. typedef typename ::boost::remove_reference<
  750. typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
  751. };
  752. template <class EVT,class FSM,class SourceState,class TargetState>
  753. struct transition_action_result
  754. {
  755. typedef typename ::boost::remove_reference<
  756. typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
  757. };
  758. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  759. template <class EVT,class FSM,class SourceState,class TargetState>
  760. typename ::boost::enable_if<
  761. typename ::boost::mpl::has_key<
  762. typename T1::tag_type,action_tag>::type,
  763. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  764. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  765. {
  766. return T1()(evt,fsm,src,tgt)%T2()(evt,fsm,src,tgt);
  767. }
  768. template <class Event,class FSM,class STATE>
  769. typename ::boost::enable_if<
  770. typename ::boost::mpl::has_key<
  771. typename T1::tag_type,state_action_tag>::type,
  772. typename state_action_result<Event,FSM,STATE>::type >::type
  773. operator()(Event const& evt,FSM& fsm,STATE& state )const
  774. {
  775. return T1()(evt,fsm,state)%T2()(evt,fsm,state);
  776. }
  777. };
  778. template <class T1,class T2>
  779. struct Bitwise_And_ : euml_action<Bitwise_And_<T1,T2> >
  780. {
  781. template <class Event,class FSM,class STATE >
  782. struct state_action_result
  783. {
  784. typedef typename ::boost::remove_reference<
  785. typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
  786. };
  787. template <class EVT,class FSM,class SourceState,class TargetState>
  788. struct transition_action_result
  789. {
  790. typedef typename ::boost::remove_reference<
  791. typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
  792. };
  793. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  794. template <class EVT,class FSM,class SourceState,class TargetState>
  795. typename ::boost::enable_if<
  796. typename ::boost::mpl::has_key<
  797. typename T1::tag_type,action_tag>::type,
  798. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  799. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  800. {
  801. return T1()(evt,fsm,src,tgt)&T2()(evt,fsm,src,tgt);
  802. }
  803. template <class Event,class FSM,class STATE>
  804. typename ::boost::enable_if<
  805. typename ::boost::mpl::has_key<
  806. typename T1::tag_type,state_action_tag>::type,
  807. typename state_action_result<Event,FSM,STATE>::type >::type
  808. operator()(Event const& evt,FSM& fsm,STATE& state )const
  809. {
  810. return T1()(evt,fsm,state)&T2()(evt,fsm,state);
  811. }
  812. };
  813. template <class T1,class T2>
  814. struct Bitwise_Or_ : euml_action<Bitwise_Or_<T1,T2> >
  815. {
  816. template <class Event,class FSM,class STATE >
  817. struct state_action_result
  818. {
  819. typedef typename ::boost::remove_reference<
  820. typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
  821. };
  822. template <class EVT,class FSM,class SourceState,class TargetState>
  823. struct transition_action_result
  824. {
  825. typedef typename ::boost::remove_reference<
  826. typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
  827. };
  828. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  829. template <class EVT,class FSM,class SourceState,class TargetState>
  830. typename ::boost::enable_if<
  831. typename ::boost::mpl::has_key<
  832. typename T1::tag_type,action_tag>::type,
  833. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  834. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  835. {
  836. return T1()(evt,fsm,src,tgt)|T2()(evt,fsm,src,tgt);
  837. }
  838. template <class Event,class FSM,class STATE>
  839. typename ::boost::enable_if<
  840. typename ::boost::mpl::has_key<
  841. typename T1::tag_type,state_action_tag>::type,
  842. typename state_action_result<Event,FSM,STATE>::type >::type
  843. operator()(Event const& evt,FSM& fsm,STATE& state )const
  844. {
  845. return T1()(evt,fsm,state)|T2()(evt,fsm,state);
  846. }
  847. };
  848. template <class T1,class T2>
  849. struct Bitwise_Xor_ : euml_action<Bitwise_Xor_<T1,T2> >
  850. {
  851. template <class Event,class FSM,class STATE >
  852. struct state_action_result
  853. {
  854. typedef typename ::boost::remove_reference<
  855. typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
  856. };
  857. template <class EVT,class FSM,class SourceState,class TargetState>
  858. struct transition_action_result
  859. {
  860. typedef typename ::boost::remove_reference<
  861. typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
  862. };
  863. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  864. template <class EVT,class FSM,class SourceState,class TargetState>
  865. typename ::boost::enable_if<
  866. typename ::boost::mpl::has_key<
  867. typename T1::tag_type,action_tag>::type,
  868. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  869. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  870. {
  871. return T1()(evt,fsm,src,tgt)^T2()(evt,fsm,src,tgt);
  872. }
  873. template <class Event,class FSM,class STATE>
  874. typename ::boost::enable_if<
  875. typename ::boost::mpl::has_key<
  876. typename T1::tag_type,state_action_tag>::type,
  877. typename state_action_result<Event,FSM,STATE>::type >::type
  878. operator()(Event const& evt,FSM& fsm,STATE& state )const
  879. {
  880. return T1()(evt,fsm,state)^T2()(evt,fsm,state);
  881. }
  882. };
  883. template <class T1,class T2>
  884. struct Subscript_ : euml_action<Subscript_<T1,T2> >
  885. {
  886. template <class T>
  887. struct get_reference
  888. {
  889. typedef typename T::reference type;
  890. };
  891. template <class T>
  892. struct get_mapped_type
  893. {
  894. typedef typename T::value_type::second_type& type;
  895. };
  896. template <class Event,class FSM,class STATE >
  897. struct state_action_result
  898. {
  899. typedef typename ::boost::remove_reference<
  900. typename get_result_type2<T1,Event,FSM,STATE>::type>::type container_type;
  901. typedef typename ::boost::mpl::eval_if<
  902. typename has_key_type<container_type>::type,
  903. get_mapped_type<container_type>,
  904. ::boost::mpl::eval_if<
  905. typename ::boost::is_pointer<container_type>::type,
  906. ::boost::add_reference<typename ::boost::remove_pointer<container_type>::type >,
  907. get_reference<container_type>
  908. >
  909. >::type type;
  910. };
  911. template <class EVT,class FSM,class SourceState,class TargetState>
  912. struct transition_action_result
  913. {
  914. typedef typename ::boost::remove_reference<
  915. typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type container_type;
  916. typedef typename ::boost::mpl::eval_if<
  917. typename has_key_type<container_type>::type,
  918. get_mapped_type<container_type>,
  919. ::boost::mpl::eval_if<
  920. typename ::boost::is_pointer<container_type>::type,
  921. ::boost::add_reference<typename ::boost::remove_pointer<container_type>::type >,
  922. get_reference<container_type>
  923. >
  924. >::type type;
  925. };
  926. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  927. template <class EVT,class FSM,class SourceState,class TargetState>
  928. typename ::boost::enable_if<
  929. typename ::boost::mpl::has_key<
  930. typename T1::tag_type,action_tag>::type,
  931. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  932. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  933. {
  934. return T1()(evt,fsm,src,tgt)[T2()(evt,fsm,src,tgt)];
  935. }
  936. template <class Event,class FSM,class STATE>
  937. typename ::boost::enable_if<
  938. typename ::boost::mpl::has_key<
  939. typename T1::tag_type,state_action_tag>::type,
  940. typename state_action_result<Event,FSM,STATE>::type >::type
  941. operator()(Event const& evt,FSM& fsm,STATE& state )const
  942. {
  943. return T1()(evt,fsm,state)[T2()(evt,fsm,state)];
  944. }
  945. };
  946. template <class T1,class T2>
  947. struct Plus_Assign_ : euml_action<Plus_Assign_<T1,T2> >
  948. {
  949. template <class Event,class FSM,class STATE >
  950. struct state_action_result
  951. {
  952. typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
  953. };
  954. template <class EVT,class FSM,class SourceState,class TargetState>
  955. struct transition_action_result
  956. {
  957. typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
  958. };
  959. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  960. template <class EVT,class FSM,class SourceState,class TargetState>
  961. typename ::boost::enable_if<
  962. typename ::boost::mpl::has_key<
  963. typename T1::tag_type,action_tag>::type,
  964. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  965. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  966. {
  967. return (T1()(evt,fsm,src,tgt)+=T2()(evt,fsm,src,tgt));
  968. }
  969. template <class Event,class FSM,class STATE>
  970. typename ::boost::enable_if<
  971. typename ::boost::mpl::has_key<
  972. typename T1::tag_type,state_action_tag>::type,
  973. typename state_action_result<Event,FSM,STATE>::type >::type
  974. operator()(Event const& evt,FSM& fsm,STATE& state )const
  975. {
  976. return (T1()(evt,fsm,state)+=T2()(evt,fsm,state));
  977. }
  978. };
  979. template <class T1,class T2>
  980. struct Minus_Assign_ : euml_action<Minus_Assign_<T1,T2> >
  981. {
  982. template <class Event,class FSM,class STATE >
  983. struct state_action_result
  984. {
  985. typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
  986. };
  987. template <class EVT,class FSM,class SourceState,class TargetState>
  988. struct transition_action_result
  989. {
  990. typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
  991. };
  992. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  993. template <class EVT,class FSM,class SourceState,class TargetState>
  994. typename ::boost::enable_if<
  995. typename ::boost::mpl::has_key<
  996. typename T1::tag_type,action_tag>::type,
  997. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  998. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  999. {
  1000. return (T1()(evt,fsm,src,tgt)-=T2()(evt,fsm,src,tgt));
  1001. }
  1002. template <class Event,class FSM,class STATE>
  1003. typename ::boost::enable_if<
  1004. typename ::boost::mpl::has_key<
  1005. typename T1::tag_type,state_action_tag>::type,
  1006. typename state_action_result<Event,FSM,STATE>::type >::type
  1007. operator()(Event const& evt,FSM& fsm,STATE& state )const
  1008. {
  1009. return (T1()(evt,fsm,state)-=T2()(evt,fsm,state));
  1010. }
  1011. };
  1012. template <class T1,class T2>
  1013. struct Multiplies_Assign_ : euml_action<Multiplies_Assign_<T1,T2> >
  1014. {
  1015. template <class Event,class FSM,class STATE >
  1016. struct state_action_result
  1017. {
  1018. typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
  1019. };
  1020. template <class EVT,class FSM,class SourceState,class TargetState>
  1021. struct transition_action_result
  1022. {
  1023. typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
  1024. };
  1025. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1026. template <class EVT,class FSM,class SourceState,class TargetState>
  1027. typename ::boost::enable_if<
  1028. typename ::boost::mpl::has_key<
  1029. typename T1::tag_type,action_tag>::type,
  1030. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  1031. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1032. {
  1033. return (T1()(evt,fsm,src,tgt)*=T2()(evt,fsm,src,tgt));
  1034. }
  1035. template <class Event,class FSM,class STATE>
  1036. typename ::boost::enable_if<
  1037. typename ::boost::mpl::has_key<
  1038. typename T1::tag_type,state_action_tag>::type,
  1039. typename state_action_result<Event,FSM,STATE>::type >::type
  1040. operator()(Event const& evt,FSM& fsm,STATE& state )const
  1041. {
  1042. return (T1()(evt,fsm,state)*=T2()(evt,fsm,state));
  1043. }
  1044. };
  1045. template <class T1,class T2>
  1046. struct Divides_Assign_ : euml_action<Divides_Assign_<T1,T2> >
  1047. {
  1048. template <class Event,class FSM,class STATE >
  1049. struct state_action_result
  1050. {
  1051. typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
  1052. };
  1053. template <class EVT,class FSM,class SourceState,class TargetState>
  1054. struct transition_action_result
  1055. {
  1056. typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
  1057. };
  1058. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1059. template <class EVT,class FSM,class SourceState,class TargetState>
  1060. typename ::boost::enable_if<
  1061. typename ::boost::mpl::has_key<
  1062. typename T1::tag_type,action_tag>::type,
  1063. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  1064. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1065. {
  1066. return (T1()(evt,fsm,src,tgt)/=T2()(evt,fsm,src,tgt));
  1067. }
  1068. template <class Event,class FSM,class STATE>
  1069. typename ::boost::enable_if<
  1070. typename ::boost::mpl::has_key<
  1071. typename T1::tag_type,state_action_tag>::type,
  1072. typename state_action_result<Event,FSM,STATE>::type >::type
  1073. operator()(Event const& evt,FSM& fsm,STATE& state )const
  1074. {
  1075. return (T1()(evt,fsm,state)/=T2()(evt,fsm,state));
  1076. }
  1077. };
  1078. template <class T1,class T2>
  1079. struct Modulus_Assign_ : euml_action<Modulus_Assign_<T1,T2> >
  1080. {
  1081. template <class Event,class FSM,class STATE >
  1082. struct state_action_result
  1083. {
  1084. typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
  1085. };
  1086. template <class EVT,class FSM,class SourceState,class TargetState>
  1087. struct transition_action_result
  1088. {
  1089. typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
  1090. };
  1091. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1092. template <class EVT,class FSM,class SourceState,class TargetState>
  1093. typename ::boost::enable_if<
  1094. typename ::boost::mpl::has_key<
  1095. typename T1::tag_type,action_tag>::type,
  1096. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  1097. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1098. {
  1099. return (T1()(evt,fsm,src,tgt)%=T2()(evt,fsm,src,tgt));
  1100. }
  1101. template <class Event,class FSM,class STATE>
  1102. typename ::boost::enable_if<
  1103. typename ::boost::mpl::has_key<
  1104. typename T1::tag_type,state_action_tag>::type,
  1105. typename state_action_result<Event,FSM,STATE>::type >::type
  1106. operator()(Event const& evt,FSM& fsm,STATE& state )const
  1107. {
  1108. return (T1()(evt,fsm,state)%=T2()(evt,fsm,state));
  1109. }
  1110. };
  1111. template <class T1,class T2>
  1112. struct ShiftLeft_Assign_ : euml_action<ShiftLeft_Assign_<T1,T2> >
  1113. {
  1114. template <class Event,class FSM,class STATE >
  1115. struct state_action_result
  1116. {
  1117. typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
  1118. };
  1119. template <class EVT,class FSM,class SourceState,class TargetState>
  1120. struct transition_action_result
  1121. {
  1122. typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
  1123. };
  1124. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1125. template <class EVT,class FSM,class SourceState,class TargetState>
  1126. typename ::boost::enable_if<
  1127. typename ::boost::mpl::has_key<
  1128. typename T1::tag_type,action_tag>::type,
  1129. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  1130. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1131. {
  1132. return (T1()(evt,fsm,src,tgt)<<=T2()(evt,fsm,src,tgt));
  1133. }
  1134. template <class Event,class FSM,class STATE>
  1135. typename ::boost::enable_if<
  1136. typename ::boost::mpl::has_key<
  1137. typename T1::tag_type,state_action_tag>::type,
  1138. typename state_action_result<Event,FSM,STATE>::type >::type
  1139. operator()(Event const& evt,FSM& fsm,STATE& state )const
  1140. {
  1141. return (T1()(evt,fsm,state)<<=T2()(evt,fsm,state));
  1142. }
  1143. };
  1144. template <class T1,class T2>
  1145. struct ShiftRight_Assign_ : euml_action<ShiftRight_Assign_<T1,T2> >
  1146. {
  1147. template <class Event,class FSM,class STATE >
  1148. struct state_action_result
  1149. {
  1150. typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
  1151. };
  1152. template <class EVT,class FSM,class SourceState,class TargetState>
  1153. struct transition_action_result
  1154. {
  1155. typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
  1156. };
  1157. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1158. template <class EVT,class FSM,class SourceState,class TargetState>
  1159. typename ::boost::enable_if<
  1160. typename ::boost::mpl::has_key<
  1161. typename T1::tag_type,action_tag>::type,
  1162. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  1163. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1164. {
  1165. return (T1()(evt,fsm,src,tgt)>>=T2()(evt,fsm,src,tgt));
  1166. }
  1167. template <class Event,class FSM,class STATE>
  1168. typename ::boost::enable_if<
  1169. typename ::boost::mpl::has_key<
  1170. typename T1::tag_type,state_action_tag>::type,
  1171. typename state_action_result<Event,FSM,STATE>::type >::type
  1172. operator()(Event const& evt,FSM& fsm,STATE& state )const
  1173. {
  1174. return (T1()(evt,fsm,state)>>=T2()(evt,fsm,state));
  1175. }
  1176. };
  1177. template <class T1,class T2>
  1178. struct ShiftLeft_ : euml_action<ShiftLeft_<T1,T2> >
  1179. {
  1180. template <class Event,class FSM,class STATE >
  1181. struct state_action_result
  1182. {
  1183. typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
  1184. };
  1185. template <class EVT,class FSM,class SourceState,class TargetState>
  1186. struct transition_action_result
  1187. {
  1188. typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
  1189. };
  1190. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1191. template <class EVT,class FSM,class SourceState,class TargetState>
  1192. typename ::boost::enable_if<
  1193. typename ::boost::mpl::has_key<
  1194. typename T1::tag_type,action_tag>::type,
  1195. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  1196. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1197. {
  1198. return (T1()(evt,fsm,src,tgt)<<T2()(evt,fsm,src,tgt));
  1199. }
  1200. template <class Event,class FSM,class STATE>
  1201. typename ::boost::enable_if<
  1202. typename ::boost::mpl::has_key<
  1203. typename T1::tag_type,state_action_tag>::type,
  1204. typename state_action_result<Event,FSM,STATE>::type >::type
  1205. operator()(Event const& evt,FSM& fsm,STATE& state )const
  1206. {
  1207. return (T1()(evt,fsm,state)<<T2()(evt,fsm,state));
  1208. }
  1209. };
  1210. template <class T1,class T2>
  1211. struct ShiftRight_ : euml_action<ShiftRight_<T1,T2> >
  1212. {
  1213. template <class Event,class FSM,class STATE >
  1214. struct state_action_result
  1215. {
  1216. typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
  1217. };
  1218. template <class EVT,class FSM,class SourceState,class TargetState>
  1219. struct transition_action_result
  1220. {
  1221. typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
  1222. };
  1223. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1224. template <class EVT,class FSM,class SourceState,class TargetState>
  1225. typename ::boost::enable_if<
  1226. typename ::boost::mpl::has_key<
  1227. typename T1::tag_type,action_tag>::type,
  1228. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  1229. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1230. {
  1231. return (T1()(evt,fsm,src,tgt)>>T2()(evt,fsm,src,tgt));
  1232. }
  1233. template <class Event,class FSM,class STATE>
  1234. typename ::boost::enable_if<
  1235. typename ::boost::mpl::has_key<
  1236. typename T1::tag_type,state_action_tag>::type,
  1237. typename state_action_result<Event,FSM,STATE>::type >::type
  1238. operator()(Event const& evt,FSM& fsm,STATE& state )const
  1239. {
  1240. return (T1()(evt,fsm,state)>>T2()(evt,fsm,state));
  1241. }
  1242. };
  1243. template <class T1,class T2>
  1244. struct Assign_ : euml_action<Assign_<T1,T2> >
  1245. {
  1246. using euml_action< Assign_<T1,T2> >::operator=;
  1247. template <class Event,class FSM,class STATE >
  1248. struct state_action_result
  1249. {
  1250. typedef typename get_result_type2<T1,Event,FSM,STATE>::type type;
  1251. };
  1252. template <class EVT,class FSM,class SourceState,class TargetState>
  1253. struct transition_action_result
  1254. {
  1255. typedef typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type type;
  1256. };
  1257. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1258. template <class EVT,class FSM,class SourceState,class TargetState>
  1259. typename ::boost::enable_if<
  1260. typename ::boost::mpl::has_key<
  1261. typename T1::tag_type,action_tag>::type,
  1262. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  1263. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1264. {
  1265. return (T1()(evt,fsm,src,tgt)=T2()(evt,fsm,src,tgt));
  1266. }
  1267. template <class Event,class FSM,class STATE>
  1268. typename ::boost::enable_if<
  1269. typename ::boost::mpl::has_key<
  1270. typename T1::tag_type,state_action_tag>::type,
  1271. typename state_action_result<Event,FSM,STATE>::type >::type
  1272. operator()(Event const& evt,FSM& fsm,STATE& state )const
  1273. {
  1274. return (T1()(evt,fsm,state)=T2()(evt,fsm,state));
  1275. }
  1276. };
  1277. template <class T1>
  1278. struct Unary_Plus_ : euml_action<Unary_Plus_<T1> >
  1279. {
  1280. template <class Event,class FSM,class STATE >
  1281. struct state_action_result
  1282. {
  1283. typedef typename ::boost::remove_reference<
  1284. typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
  1285. };
  1286. template <class EVT,class FSM,class SourceState,class TargetState>
  1287. struct transition_action_result
  1288. {
  1289. typedef typename ::boost::remove_reference<
  1290. typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
  1291. };
  1292. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1293. template <class EVT,class FSM,class SourceState,class TargetState>
  1294. typename ::boost::enable_if<
  1295. typename ::boost::mpl::has_key<
  1296. typename T1::tag_type,action_tag>::type,
  1297. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  1298. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1299. {
  1300. return +T1()(evt,fsm,src,tgt);
  1301. }
  1302. template <class Event,class FSM,class STATE>
  1303. typename ::boost::enable_if<
  1304. typename ::boost::mpl::has_key<
  1305. typename T1::tag_type,state_action_tag>::type,
  1306. typename state_action_result<Event,FSM,STATE>::type >::type
  1307. operator()(Event const& evt,FSM& fsm,STATE& state )const
  1308. {
  1309. return +T1()(evt,fsm,state);
  1310. }
  1311. };
  1312. template <class T1>
  1313. struct Unary_Minus_ : euml_action<Unary_Minus_<T1> >
  1314. {
  1315. template <class Event,class FSM,class STATE >
  1316. struct state_action_result
  1317. {
  1318. typedef typename ::boost::remove_reference<
  1319. typename get_result_type2<T1,Event,FSM,STATE>::type>::type type;
  1320. };
  1321. template <class EVT,class FSM,class SourceState,class TargetState>
  1322. struct transition_action_result
  1323. {
  1324. typedef typename ::boost::remove_reference<
  1325. typename get_result_type<T1,EVT,FSM,SourceState,TargetState>::type>::type type;
  1326. };
  1327. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1328. template <class EVT,class FSM,class SourceState,class TargetState>
  1329. typename ::boost::enable_if<
  1330. typename ::boost::mpl::has_key<
  1331. typename T1::tag_type,action_tag>::type,
  1332. typename transition_action_result<EVT,FSM,SourceState,TargetState>::type >::type
  1333. operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1334. {
  1335. return -(T1()(evt,fsm,src,tgt));
  1336. }
  1337. template <class Event,class FSM,class STATE>
  1338. typename ::boost::enable_if<
  1339. typename ::boost::mpl::has_key<
  1340. typename T1::tag_type,state_action_tag>::type,
  1341. typename state_action_result<Event,FSM,STATE>::type >::type
  1342. operator()(Event const& evt,FSM& fsm,STATE& state )const
  1343. {
  1344. return -(T1()(evt,fsm,state));
  1345. }
  1346. };
  1347. template <class T1,class T2>
  1348. struct Less_ : euml_action<Less_<T1,T2> >
  1349. {
  1350. template <class Event,class FSM,class STATE >
  1351. struct state_action_result
  1352. {
  1353. typedef bool type;
  1354. };
  1355. template <class EVT,class FSM,class SourceState,class TargetState>
  1356. struct transition_action_result
  1357. {
  1358. typedef bool type;
  1359. };
  1360. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1361. template <class EVT,class FSM,class SourceState,class TargetState>
  1362. bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1363. {
  1364. return (T1()(evt,fsm,src,tgt) < T2()(evt,fsm,src,tgt));
  1365. }
  1366. template <class Event,class FSM,class STATE>
  1367. bool operator()(Event const& evt,FSM& fsm,STATE& state)const
  1368. {
  1369. return (T1()(evt,fsm,state) < T2()(evt,fsm,state));
  1370. }
  1371. };
  1372. template <class T1,class T2>
  1373. struct LessEqual_ : euml_action<LessEqual_<T1,T2> >
  1374. {
  1375. template <class Event,class FSM,class STATE >
  1376. struct state_action_result
  1377. {
  1378. typedef bool type;
  1379. };
  1380. template <class EVT,class FSM,class SourceState,class TargetState>
  1381. struct transition_action_result
  1382. {
  1383. typedef bool type;
  1384. };
  1385. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1386. template <class EVT,class FSM,class SourceState,class TargetState>
  1387. bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1388. {
  1389. return (T1()(evt,fsm,src,tgt) <= T2()(evt,fsm,src,tgt));
  1390. }
  1391. template <class Event,class FSM,class STATE>
  1392. bool operator()(Event const& evt,FSM& fsm,STATE& state)const
  1393. {
  1394. return (T1()(evt,fsm,state) <= T2()(evt,fsm,state));
  1395. }
  1396. };
  1397. template <class T1,class T2>
  1398. struct Greater_ : euml_action<Greater_<T1,T2> >
  1399. {
  1400. template <class Event,class FSM,class STATE >
  1401. struct state_action_result
  1402. {
  1403. typedef bool type;
  1404. };
  1405. template <class EVT,class FSM,class SourceState,class TargetState>
  1406. struct transition_action_result
  1407. {
  1408. typedef bool type;
  1409. };
  1410. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1411. template <class EVT,class FSM,class SourceState,class TargetState>
  1412. bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1413. {
  1414. return (T1()(evt,fsm,src,tgt) > T2()(evt,fsm,src,tgt));
  1415. }
  1416. template <class Event,class FSM,class STATE>
  1417. bool operator()(Event const& evt,FSM& fsm,STATE& state)const
  1418. {
  1419. return (T1()(evt,fsm,state) > T2()(evt,fsm,state));
  1420. }
  1421. };
  1422. template <class T1,class T2>
  1423. struct GreaterEqual_ : euml_action<GreaterEqual_<T1,T2> >
  1424. {
  1425. template <class Event,class FSM,class STATE >
  1426. struct state_action_result
  1427. {
  1428. typedef bool type;
  1429. };
  1430. template <class EVT,class FSM,class SourceState,class TargetState>
  1431. struct transition_action_result
  1432. {
  1433. typedef bool type;
  1434. };
  1435. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1436. template <class EVT,class FSM,class SourceState,class TargetState>
  1437. bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1438. {
  1439. return (T1()(evt,fsm,src,tgt) >= T2()(evt,fsm,src,tgt));
  1440. }
  1441. template <class Event,class FSM,class STATE>
  1442. bool operator()(Event const& evt,FSM& fsm,STATE& state)const
  1443. {
  1444. return (T1()(evt,fsm,state) >= T2()(evt,fsm,state));
  1445. }
  1446. };
  1447. template <class T1,class T2>
  1448. struct EqualTo_ : euml_action<EqualTo_<T1,T2> >
  1449. {
  1450. template <class Event,class FSM,class STATE >
  1451. struct state_action_result
  1452. {
  1453. typedef bool type;
  1454. };
  1455. template <class EVT,class FSM,class SourceState,class TargetState>
  1456. struct transition_action_result
  1457. {
  1458. typedef bool type;
  1459. };
  1460. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1461. template <class EVT,class FSM,class SourceState,class TargetState>
  1462. bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1463. {
  1464. return (T1()(evt,fsm,src,tgt) == T2()(evt,fsm,src,tgt));
  1465. }
  1466. template <class Event,class FSM,class STATE>
  1467. bool operator()(Event const& evt,FSM& fsm,STATE& state)const
  1468. {
  1469. return (T1()(evt,fsm,state) == T2()(evt,fsm,state));
  1470. }
  1471. };
  1472. template <class T1,class T2>
  1473. struct NotEqualTo_ : euml_action<NotEqualTo_<T1,T2> >
  1474. {
  1475. template <class Event,class FSM,class STATE >
  1476. struct state_action_result
  1477. {
  1478. typedef bool type;
  1479. };
  1480. template <class EVT,class FSM,class SourceState,class TargetState>
  1481. struct transition_action_result
  1482. {
  1483. typedef bool type;
  1484. };
  1485. typedef ::boost::fusion::set<state_action_tag,action_tag> tag_type;
  1486. template <class EVT,class FSM,class SourceState,class TargetState>
  1487. bool operator()(EVT const& evt, FSM& fsm,SourceState& src,TargetState& tgt)const
  1488. {
  1489. return (T1()(evt,fsm,src,tgt) != T2()(evt,fsm,src,tgt));
  1490. }
  1491. template <class Event,class FSM,class STATE>
  1492. bool operator()(Event const& evt,FSM& fsm,STATE& state)const
  1493. {
  1494. return (T1()(evt,fsm,state) != T2()(evt,fsm,state));
  1495. }
  1496. };
  1497. }}}}
  1498. #endif // BOOST_MSM_FRONT_EUML_OPERATOR_H