10
10
#ifndef SIEGE_ENGINE_BINARYSERIALISATION_H
11
11
#define SIEGE_ENGINE_BINARYSERIALISATION_H
12
12
13
- #include < vector>
14
- #include < set>
15
13
#include < map>
14
+ #include < set>
15
+ #include < vector>
16
16
17
17
#include " String.h"
18
18
19
19
namespace Siege ::BinarySerialisation
20
20
{
21
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); }
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
+ }
27
37
28
38
struct Buffer
29
39
{
@@ -41,30 +51,35 @@ struct BinarySerialisable
41
51
{
42
52
virtual ~BinarySerialisable () = default ;
43
53
44
- virtual void serialise (Buffer& buffer, bool deserialise ) {}
54
+ virtual void serialise (Buffer& buffer, SerialisationMode mode ) {}
45
55
};
46
56
47
57
template <typename T>
48
- void serialiseNative (Buffer& buffer, T& value, bool deserialise = false )
58
+ void serialiseNative (Buffer& buffer, T& value, SerialisationMode mode )
49
59
{
50
- if (deserialise)
51
- {
52
- value = *(const T*)(buffer.data .data () + buffer.cursor );
53
- buffer.cursor += sizeof (value);
54
- }
55
- else
60
+ switch (mode)
56
61
{
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
+ }
60
75
}
61
76
}
62
77
63
78
template <typename T>
64
- void serialiseNative (Buffer& buffer, const T& value, bool deserialise = false )
79
+ void serialiseNative (Buffer& buffer, const T& value, SerialisationMode mode )
65
80
{
66
81
T& nonConstValue = const_cast <T&>(value);
67
- serialiseNative (buffer, nonConstValue, deserialise );
82
+ serialiseNative (buffer, nonConstValue, mode );
68
83
}
69
84
70
85
SERIALISE_NATIVE (bool )
@@ -74,88 +89,112 @@ SERIALISE_NATIVE(float)
74
89
SERIALISE_NATIVE (double )
75
90
76
91
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 )
78
93
{
79
- serialise (buffer, value.first , deserialise );
80
- serialise (buffer, value.second , deserialise );
94
+ serialise (buffer, value.first , mode );
95
+ serialise (buffer, value.second , mode );
81
96
}
82
97
83
98
template <typename T>
84
99
void serialiseContainer (Buffer& buffer, T& value)
85
100
{
86
101
uint32_t size = value.size ();
87
- serialise (buffer, size);
102
+ serialise (buffer, size, SERIALISE );
88
103
for (auto & entry : value)
89
104
{
90
- serialise (buffer, entry);
105
+ serialise (buffer, entry, SERIALISE );
91
106
}
92
107
}
93
108
94
109
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 )
96
111
{
97
- if (deserialise )
112
+ switch (mode )
98
113
{
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:
107
115
{
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 ;
110
134
}
111
135
}
112
- else serialiseContainer (buffer, value);
113
136
}
114
137
115
138
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 )
117
140
{
118
- if (deserialise )
141
+ switch (mode )
119
142
{
120
- value.clear ();
121
-
122
- uint32_t size;
123
- serialise (buffer, size, true );
124
-
125
- T entry {};
126
- while (size--)
143
+ case SERIALISE:
127
144
{
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 ;
130
162
}
131
163
}
132
- else serialiseContainer (buffer, value);
133
164
}
134
165
135
166
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 )
137
168
{
138
- if (deserialise )
169
+ switch (mode )
139
170
{
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:
147
177
{
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 ;
150
190
}
151
191
}
152
- else serialiseContainer (buffer, value);
153
192
}
154
193
155
194
template <typename T>
156
- void serialise (Buffer& buffer, T& value, bool deserialise = false )
195
+ void serialise (Buffer& buffer, T& value, SerialisationMode mode )
157
196
{
158
- value.serialise (buffer, deserialise );
197
+ value.serialise (buffer, mode );
159
198
}
160
199
161
200
} // namespace Siege::BinarySerialisation
0 commit comments