fork(2) download
  1. #include <iostream>
  2. #include <boost/msm/back/state_machine.hpp>
  3. #include <boost/msm/front/state_machine_def.hpp>
  4. #include <boost/msm/front/functor_row.hpp>
  5.  
  6. namespace {
  7.  
  8. using namespace boost::msm;
  9. using namespace boost::msm::front;
  10. namespace mpl = boost::mpl;
  11.  
  12. struct MyData {
  13. int data;
  14. };
  15.  
  16. struct EvGotoSub1 {};
  17. struct EvGotoSub2 {};
  18.  
  19. struct MainSM_;
  20. using Main = back::state_machine<MainSM_>;
  21. struct Sub1SM_;
  22. using Sub1 = back::state_machine<Sub1SM_>;
  23. struct Sub2SM_;
  24. using Sub2 = back::state_machine<Sub2SM_>;
  25.  
  26. struct Sub1SM_ : state_machine_def<Sub1SM_> {
  27. struct Started : state<> {
  28. template <class Event,class Fsm>
  29. void on_entry(Event const& e, Fsm& fsm) {
  30. std::cout << "Sub1.data_ = " << (void*) fsm.data_ << std::endl;
  31. }
  32. };
  33. using initial_state = mpl::vector<Started>;
  34. struct transition_table:mpl::vector<
  35. Row<Started, EvGotoSub2, Sub2, none, none>
  36. > {};
  37. MyData* data_;
  38.  
  39. Sub1SM_() : data_((MyData*) 0xdeadbeef) {};
  40. Sub1SM_(MyData* data) : data_(data) {};
  41. };
  42.  
  43. struct Sub2SM_ : state_machine_def<Sub2SM_> {
  44. struct Started : state<> {
  45. template <class Event,class Fsm>
  46. void on_entry(Event const& e, Fsm& fsm) {
  47. std::cout << "Sub2.data_ = " << (void*) fsm.data_ << std::endl;
  48. }
  49. };
  50. using initial_state = mpl::vector<Started>;
  51. struct transition_table:mpl::vector<
  52. //Row<Started, EvGotoSub1, Sub1, none, none>
  53. > {};
  54. MyData* data_;
  55.  
  56. Sub2SM_() : data_((MyData*) 0xdeadbeef) {};
  57. Sub2SM_(MyData* data) : data_(data) {};
  58. };
  59.  
  60. struct MainSM_ : state_machine_def<MainSM_> {
  61. struct Started : state<> {};
  62. using initial_state = mpl::vector<Started>;
  63. struct transition_table:mpl::vector<
  64. Row<Started, EvGotoSub1, Sub1, none, none>,
  65. Row<Started, EvGotoSub2, Sub2, none, none>
  66. > {};
  67. MyData* data_;
  68.  
  69. MainSM_(MyData* data) : data_(data) {};
  70. };
  71. }
  72.  
  73. int main() {
  74. MyData data { 123 };
  75.  
  76. auto CreateMain = [&data] {
  77. auto ret = Main(back::states_ << Sub1(back::states_ << Sub2(&data), &data) << Sub2(&data), &data);
  78. ret.start();
  79. return ret;
  80. };
  81.  
  82. std::cout << "Jumping directly to Sub1" << std::endl;
  83. Main main = CreateMain();
  84. main.process_event(EvGotoSub1());
  85.  
  86. std::cout << "Jumping directly to Sub2" << std::endl;
  87. main = CreateMain();
  88. main.process_event(EvGotoSub2());
  89.  
  90. std::cout << "Jumping from Sub1 to Sub2" << std::endl;
  91. main = CreateMain();
  92. main.process_event(EvGotoSub1());
  93. main.process_event(EvGotoSub2());
  94. }
Success #stdin #stdout 0s 3312KB
stdin
Standard input is empty
stdout
Jumping directly to Sub1
Sub1.data_ = 0xbfe82bf0
Jumping directly to Sub2
Sub2.data_ = 0xbfe82bf0
Jumping from Sub1 to Sub2
Sub1.data_ = 0xbfe82bf0
Sub2.data_ = 0xbfe82bf0