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>>;
70 template<typename... Args>
72 std::shared_ptr<Stored>
add(const
std::
string& key, Args&&... args);
82 std::shared_ptr<Stored>
get(const
std::
string& key) noexcept;
92 bool has(const
std::
string& key) noexcept;
126 std::shared_ptr<Stored>
top() const noexcept;
172 template<
std::derived_from<
State> Stored>
177 template<std::derived_from<State> Stored>
180 this->
m_stack = std::move(sm.m_stack);
181 this->
m_storage = std::move(sm.m_storage);
184 template<std::derived_from<State> Stored>
189 this->
m_stack = std::move(sm.m_stack);
190 this->
m_storage = std::move(sm.m_storage);
196 template<std::derived_from<State> Stored>
205 template<std::derived_from<State> Stored>
206 template<
typename... Args>
213 m_storage[hash] = std::make_shared<Stored>(key, std::forward<Args>(args)...);
223 template<std::derived_from<State> Stored>
239 template<std::derived_from<State> Stored>
246 template<std::derived_from<State> Stored>
251 if (state->name() == key)
262 template<std::derived_from<State> Stored>
265 if (
auto state =
get(key))
276 template<std::derived_from<State> Stored>
279 if (
auto state =
top())
291 template<std::derived_from<State> Stored>
300 template<std::derived_from<State> Stored>
311 template<std::derived_from<State> Stored>
317 template<std::derived_from<State> Stored>
#define GALAXY_LOG(level, msg,...)
std::shared_ptr< Stored > add(const std::string &key, Args &&... args)
Add a new state.
Map & storage() noexcept
Get storage.
void pop() noexcept
Remove state on top of stack.
Map m_storage
State cache.
virtual void update()=0
Process events and updates.
void remove(const std::string &key)
Remove a specific state.
virtual ~StateMachine()
Destructor.
void pop_all() noexcept
Remove all states in stack.
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.