Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <boost/statechart/state_machine.hpp>
- #include <boost/statechart/simple_state.hpp>
- #include <boost/statechart/event.hpp>
- #include <boost/serialization/serialization.hpp>
- #include <boost/archive/text_oarchive.hpp>
- #include <boost/archive/text_iarchive.hpp>
- #include <msgpack.hpp>
- namespace sc = boost::statechart;
- // События
- struct EventStart : sc::event<EventStart> {};
- struct EventStop : sc::event<EventStop> {};
- // Состояния
- struct StateIdle;
- struct StateRunning;
- struct StateFinished;
- // Конечный автомат
- struct MyStateMachine : sc::state_machine<MyStateMachine, StateIdle> {
- void start() { process_event(EventStart()); }
- void stop() { process_event(EventStop()); }
- std::string serialize_state() {
- std::ostringstream oss;
- boost::archive::text_oarchive oa(oss);
- oa << *this;
- return oss.str();
- }
- void deserialize_state(const std::string& serialized_state) {
- std::istringstream iss(serialized_state);
- boost::archive::text_iarchive ia(iss);
- ia >> *this;
- }
- };
- // Состояние: ожидание
- struct StateIdle : sc::simple_state<StateIdle, MyStateMachine> {
- typedef sc::transition<EventStart, StateRunning> reactions;
- };
- // Состояние: работа
- struct StateRunning : sc::simple_state<StateRunning, MyStateMachine> {
- typedef sc::transition<EventStop, StateFinished> reactions;
- };
- // Состояние: завершено
- struct StateFinished : sc::simple_state<StateFinished, MyStateMachine> {};
- int main() {
- // Создание экземпляра конечного автомата
- MyStateMachine sm;
- // Пример использования
- std::cout << typeid(sm.current_state()).name() << std::endl; // Вывод: N8MyStateMachine9StateIdleE
- sm.start();
- std::cout << typeid(sm.current_state()).name() << std::endl; // Вывод: N8MyStateMachine12StateRunningE
- std::string serialized_state = sm.serialize_state();
- // Можно сохранить serialized_state в файл или передать по сети
- // Десериализация состояния
- MyStateMachine sm2;
- sm2.deserialize_state(serialized_state);
- std::cout << typeid(sm2.current_state()).name() << std::endl; // Вывод: N8MyStateMachine12StateRunningE
- sm2.stop();
- std::cout << typeid(sm2.current_state()).name() << std::endl; // Вывод: N8MyStateMachine13StateFinishedE
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement