SDEngine
Game Engine
Loading...
Searching...
No Matches
serialization.hpp
Go to the documentation of this file.
1#pragma once
2#include <array>
3#include <cstring>
4#include <iterator>
5#include <string>
6#include <vector>
7
8#include <VLA/Matrix.hpp>
9
10#include "SD/core/types.hpp"
11
12namespace sd {
13
14class Serializer;
15
17public:
18 virtual ~Serializable() = default;
19
20 virtual void serialize(Serializer& s) const = 0;
21 virtual void deserialize(Serializer& s) = 0;
22};
23
37public:
38 explicit Serializer(std::vector<std::byte>& buffer) : m_buffer(buffer) {}
39
40 // Write arithmetic types
41 template<typename T>
42 requires std::is_arithmetic_v<T>
43 void write(T value) {
44 const auto bytes = reinterpret_cast<const std::byte*>(&value);
45 m_buffer.insert(m_buffer.end(), bytes, bytes + sizeof(T));
46 }
47
48 // Write a C-style array
49 template<typename T, usize N>
50 void write(const T (&arr)[N]) {
51 for (const auto& val : arr) {
52 write(val);
53 }
54 }
55
56 // Write std::array
57 template<typename T, usize N>
58 void write(const std::array<T, N>& arr) {
59 for (const auto& val : arr) {
60 write(val);
61 }
62 }
63
64 // Write string
65 void write(const std::string& value) {
66 write(static_cast<u32>(value.size()));
67 const auto* bytes = reinterpret_cast<const std::byte*>(&value[0]);
68 m_buffer.insert(m_buffer.end(), bytes, bytes + value.size());
69 }
70
71 // Write std::vector (arithmetic types)
72 template<typename T>
73 requires std::is_arithmetic_v<T>
74 void write(const std::vector<T>& vec) {
75 write(static_cast<u32>(vec.size()));
76 for (const auto& val : vec) {
77 write(val);
78 }
79 }
80
81 // Write raw bytes
82 void write(const void* data, const usize size) {
83 const auto bytes = static_cast<const std::byte*>(data);
84 m_buffer.insert(m_buffer.end(), bytes, bytes + size);
85 }
86
87 // Write Serializable object
88 void write(const Serializable& obj) { obj.serialize(*this); }
89
90 // Write VLA::Matrix4x4f
91 void write(const VLA::Matrix4x4f& m) { write(m.A); }
92
93 // Read arithmetic types
94 template<typename T>
95 requires std::is_arithmetic_v<T>
96 T read() {
97 assert(m_read_offset + sizeof(T) <= get_written_size());
98 T value;
99 std::memcpy(&value, m_buffer.data() + m_read_offset, sizeof(T));
100 m_read_offset += sizeof(T);
101 return value;
102 }
103
104 // Read C-style array
105 template<typename T, usize N>
106 void read(T (&arr)[N]) {
107 assert(m_read_offset + sizeof(T) * N <= get_written_size());
108 for (auto& val : arr) {
109 val = read<T>();
110 }
111 }
112
113 // Read std::array
114 template<typename T, usize N>
115 void read(std::array<T, N>& arr) {
116 assert(m_read_offset + sizeof(T) * N <= get_written_size());
117 for (auto& val : arr) {
118 val = read<T>();
119 }
120 }
121
122 // Read string
123 std::string read_string() {
125 const usize size = read<u32>();
126 assert(m_read_offset + size * sizeof(char) <= get_written_size());
127 const char* ptr = reinterpret_cast<const char*>(m_buffer.data() + m_read_offset);
128 std::string str(ptr, size);
129 m_read_offset += size;
130 return str;
131 }
132
133 // Read std::vector (arithmetic types)
134 template<typename T>
135 requires std::is_arithmetic_v<T>
136 void read(std::vector<T>& vec) {
137 u32 size = read<u32>();
138 vec.resize(size);
139 for (u32 i = 0; i < size; ++i) {
140 vec[i] = read<T>();
141 }
142 }
143
144 // Read Serializable object
145 void read(Serializable& obj) { obj.deserialize(*this); }
146
147 // Read VLA::Matrix4x4f
148 VLA::Matrix4x4f read() {
149 VLA::Matrix4x4f m;
150 read(m.A);
151 return m;
152 }
153
155 [[nodiscard]] usize get_offset() const { return m_read_offset; }
157
158 [[nodiscard]] usize get_written_size() const { return m_buffer.size(); }
159 void clear() { m_buffer.clear(); }
160
161 [[nodiscard]] std::span<std::byte> get_span() const { return {m_buffer.data(), m_buffer.size()}; }
162
163private:
164 std::vector<std::byte>& m_buffer;
166};
167
168} // namespace sd
Definition serialization.hpp:16
virtual void deserialize(Serializer &s)=0
virtual void serialize(Serializer &s) const =0
virtual ~Serializable()=default
Definition serialization.hpp:36
void write(T value)
Definition serialization.hpp:43
void write(const std::array< T, N > &arr)
Definition serialization.hpp:58
VLA::Matrix4x4f read()
Definition serialization.hpp:148
void read(T(&arr)[N])
Definition serialization.hpp:106
usize m_read_offset
Definition serialization.hpp:165
void read(Serializable &obj)
Definition serialization.hpp:145
std::span< std::byte > get_span() const
Definition serialization.hpp:161
void write(const std::vector< T > &vec)
Definition serialization.hpp:74
void write(const VLA::Matrix4x4f &m)
Definition serialization.hpp:91
void write(const std::string &value)
Definition serialization.hpp:65
usize get_written_size() const
Definition serialization.hpp:158
void write(const Serializable &obj)
Definition serialization.hpp:88
Serializer(std::vector< std::byte > &buffer)
Definition serialization.hpp:38
void SetOffset(usize offset)
Definition serialization.hpp:156
usize get_offset() const
Definition serialization.hpp:155
void read(std::vector< T > &vec)
Definition serialization.hpp:136
T read()
Definition serialization.hpp:96
std::string read_string()
Definition serialization.hpp:123
void write(const void *data, const usize size)
Definition serialization.hpp:82
void read(std::array< T, N > &arr)
Definition serialization.hpp:115
void reset_offset()
Definition serialization.hpp:154
void clear()
Definition serialization.hpp:159
void write(const T(&arr)[N])
Definition serialization.hpp:50
std::vector< std::byte > & m_buffer
Definition serialization.hpp:164
Definition Application.hpp:28
std::uint32_t u32
Definition types.hpp:15
constexpr T g_type_max
Definition types.hpp:21
std::size_t usize
Definition types.hpp:18