Advertisement
YomoMan

Untitled

Jul 3rd, 2023
1,148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.56 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <boost/statechart/state_machine.hpp>
  4. #include <boost/statechart/simple_state.hpp>
  5. #include <boost/statechart/event.hpp>
  6. #include <boost/serialization/serialization.hpp>
  7. #include <boost/archive/text_oarchive.hpp>
  8. #include <boost/archive/text_iarchive.hpp>
  9. #include <msgpack.hpp>
  10.  
  11. namespace sc = boost::statechart;
  12.  
  13. // События
  14. struct EventStart : sc::event<EventStart> {};
  15. struct EventStop : sc::event<EventStop> {};
  16.  
  17. // Состояния
  18. struct StateIdle;
  19. struct StateRunning;
  20. struct StateFinished;
  21.  
  22. // Конечный автомат
  23. struct MyStateMachine : sc::state_machine<MyStateMachine, StateIdle> {
  24.     void start() { process_event(EventStart()); }
  25.     void stop() { process_event(EventStop()); }
  26.  
  27.     std::string serialize_state() {
  28.         std::ostringstream oss;
  29.         boost::archive::text_oarchive oa(oss);
  30.         oa << *this;
  31.         return oss.str();
  32.     }
  33.  
  34.     void deserialize_state(const std::string& serialized_state) {
  35.         std::istringstream iss(serialized_state);
  36.         boost::archive::text_iarchive ia(iss);
  37.         ia >> *this;
  38.     }
  39. };
  40.  
  41. // Состояние: ожидание
  42. struct StateIdle : sc::simple_state<StateIdle, MyStateMachine> {
  43.     typedef sc::transition<EventStart, StateRunning> reactions;
  44. };
  45.  
  46. // Состояние: работа
  47. struct StateRunning : sc::simple_state<StateRunning, MyStateMachine> {
  48.     typedef sc::transition<EventStop, StateFinished> reactions;
  49. };
  50.  
  51. // Состояние: завершено
  52. struct StateFinished : sc::simple_state<StateFinished, MyStateMachine> {};
  53.  
  54. int main() {
  55.     // Создание экземпляра конечного автомата
  56.     MyStateMachine sm;
  57.  
  58.     // Пример использования
  59.     std::cout << typeid(sm.current_state()).name() << std::endl;  // Вывод: N8MyStateMachine9StateIdleE
  60.  
  61.     sm.start();
  62.     std::cout << typeid(sm.current_state()).name() << std::endl;  // Вывод: N8MyStateMachine12StateRunningE
  63.  
  64.     std::string serialized_state = sm.serialize_state();
  65.  
  66.     // Можно сохранить serialized_state в файл или передать по сети
  67.  
  68.     // Десериализация состояния
  69.     MyStateMachine sm2;
  70.     sm2.deserialize_state(serialized_state);
  71.     std::cout << typeid(sm2.current_state()).name() << std::endl;  // Вывод: N8MyStateMachine12StateRunningE
  72.  
  73.     sm2.stop();
  74.     std::cout << typeid(sm2.current_state()).name() << std::endl;  // Вывод: N8MyStateMachine13StateFinishedE
  75.  
  76.     return 0;
  77. }
  78.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement