#pragma once #include #include using FsmStateId = int; using FsmEvent = int; struct States; struct Transitions; class Fsm { private: FsmStateId mCurrentState; std::unique_ptr mStates; std::unique_ptr mTransitions; public: Fsm( FsmStateId id, std::function onEnter = nullptr, std::function onExit = nullptr); ~Fsm(); /** * * @param onEnter[IN] 상태변수 진입시 호출 함수 포인터 * @param onExit[IN] 상태변수 탈출시 호출 함수 포인터 */ int addState( FsmStateId id, std::function onEnter = nullptr, std::function onExit = nullptr); /** * @brief 트랜지션 추가 * * @param stateFrom[IN] 특정 상태 탈출 시 실행되는 함수 포인터 * @param stateTo[IN] 특정 상태 진입 시 실행되는 함수 포인터 * @param event[IN] 이벤트 * @param onTransition[IN] 상태전이 함수 * @param onGuard[IN] 가드 판단 함수 * @return error */ int addTransition( FsmStateId from, FsmStateId to, FsmEvent event, std::function onTransition = nullptr, std::function onGuard = nullptr); /** * @brief data의 값으로 상태전이를 실시한다 * @param data[IN] 트리거 된 이벤트 매개 데이터 * @return error */ int trigger( FsmEvent event, void* data = nullptr); /** * @brief 현재 상태 변수 포인터 반환 * @return 현재 상태변수 포인터 */ FsmStateId getCurrentState(); };