8#ifndef GALAXY_STATE_STATEMACHINE_HPP_
9#define GALAXY_STATE_STATEMACHINE_HPP_
11#include <ankerl/unordered_dense.h>
26 template<std::derived_from<State> Stored>
32 using Stack = std::vector<std::shared_ptr<Stored>>;
37 using Map = ankerl::unordered_dense::map<std::uint64_t, std::shared_ptr<Stored>>;
71 template<typename Child = Stored, typename... Args>
73 std::shared_ptr<Stored>
add(const
std::
string& key, Args&&... args);
83 std::shared_ptr<Stored>
get(const
std::
string& key) noexcept;
93 bool has(const
std::
string& key) noexcept;
127 std::shared_ptr<Stored>
top() const noexcept;
168 template<
std::derived_from<
State> Stored>
173 template<std::derived_from<State> Stored>
176 this->
m_stack = std::move(sm.m_stack);
177 this->
m_storage = std::move(sm.m_storage);
180 template<std::derived_from<State> Stored>
185 this->
m_stack = std::move(sm.m_stack);
186 this->
m_storage = std::move(sm.m_storage);
192 template<std::derived_from<State> Stored>
201 template<std::derived_from<State> Stored>
202 template<
typename Child,
typename... Args>
209 m_storage[hash] = std::make_shared<Child>(key, std::forward<Args>(args)...);
219 template<std::derived_from<State> Stored>
235 template<std::derived_from<State> Stored>
242 template<std::derived_from<State> Stored>
247 if (state->name() == key)
258 template<std::derived_from<State> Stored>
261 if (
auto state =
get(key))
272 template<std::derived_from<State> Stored>
275 if (
auto state =
top())
287 template<std::derived_from<State> Stored>
296 template<std::derived_from<State> Stored>
307 template<std::derived_from<State> Stored>
313 template<std::derived_from<State> Stored>
#define GALAXY_LOG(level, msg,...)
Map & storage() noexcept
Get storage.
void pop() noexcept
Remove state on top of stack.
Map m_storage
State cache.
void remove(const std::string &key)
Remove a specific state.
virtual ~StateMachine()
Destructor.
void pop_all() noexcept
Remove all states in stack.
std::shared_ptr< Stored > add(const std::string &key, Args &&... args)
Add a new state.
ankerl::unordered_dense::map< std::uint64_t, std::shared_ptr< Stored > > Map
Use a dense map for storage.
bool has(const std::string &key) noexcept
Does a state exist.
StateMachine< Stored > & operator=(StateMachine< Stored > &&)
Move assignment operator.
StateMachine() noexcept
Constructor.
std::shared_ptr< Stored > get(const std::string &key) noexcept
Get a specific state.
std::vector< std::shared_ptr< Stored > > Stack
We specifically use a std::vector for our stack.
void push(const std::string &key) noexcept
Push a state onto the top of stack.
Stack m_stack
State stack.
Stack & stack() noexcept
Get stack.
std::shared_ptr< Stored > top() const noexcept
Get top state in stack.
A state to use in a finite state machine.
constexpr bits fnv1a(const char *const str, const bits value=fnv_1a_params< bits >::offset) noexcept
Convert string to hash.