#include #include template void FiniteStateMachine::registerStateCreator(K const& key, StateCreator&& creator) { m_creators.emplace(key, std::move(creator)); std::cout << "Registered state: " << std::to_string(key) << std::endl; } template template void FiniteStateMachine::registerStateType(K const& key) { auto creator = [](A&& ... args) { return std::unique_ptr{new State{std::forward(args)...}}; }; registerStateCreator(key, std::move(creator)); } template auto FiniteStateMachine::currentState()const -> AState& { assert( !m_stack.empty() ); return *(m_stack.top().state); } template K const& FiniteStateMachine::currentStateKey()const { assert( !m_stack.empty() ); return m_stack.top().key; } template bool FiniteStateMachine::hasState()const { return !m_stack.empty(); } template void FiniteStateMachine::push(K const& key, A&& ... args) { auto arguments = std::make_tuple(std::forward(args)...); pushEvent([&, key]() { pushImp(key, std::forward(args)...); }); } template void FiniteStateMachine::change(K const& key, A&& ... args) { pushEvent([&, key]() { changeImp(key, std::forward(args)...); }); } template void FiniteStateMachine::pop() { pushEvent([this]() { popImp(); }); } template void FiniteStateMachine::clear() { pushEvent([this]() { clearImp(); }); } template auto FiniteStateMachine::createState(K const& key, A&& ... args) -> StatePointer { auto creatorIt = m_creators.find(key); assert( creatorIt != m_creators.end() ); return creatorIt->second(std::forward(args)...); } template void FiniteStateMachine::processEvents() { while (!m_eventQueue.empty()) { m_eventQueue.front()(); m_eventQueue.pop(); } } template void FiniteStateMachine::pushEvent(Event&& event) { m_eventQueue.emplace(std::move(event)); } template void FiniteStateMachine::step() { processEvents(); }