Skip to content

Commit be4a236

Browse files
committed
Updated binary serialisation to use a mode enum
1 parent ac649cd commit be4a236

File tree

3 files changed

+136
-95
lines changed

3 files changed

+136
-95
lines changed

.clang-format

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ AttributeMacros:
2929
BinPackArguments: false
3030
BinPackParameters: false
3131
BraceWrapping:
32-
AfterCaseLabel: false
32+
AfterCaseLabel: true
3333
AfterClass: true
3434
AfterControlStatement: Always
3535
AfterEnum: true

engine/utils/BinarySerialisation.h

Lines changed: 103 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,30 @@
1010
#ifndef SIEGE_ENGINE_BINARYSERIALISATION_H
1111
#define SIEGE_ENGINE_BINARYSERIALISATION_H
1212

13-
#include <vector>
14-
#include <set>
1513
#include <map>
14+
#include <set>
15+
#include <vector>
1616

1717
#include "String.h"
1818

1919
namespace Siege::BinarySerialisation
2020
{
2121

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); }
22+
enum SerialisationMode : u_int8_t
23+
{
24+
SERIALISE,
25+
DESERIALISE,
26+
};
27+
28+
#define SERIALISE_NATIVE(type) \
29+
void serialise(Buffer& buffer, type& value, SerialisationMode mode) \
30+
{ \
31+
serialiseNative(buffer, value, mode); \
32+
} \
33+
void serialise(Buffer& buffer, const type& value, SerialisationMode mode) \
34+
{ \
35+
serialiseNative(buffer, value, mode); \
36+
}
2737

