#pragma once #include #include namespace td { template class StateMachine { public: class State { public: State(TDerived& a_StateMachine) : m_StateMachine(a_StateMachine) {} virtual ~State() {} virtual TReturn Update(TArgs... args) = 0; protected: TDerived& m_StateMachine; }; StateMachine() {} StateMachine(StateMachine&&) = default; virtual ~StateMachine() {} virtual TReturn Update(TArgs... args) { assert(m_State && "You must change state at least once before updating !"); return m_State->Update(args...); } template T* ChangeState(Args&&... args) { m_State = std::make_unique(static_cast(*this), std::forward(args)...); return static_cast(m_State.get()); } private: std::unique_ptr m_State; }; } // namespace td