Files
Tower-Defense2/include/td/common/StateMachine.h
2025-08-10 11:49:07 +02:00

42 lines
866 B
C++

#pragma once
#include <memory>
#include <cassert>
namespace td {
template <typename TDerived, typename TReturn, typename... TArgs>
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 <typename T, typename... Args>
void ChangeState(Args&&... args) {
m_State = std::make_unique<T>(static_cast<TDerived&>(*this), std::forward<Args>(args)...);
}
private:
std::unique_ptr<State> m_State;
};
} // namespace td