2838
struct Buffer
2939
{
@@ -41,30 +51,35 @@ struct BinarySerialisable
4151
{
4252
virtual ~BinarySerialisable() = default;
4353

44-
virtual void serialise(Buffer& buffer, bool deserialise) {}
54+
virtual void serialise(Buffer& buffer, SerialisationMode mode) {}
4555
};
4656

4757
template<typename T>
48-
void serialiseNative(Buffer& buffer, T& value, bool deserialise = false)
58+
void serialiseNative(Buffer& buffer, T& value, SerialisationMode mode)
4959
{
50-
if (deserialise)
51-
{
52-
value = *(const T*)(buffer.data.data() + buffer.cursor);
53-
buffer.cursor += sizeof(value);
54-
}
55-
else
60+
switch (mode)
5661
{
57-
size_t was = buffer.data.size();
58-
buffer.data.resize(was + sizeof(value));
59-
*(T*)&buffer.data[was] = value;
62+
case SERIALISE:
63+
{
64+
size_t was = buffer.data.size();
65+
buffer.data.resize(was + sizeof(value));
66+
*(T*) &buffer.data[was] = value;
67+
break;
68+
}
69+
case DESERIALISE:
70+
{
71+
value = *(const T*) (buffer.data.data() + buffer.cursor);
72+
buffer.cursor += sizeof(value);
73+
break;
74+
}
6075
}
6176
}
6277

6378
template<typename T>
64-
void serialiseNative(Buffer& buffer, const T& value, bool deserialise = false)
79+
void serialiseNative(Buffer& buffer, const T& value, SerialisationMode mode)
6580
{
6681
T& nonConstValue = const_cast<T&>(value);
67-
serialiseNative(buffer, nonConstValue, deserialise);
82+
serialiseNative(buffer, nonConstValue, mode);
6883
}
6984

7085
SERIALISE_NATIVE(bool)
@@ -74,88 +89,112 @@ SERIALISE_NATIVE(float)
7489
SERIALISE_NATIVE(double)
7590

7691
template<typename T1, typename T2>
77-
void serialise(Buffer& buffer, std::pair<T1, T2>& value, bool deserialise = false)
92+
void serialise(Buffer& buffer, std::pair<T1, T2>& value, SerialisationMode mode)
7893
{
79-
serialise(buffer, value.first, deserialise);
80-
serialise(buffer, value.second, deserialise);
94+
serialise(buffer, value.first, mode);
95+
serialise(buffer, value.second, mode);
8196
}
8297

8398
template<typename T>
8499
void serialiseContainer(Buffer& buffer, T& value)
85100
{
86101
uint32_t size = value.size();
87-
serialise(buffer, size);
102+
serialise(buffer, size, SERIALISE);
88103
for (auto& entry : value)
89104
{
90-
serialise(buffer, entry);
105+
serialise(buffer, entry, SERIALISE);
91106
}
92107
}
93108

94109
template<typename T>
95-
void serialise(Buffer& buffer, std::vector<T>& value, bool deserialise = false)
110+
void serialise(Buffer& buffer, std::vector<T>& value, SerialisationMode mode)
96111
{
97-
if (deserialise)
112+
switch (mode)
98113
{
99-
value.clear();
100-
101-
uint32_t size;
102-
serialise(buffer, size, true);
103-
value.reserve(size);
104-
105-
T entry {};
106-
while (size--)
114+
case SERIALISE:
107115
{
108-
serialise(buffer, entry, true);
109-
value.push_back(entry);
116+
serialiseContainer(buffer, value);
117+
break;
118+
}
119+
case DESERIALISE:
120+
{
121+
value.clear();
122+
123+
uint32_t size;
124+
serialise(buffer, size, mode);
125+
value.reserve(size);
126+
127+
T entry {};
128+
while (size--)
129+
{
130+
serialise(buffer, entry, mode);
131+
value.push_back(entry);
132+
}
133+
break;
110134
}
111135
}
112-
else serialiseContainer(buffer, value);
113136
}
114137

115138
template<typename T>
116-
void serialise(Buffer& buffer, std::set<T>& value, bool deserialise = false)
139+
void serialise(Buffer& buffer, std::set<T>& value, SerialisationMode mode)
117140
{
118-
if (deserialise)
141+
switch (mode)
119142
{
120-
value.clear();
121-
122-
uint32_t size;
123-
serialise(buffer, size, true);
124-
125-
T entry {};
126-
while (size--)
143+
case SERIALISE:
127144
{
128-
serialise(buffer, entry, true);
129-
value.insert(entry);
145+
serialiseContainer(buffer, value);
146+
break;
147+
}
148+
case DESERIALISE:
149+
{
150+
value.clear();
151+
152+
uint32_t size;
153+
serialise(buffer, size, mode);
154+
155+
T entry {};
156+
while (size--)
157+
{
158+
serialise(buffer, entry, mode);
159+
value.insert(entry);
160+
}
161+
break;
130162
}
131163
}
132-
else serialiseContainer(buffer, value);
133164
}
134165

135166
template<typename T1, typename T2>
136-
void serialise(Buffer& buffer, std::map<T1, T2>& value, bool deserialise = false)
167+
void serialise(Buffer& buffer, std::map<T1, T2>& value, SerialisationMode mode)
137168
{
138-
if (deserialise)
169+
switch (mode)
139170
{
140-
value.clear();
141-
142-
uint32_t size;
143-
serialise(buffer, size, true);
144-
145-
std::pair<T1, T2> entry;
146-
while (size--)
171+
case SERIALISE:
172+
{
173+
serialiseContainer(buffer, value);
174+
break;
175+
}
176+
case DESERIALISE:
147177
{
148-
serialise(buffer, entry, true);
149-
value.insert(entry);
178+
value.clear();
179+
180+
uint32_t size;
181+
serialise(buffer, size, mode);
182+
183+
std::pair<T1, T2> entry;
184+
while (size--)
185+
{
186+
serialise(buffer, entry, mode);
187+
value.insert(entry);
188+
}
189+
break;
150190
}
151191
}
152-
else serialiseContainer(buffer, value);
153192
}
154193

155194
template<typename T>
156-
void serialise(Buffer& buffer, T& value, bool deserialise = false)
195+
void serialise(Buffer& buffer, T& value, SerialisationMode mode)
157196
{
158-
value.serialise(buffer, deserialise);
197+
value.serialise(buffer, mode);
159198
}
160199

161200
} // namespace Siege::BinarySerialisation

0 commit comments

Comments
 (0)