/// 状态类 #ifndef RUState_h #define RUState_h #include "RUDefine.h" #include "RUStateDelegate.h" NS_RU_BEGIN enum class kStateType{ NORMAL = 0, //普通状态 META //分层状态(状态本身就是个状态机) }; class State { public: State() = default; ~State() = default; static State* create(const std::string& stateName, const std::vector& fullStatePath, kStateType stateType, const std::vector& entryActInfos, const std::vector& idleActInfos, const std::vector& exitActInfos, const std::string & stateDelegateKey, void* userObj4StateDelegate); virtual const std::string& getStateName(); /// 获取多层嵌套的完整stateName路径(距顶层状态机的状态嵌套),以数组的形式返回 virtual const std::vector& getFullStatePath(); /// 对于家装而言只有最原子普通状态会绑定block(执行动作绑定到block上) virtual std::vector getBindingStatePath4Blocks(); virtual kStateType getStateType(); /// 状态进入 virtual void entry(const std::function& entryCb = nullptr); /// 状态待机 virtual void idle(const std::function& idleCb = nullptr); /// 状态退出 virtual void exit(const std::function& exitCb = nullptr); virtual void beforeSwitch(std::vector actInfos, StateActInfo evt, std::function actsFinishCb = nullptr); virtual void afterSwitch(std::vector actInfos, StateActInfo evt, std::function actsFinishCb = nullptr); virtual const std::vector& getIdleActInfos(); /// debug输出结构信息 virtual void debugInfo(); /// 设置缩进 /// @param indent 缩进 virtual void setIndent4Dbg(const std::string& indent); protected: void _initData(const std::string& stateName, const std::vector& fullStatePath, kStateType stateType, const std::vector& entryActInfos, const std::vector& idleActInfos, const std::vector& exitActInfos, const std::string& stateDelegateKey, void* userObj4StateDelegate); void _initStateDelegate(const std::string& stateDelegateKey, void* userObj4StateDelegate); /// debug日志专用 std::string _getFullStatePathStr4Debug(); protected: std::string _stateName; std::vector _fullStatePath; //(多层嵌套的完整stateName链) kStateType _stateType = kStateType::NORMAL; std::vector _entryActInfos; std::vector _idleActInfos; std::vector _exitActInfos; std::string _stateDelegateKey; StateDelegate* _stateDelegate = nullptr; std::map _eventParams; std::string _indent; }; NS_RU_END #endif /* RUState_h */