Skip to content

Commit ac649cd

Browse files
committed
Implemented binary serialisation with tests
1 parent c92dbea commit ac649cd

File tree

2 files changed

+400
-0
lines changed

2 files changed

+400
-0
lines changed

engine/utils/BinarySerialisation.h

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
//
2+
// Copyright (c) 2020-present Caps Collective & contributors
3+
// Originally authored by Jonathan Moallem (@jonjondev) & Aryeh Zinn (@Raelr)
4+
//
5+
// This code is released under an unmodified zlib license.
6+
// For conditions of distribution and use, please see:
7+
// https://opensource.org/licenses/Zlib
8+
//
9+
10+
#ifndef SIEGE_ENGINE_BINARYSERIALISATION_H
11+
#define SIEGE_ENGINE_BINARYSERIALISATION_H
12+
13+
#include <vector>
14+
#include <set>
15+
#include <map>
16+
17+
#include "String.h"
18+
19+
namespace Siege::BinarySerialisation
20+
{
21+
22+
#define SERIALISE_NATIVE(type) \
23+
void serialise(Buffer& buffer, type& value, bool deserialise = false) { \
24+
serialiseNative(buffer, value, deserialise); } \
25+
void serialise(Buffer& buffer, const type& value, bool deserialise = false) { \
26+
serialiseNative(buffer, value, deserialise); }
27+
28+
struct Buffer
29+
{
30+
std::basic_string<uint8_t> data;
31+
uint32_t cursor = 0;
32+
33+
void Reset()
34+
{
35+
data.clear();
36+
cursor = 0;
37+
}
38+
};
39+
40+
struct BinarySerialisable
41+
{
42+
virtual ~BinarySerialisable() = default;
43+
44+
virtual void serialise(Buffer& buffer, bool deserialise) {}
45+
};
46+
47+
template<typename T>
48+
void serialiseNative(Buffer& buffer, T& value, bool deserialise = false)
49+
{
50+
if (deserialise)
51+
{
52+
value = *(const T*)(buffer.data.data() + buffer.cursor);
53+
buffer.cursor += sizeof(value);
54+
}
55+
else
56+
{
57+
size_t was = buffer.data.size();
58+
buffer.data.resize(was + sizeof(value));
59+
*(T*)&buffer.data[was] = value;
60+
}
61+
}
62+
63+
template<typename T>
64+
void serialiseNative(Buffer& buffer, const T& value, bool deserialise = false)
65+
{
66+
T& nonConstValue = const_cast<T&>(value);
67+
serialiseNative(buffer, nonConstValue, deserialise);
68+
}
69+
70+
SERIALISE_NATIVE(bool)
71+
SERIALISE_NATIVE(uint32_t)
72+
SERIALISE_NATIVE(int32_t)
73+
SERIALISE_NATIVE(float)
74+
SERIALISE_NATIVE(double)
75+
76+
template<typename T1, typename T2>
77+
void serialise(Buffer& buffer, std::pair<T1, T2>& value, bool deserialise = false)
78+
{
79+
serialise(buffer, value.first, deserialise);
80+
serialise(buffer, value.second, deserialise);
81+
}
82+
83+
template<typename T>
84+
void serialiseContainer(Buffer& buffer, T& value)
85+
{
86+
uint32_t size = value.size();
87+
serialise(buffer, size);
88+
for (auto& entry : value)
89+
{
90+
serialise(buffer, entry);
91+
}
92+
}
93+
94+
template<typename T>
95+
void serialise(Buffer& buffer, std::vector<T>& value, bool deserialise = false)
96+
{
97+
if (deserialise)
98+
{
99+
value.clear();
100+
101+
uint32_t size;
102+
serialise(buffer, size, true);
103+
value.reserve(size);
104+
105+
T entry {};
106+
while (size--)
107+
{
108+
serialise(buffer, entry, true);
109+
value.push_back(entry);
110+
}
111+
}
112+
else serialiseContainer(buffer, value);
113+
}
114+
115+
template<typename T>
116+
void serialise(Buffer& buffer, std::set<T>& value, bool deserialise = false)
117+
{
118+
if (deserialise)
119+
{
120+
value.clear();
121+
122+
uint32_t size;
123+
serialise(buffer, size, true);
124+
125+
T entry {};
126+
while (size--)
127+
{
128+
serialise(buffer, entry, true);
129+
value.insert(entry);
130+
}
131+
}
132+
else serialiseContainer(buffer, value);
133+
}
134+
135+
template<typename T1, typename T2>
136+
void serialise(Buffer& buffer, std::map<T1, T2>& value, bool deserialise = false)
137+
{
138+
if (deserialise)
139+
{
140+
value.clear();
141+
142+
uint32_t size;
143+
serialise(buffer, size, true);
144+
145+
std::pair<T1, T2> entry;
146+
while (size--)
147+
{
148+
serialise(buffer, entry, true);
149+
value.insert(entry);
150+
}
151+
}
152+
else serialiseContainer(buffer, value);
153+
}
154+
155+
template<typename T>
156+
void serialise(Buffer& buffer, T& value, bool deserialise = false)
157+
{
158+
value.serialise(buffer, deserialise);
159+
}
160+
161+
} // namespace Siege::BinarySerialisation
162+
163+
#endif // SIEGE_ENGINE_BINARYSERIALISATION_H

0 commit comments

Comments
 (0)