SDEngine
Game Engine
Loading...
Searching...
No Matches
CommandQueue.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <mutex>
4#include <unordered_map>
5
6#include "Command.hpp"
7#include "Entity.hpp"
9
10namespace sd {
11
13 void* (*alloc_fn)(Arena* arena);
14 void (*execute_fn)(void* data, EntityManager<ComponentGroup<>>& em, CommandQueue& queue);
15 void (*serialize_fn)(void* data, Serializer& s);
16 void (*deserialize_fn)(void* data, Serializer& s);
17};
18
20 CommandQueue() : m_arena(arena_alloc(ArenaParams{.name = "CommandQueueArena"})) {}
25
26 CommandQueue(const CommandQueue&) = delete;
30
31 template<typename T, typename... Args>
32 void add(Args&&... args) {
33 T* data = m_arena->push_array<T>(1);
34 *data = T(std::forward<Args>(args)...);
35 m_commands.push(
36 m_arena,
39 .data = data,
40 .execute_fn = [](void* d,
42 CommandQueue& queue) { static_cast<T*>(d)->execute(em, queue); },
43 .serialize_fn = [](void* d, Serializer& s) { static_cast<T*>(d)->serialize(s); },
44 .deserialize_fn = [](void* d, Serializer& s) { static_cast<T*>(d)->deserialize(s); },
45 });
46 }
47
49
53
54 void clear();
55 [[nodiscard]] USize get_count() const;
56
57 void serialize(Serializer& serializer) const;
59
60 [[nodiscard]] Arena* arena() const { return m_arena; }
61
62 // Deserialization registry
65
66
69 std::mutex m_mutex;
71
72 static inline std::unordered_map<U64, TypeErasedCommandEntry> s_type_entries;
73};
74
75} // namespace sd
SD_EXPORT Arena * arena_alloc(ArenaParams params={})
Definition arena.cpp:91
SD_EXPORT void arena_release(Arena *arena)
Definition arena.cpp:142
Definition Application.hpp:22
Definition arena.hpp:67
Definition arena_vec.hpp:6
Definition arena.hpp:85
T * push_array(this Arena &arena, U64 count)
Definition arena.hpp:120
Definition Command.hpp:25
U64 type_id
Definition Command.hpp:26
Definition CommandQueue.hpp:19
static void register_type_erased_entry(U64 type_id, TypeErasedCommandEntry entry)
Definition CommandQueue.cpp:82
static std::unordered_map< U64, TypeErasedCommandEntry > s_type_entries
Definition CommandQueue.hpp:72
Arena * arena() const
Definition CommandQueue.hpp:60
void set_entity_for_handle(EntityHandle entity_handle, Entity entity)
Definition CommandQueue.cpp:51
std::mutex m_mutex
Definition CommandQueue.hpp:69
CommandQueue(CommandQueue &&)=delete
void serialize(Serializer &serializer) const
Definition CommandQueue.cpp:93
ArenaVec< Entity > m_handle_to_entity
Definition CommandQueue.hpp:68
void add(Args &&... args)
Definition CommandQueue.hpp:32
USize get_count() const
Definition CommandQueue.cpp:73
CommandQueue()
Definition CommandQueue.hpp:20
CommandQueue(const CommandQueue &)=delete
ArenaVec< CommandNode > m_commands
Definition CommandQueue.hpp:67
~CommandQueue()
Definition CommandQueue.hpp:21
void apply(EntityManager< ComponentGroup<> > &em)
Definition CommandQueue.cpp:43
void deserialize(Serializer &serializer)
Definition CommandQueue.cpp:106
void clear()
Definition CommandQueue.cpp:67
Entity get_entity(EntityHandle handle) const
Definition CommandQueue.cpp:77
CommandQueue & operator=(CommandQueue &&)=delete
bool is_handle_resolved(EntityHandle handle) const
Definition CommandQueue.cpp:63
static TypeErasedCommandEntry lookup_type_erased_entry(U64 type_id)
Definition CommandQueue.cpp:86
Arena * m_arena
Definition CommandQueue.hpp:70
CommandQueue & operator=(const CommandQueue &)=delete
Definition component_registration.hpp:12
Definition Command.hpp:16
Definition EntityManager.hpp:64
Definition Entity.hpp:18
Definition serialization.hpp:38
Definition CommandQueue.hpp:12
void(* execute_fn)(void *data, EntityManager< ComponentGroup<> > &em, CommandQueue &queue)
Definition CommandQueue.hpp:14
void(* deserialize_fn)(void *data, Serializer &s)
Definition CommandQueue.hpp:16
void(* serialize_fn)(void *data, Serializer &s)
Definition CommandQueue.hpp:15
consteval U64 type_id_of()
Definition type_id.hpp:6
std::size_t USize
Definition types.hpp:18
std::uint64_t U64
Definition types.hpp:16