Gamedev Framework (gf) 1.2.0
A C++17 framework for 2D games
SerializationOps.h
1/*
2 * Gamedev Framework (gf)
3 * Copyright (C) 2016-2022 Julien Bernard
4 *
5 * This software is provided 'as-is', without any express or implied
6 * warranty. In no event will the authors be held liable for any damages
7 * arising from the use of this software.
8 *
9 * Permission is granted to anyone to use this software for any purpose,
10 * including commercial applications, and to alter it and redistribute it
11 * freely, subject to the following restrictions:
12 *
13 * 1. The origin of this software must not be misrepresented; you must not
14 * claim that you wrote the original software. If you use this software
15 * in a product, an acknowledgment in the product documentation would be
16 * appreciated but is not required.
17 * 2. Altered source versions must be plainly marked as such, and must not be
18 * misrepresented as being the original software.
19 * 3. This notice may not be removed or altered from any source distribution.
20 */
21#ifndef GF_SERIALIZATION_OPS_H
22#define GF_SERIALIZATION_OPS_H
23
24#include <cstdint>
25#include <cstring>
26#include <string>
27
28#include <array>
29#include <map>
30#include <set>
31#include <type_traits>
32#include <unordered_map>
33#include <unordered_set>
34#include <vector>
35
36#include "CoreApi.h"
37#include "Flags.h"
38#include "Serialization.h"
39#include "Span.h"
40
41namespace gf {
42#ifndef DOXYGEN_SHOULD_SKIP_THIS
43inline namespace v1 {
44#endif
45
50 GF_CORE_API Serializer& operator|(Serializer& ar, bool data);
51
56 GF_CORE_API Serializer& operator|(Serializer& ar, char data);
57
62 GF_CORE_API Serializer& operator|(Serializer& ar, uint8_t data);
63
68 GF_CORE_API Serializer& operator|(Serializer& ar, uint16_t data);
69
74 GF_CORE_API Serializer& operator|(Serializer& ar, uint32_t data);
75
80 GF_CORE_API Serializer& operator|(Serializer& ar, uint64_t data);
81
86 GF_CORE_API Serializer& operator|(Serializer& ar, int8_t data);
87
92 GF_CORE_API Serializer& operator|(Serializer& ar, int16_t data);
93
98 GF_CORE_API Serializer& operator|(Serializer& ar, int32_t data);
99
104 GF_CORE_API Serializer& operator|(Serializer& ar, int64_t data);
105
110 template<typename T, typename E = typename std::enable_if<std::is_enum<T>::value, T>::type>
111 inline
113 using U = typename std::underlying_type<T>::type;
114 return ar | static_cast<U>(data);
115 }
116
121 template<typename E>
122 inline
124 return ar | data.m_data;
125 }
126
131 GF_CORE_API Serializer& operator|(Serializer& ar, float data);
132
137 GF_CORE_API Serializer& operator|(Serializer& ar, double data);
138
139#ifndef _MSC_VER
144 Serializer& operator|(Serializer& ar, const char *str) = delete;
145#endif
146
151 GF_CORE_API Serializer& operator|(Serializer& ar, const std::string& str);
152
157 template<typename T, std::size_t N>
158 inline
159 Serializer& operator|(Serializer& ar, const T (&array)[N]) {
160 ar.writeSizeHeader(N);
161
162 for (auto& item : array) {
163 ar | const_cast<T&>(item);
164 }
165
166 return ar;
167 }
168
173 template<typename T>
174 inline
175 Serializer& operator|(Serializer& ar, const std::vector<T>& array) {
176 ar.writeSizeHeader(array.size());
177
178 for (auto& item : array) {
179 ar | const_cast<T&>(item);
180 }
181
182 return ar;
183 }
184
189 template<typename T, std::size_t N>
190 inline
191 Serializer& operator|(Serializer& ar, const std::array<T, N>& array) {
192 ar.writeSizeHeader(array.size());
193
194 for (auto& item : array) {
195 ar | const_cast<T&>(item);
196 }
197
198 return ar;
199 }
200
205 template<typename T>
206 inline
207 Serializer& operator|(Serializer& ar, const std::set<T>& set) {
208 ar.writeSizeHeader(set.size());
209
210 for (auto& item : set) {
211 ar | const_cast<T&>(item);
212 }
213
214 return ar;
215 }
216
221 template<typename T>
222 inline
223 Serializer& operator|(Serializer& ar, const std::unordered_set<T>& set) {
224 ar.writeSizeHeader(set.size());
225
226 for (auto& item : set) {
227 ar | const_cast<T&>(item);
228 }
229
230 return ar;
231 }
232
237 template<typename K, typename V>
238 inline
239 Serializer& operator|(Serializer& ar, const std::map<K, V>& map) {
240 ar.writeSizeHeader(map.size());
241
242 for (auto& item : map) {
243 ar | const_cast<K&>(item.first) | const_cast<V&>(item.second);
244 }
245
246 return ar;
247 }
248
253 template<typename K, typename V>
254 inline
255 Serializer& operator|(Serializer& ar, const std::unordered_map<K, V>& map) {
256 ar.writeSizeHeader(map.size());
257
258 for (auto& item : map) {
259 ar | const_cast<K&>(item.first) | const_cast<V&>(item.second);
260 }
261
262 return ar;
263 }
264
265
266
271 GF_CORE_API Deserializer& operator|(Deserializer& ar, bool& data);
272
277 GF_CORE_API Deserializer& operator|(Deserializer& ar, char& data);
278
283 GF_CORE_API Deserializer& operator|(Deserializer& ar, uint8_t& data);
284
289 GF_CORE_API Deserializer& operator|(Deserializer& ar, uint16_t& data);
290
295 GF_CORE_API Deserializer& operator|(Deserializer& ar, uint32_t& data);
296
301 GF_CORE_API Deserializer& operator|(Deserializer& ar, uint64_t& data);
302
307 GF_CORE_API Deserializer& operator|(Deserializer& ar, int8_t& data);
308
313 GF_CORE_API Deserializer& operator|(Deserializer& ar, int16_t& data);
314
319 GF_CORE_API Deserializer& operator|(Deserializer& ar, int32_t& data);
320
325 GF_CORE_API Deserializer& operator|(Deserializer& ar, int64_t& data);
326
331 template<typename T, typename E = typename std::enable_if<std::is_enum<T>::value, T>::type>
332 inline
334 using U = typename std::underlying_type<T>::type;
335 U underlying;
336 ar | underlying;
337 data = static_cast<T>(underlying);
338 return ar;
339 }
340
345 template<typename E>
346 inline
348 return ar | data.m_data;
349 }
350
355 GF_CORE_API Deserializer& operator|(Deserializer& ar, float& data);
356
361 GF_CORE_API Deserializer& operator|(Deserializer& ar, double& data);
362
367 GF_CORE_API Deserializer& operator|(Deserializer& ar, std::string& str);
368
373 template<typename T>
374 inline
376 std::size_t size;
377
378 if (!ar.readSizeHeader(size)) {
379 return ar;
380 }
381
382 if (size != array.getSize()) {
383 return ar;
384 }
385
386 for (auto& item : array) {
387 ar | item;
388 }
389
390 return ar;
391 }
392
397 template<typename T, std::size_t N>
398 inline
399 Deserializer& operator|(Deserializer& ar, T (&array)[N]) {
400 return ar | Span<T>(array);
401 }
402
407 template<typename T, std::size_t N>
408 inline
409 Deserializer& operator|(Deserializer& ar, std::array<T, N>& array) {
410 return ar | Span<T>(array);
411 }
412
417 template<typename T>
418 inline
419 Deserializer& operator|(Deserializer& ar, std::vector<T>& array) {
420 std::size_t size;
421
422 if (!ar.readSizeHeader(size)) {
423 return ar;
424 }
425
426 array.clear();
427
428 for (std::size_t i = 0; i < size; ++i) {
429 T item;
430 ar | item;
431 array.emplace_back(std::move(item));
432 }
433
434 return ar;
435 }
436
441 template<typename T>
442 inline
443 Deserializer& operator|(Deserializer& ar, std::set<T>& set) {
444 std::size_t size;
445
446 if (!ar.readSizeHeader(size)) {
447 return ar;
448 }
449
450 set.clear();
451
452 for (std::size_t i = 0; i < size; ++i) {
453 T item;
454 ar | item;
455 set.emplace(std::move(item));
456 }
457
458 return ar;
459 }
460
465 template<typename T>
466 inline
467 Deserializer& operator|(Deserializer& ar, std::unordered_set<T>& set) {
468 std::size_t size;
469
470 if (!ar.readSizeHeader(size)) {
471 return ar;
472 }
473
474 set.clear();
475
476 for (std::size_t i = 0; i < size; ++i) {
477 T item;
478 ar | item;
479 set.emplace(std::move(item));
480 }
481
482 return ar;
483 }
484
489 template<typename K, typename V>
490 inline
491 Deserializer& operator|(Deserializer& ar, std::map<K,V>& map) {
492 std::size_t size;
493
494 if (!ar.readSizeHeader(size)) {
495 return ar;
496 }
497
498 map.clear();
499
500 for (std::size_t i = 0; i < size; ++i) {
501 K key;
502 ar | key;
503 V value;
504 ar | value;
505
506 map.emplace(std::move(key), std::move(value));
507 }
508
509 return ar;
510 }
511
516 template<typename K, typename V>
517 inline
518 Deserializer& operator|(Deserializer& ar, std::unordered_map<K,V>& map) {
519 std::size_t size;
520
521 if (!ar.readSizeHeader(size)) {
522 return ar;
523 }
524
525 map.clear();
526
527 for (std::size_t i = 0; i < size; ++i) {
528 K key;
529 ar | key;
530 V value;
531 ar | value;
532
533 map.emplace(std::move(key), std::move(value));
534 }
535
536 return ar;
537 }
538
539#ifndef DOXYGEN_SHOULD_SKIP_THIS
540}
541#endif
542}
543
544#endif // GF_SERIALIZATION_OPS_H
A deserializer from a binary file.
Definition: Serialization.h:151
GF_CORE_API Deserializer & operator|(Deserializer &ar, bool &data)
Deserialize a bool object.
GF_CORE_API Deserializer & operator|(Deserializer &ar, int64_t &data)
Deserialize a signed integer object.
GF_CORE_API Deserializer & operator|(Deserializer &ar, uint64_t &data)
Deserialize an unsigned integer object.
GF_CORE_API Deserializer & operator|(Deserializer &ar, std::string &str)
Deserialize a string object.
GF_CORE_API Deserializer & operator|(Deserializer &ar, int32_t &data)
Deserialize a signed integer object.
Deserializer & operator|(Deserializer &ar, Flags< E > &data)
Deserialize flags.
Definition: SerializationOps.h:347
Deserializer & operator|(Deserializer &ar, std::vector< T > &array)
Deserialize an array object.
Definition: SerializationOps.h:419
Deserializer & operator|(Deserializer &ar, std::array< T, N > &array)
Deserialize an array object.
Definition: SerializationOps.h:409
Deserializer & operator|(Deserializer &ar, std::unordered_set< T > &set)
Deserialize a set object.
Definition: SerializationOps.h:467
GF_CORE_API Deserializer & operator|(Deserializer &ar, int16_t &data)
Deserialize a signed integer object.
Deserializer & operator|(Deserializer &ar, std::unordered_map< K, V > &map)
Deserialize a map object.
Definition: SerializationOps.h:518
Deserializer & operator|(Deserializer &ar, std::map< K, V > &map)
Deserialize a map object.
Definition: SerializationOps.h:491
Deserializer & operator|(Deserializer &ar, T(&array)[N])
Deserialize an array object.
Definition: SerializationOps.h:399
bool readSizeHeader(std::size_t &size)
Read a size header.
Deserializer & operator|(Deserializer &ar, T &data)
Deserialize an enum object.
Definition: SerializationOps.h:333
GF_CORE_API Deserializer & operator|(Deserializer &ar, uint8_t &data)
Deserialize an unsigned integer object.
GF_CORE_API Deserializer & operator|(Deserializer &ar, uint32_t &data)
Deserialize an unsigned integer object.
GF_CORE_API Deserializer & operator|(Deserializer &ar, float &data)
Deserialize a single precision float object.
Deserializer & operator|(Deserializer &ar, std::set< T > &set)
Deserialize a set object.
Definition: SerializationOps.h:443
GF_CORE_API Deserializer & operator|(Deserializer &ar, char &data)
Deserialize a char object.
GF_CORE_API Deserializer & operator|(Deserializer &ar, double &data)
Deserialize a double precision float object.
GF_CORE_API Deserializer & operator|(Deserializer &ar, int8_t &data)
Deserialize a signed integer object.
Deserializer & operator|(Deserializer &ar, Span< T > array)
Deserialize an array object.
Definition: SerializationOps.h:375
GF_CORE_API Deserializer & operator|(Deserializer &ar, uint16_t &data)
Deserialize an unsigned integer object.
Bitfield relying on an enumeration.
Definition: Flags.h:48
A serializer to a binary file.
Definition: Serialization.h:43
GF_CORE_API Serializer & operator|(Serializer &ar, bool data)
Serialize a boolean object.
Serializer & operator|(Serializer &ar, const std::vector< T > &array)
Serialize an array object.
Definition: SerializationOps.h:175
Serializer & operator|(Serializer &ar, T data)
Serialize an enum object.
Definition: SerializationOps.h:112
GF_CORE_API Serializer & operator|(Serializer &ar, uint16_t data)
Serialize an unsigned integer object.
Serializer & operator|(Serializer &ar, const char *str)=delete
Do not serialize a string object via a pointer.
GF_CORE_API Serializer & operator|(Serializer &ar, float data)
Serialize a single precision float object.
Serializer & operator|(Serializer &ar, const std::unordered_map< K, V > &map)
Serialize a map object.
Definition: SerializationOps.h:255
Serializer & operator|(Serializer &ar, const std::unordered_set< T > &set)
Serialize a set object.
Definition: SerializationOps.h:223
Serializer & operator|(Serializer &ar, Flags< E > data)
Serialize flags.
Definition: SerializationOps.h:123
void writeSizeHeader(std::size_t size)
Write a size header.
GF_CORE_API Serializer & operator|(Serializer &ar, uint32_t data)
Serialize an unsigned integer object.
Serializer & operator|(Serializer &ar, const T(&array)[N])
Serialize an array object.
Definition: SerializationOps.h:159
Serializer & operator|(Serializer &ar, const std::array< T, N > &array)
Serialize an array object.
Definition: SerializationOps.h:191
GF_CORE_API Serializer & operator|(Serializer &ar, int8_t data)
Serialize a signed integer object.
GF_CORE_API Serializer & operator|(Serializer &ar, int16_t data)
Serialize a signed integer object.
GF_CORE_API Serializer & operator|(Serializer &ar, uint64_t data)
Serialize an unsigned integer object.
GF_CORE_API Serializer & operator|(Serializer &ar, int64_t data)
Serialize a signed integer object.
GF_CORE_API Serializer & operator|(Serializer &ar, int32_t data)
Serialize a signed integer object.
GF_CORE_API Serializer & operator|(Serializer &ar, double data)
Serialize a double precision float object.
Serializer & operator|(Serializer &ar, const std::map< K, V > &map)
Serialize a map object.
Definition: SerializationOps.h:239
Serializer & operator|(Serializer &ar, const std::set< T > &set)
Serialize a set object.
Definition: SerializationOps.h:207
GF_CORE_API Serializer & operator|(Serializer &ar, uint8_t data)
Serialize an unsigned integer object.
GF_CORE_API Serializer & operator|(Serializer &ar, char data)
Serialize a char object.
GF_CORE_API Serializer & operator|(Serializer &ar, const std::string &str)
Serialize a string object.
A span.
Definition: Span.h:414
constexpr std::size_t getSize() const noexcept
Get the number of elements.
Definition: Span.h:552
The namespace for gf classes.