Gamedev Framework (gf) 0.22.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 "Serialization.h"
38#include "Span.h"
39
40namespace gf {
41#ifndef DOXYGEN_SHOULD_SKIP_THIS
42inline namespace v1 {
43#endif
44
49 GF_CORE_API Serializer& operator|(Serializer& ar, bool data);
50
55 GF_CORE_API Serializer& operator|(Serializer& ar, char data);
56
61 GF_CORE_API Serializer& operator|(Serializer& ar, uint8_t data);
62
67 GF_CORE_API Serializer& operator|(Serializer& ar, uint16_t data);
68
73 GF_CORE_API Serializer& operator|(Serializer& ar, uint32_t data);
74
79 GF_CORE_API Serializer& operator|(Serializer& ar, uint64_t data);
80
85 GF_CORE_API Serializer& operator|(Serializer& ar, int8_t data);
86
91 GF_CORE_API Serializer& operator|(Serializer& ar, int16_t data);
92
97 GF_CORE_API Serializer& operator|(Serializer& ar, int32_t data);
98
103 GF_CORE_API Serializer& operator|(Serializer& ar, int64_t data);
104
109 template<typename T, typename E = typename std::enable_if<std::is_enum<T>::value, T>::type>
110 inline
112 using U = typename std::underlying_type<T>::type;
113 return ar | static_cast<U>(data);
114 }
115
120 GF_CORE_API Serializer& operator|(Serializer& ar, float data);
121
126 GF_CORE_API Serializer& operator|(Serializer& ar, double data);
127
128#ifndef _MSC_VER
133 Serializer& operator|(Serializer& ar, const char *str) = delete;
134#endif
135
140 GF_CORE_API Serializer& operator|(Serializer& ar, const std::string& str);
141
146 template<typename T, std::size_t N>
147 inline
148 Serializer& operator|(Serializer& ar, const T (&array)[N]) {
149 ar.writeSizeHeader(N);
150
151 for (auto& item : array) {
152 ar | const_cast<T&>(item);
153 }
154
155 return ar;
156 }
157
162 template<typename T>
163 inline
164 Serializer& operator|(Serializer& ar, const std::vector<T>& array) {
165 ar.writeSizeHeader(array.size());
166
167 for (auto& item : array) {
168 ar | const_cast<T&>(item);
169 }
170
171 return ar;
172 }
173
178 template<typename T, std::size_t N>
179 inline
180 Serializer& operator|(Serializer& ar, const std::array<T, N>& array) {
181 ar.writeSizeHeader(array.size());
182
183 for (auto& item : array) {
184 ar | const_cast<T&>(item);
185 }
186
187 return ar;
188 }
189
194 template<typename T>
195 inline
196 Serializer& operator|(Serializer& ar, const std::set<T>& set) {
197 ar.writeSizeHeader(set.size());
198
199 for (auto& item : set) {
200 ar | const_cast<T&>(item);
201 }
202
203 return ar;
204 }
205
210 template<typename T>
211 inline
212 Serializer& operator|(Serializer& ar, const std::unordered_set<T>& set) {
213 ar.writeSizeHeader(set.size());
214
215 for (auto& item : set) {
216 ar | const_cast<T&>(item);
217 }
218
219 return ar;
220 }
221
226 template<typename K, typename V>
227 inline
228 Serializer& operator|(Serializer& ar, const std::map<K, V>& map) {
229 ar.writeSizeHeader(map.size());
230
231 for (auto& item : map) {
232 ar | const_cast<K&>(item.first) | const_cast<V&>(item.second);
233 }
234
235 return ar;
236 }
237
242 template<typename K, typename V>
243 inline
244 Serializer& operator|(Serializer& ar, const std::unordered_map<K, V>& map) {
245 ar.writeSizeHeader(map.size());
246
247 for (auto& item : map) {
248 ar | const_cast<K&>(item.first) | const_cast<V&>(item.second);
249 }
250
251 return ar;
252 }
253
254
255
260 GF_CORE_API Deserializer& operator|(Deserializer& ar, bool& data);
261
266 GF_CORE_API Deserializer& operator|(Deserializer& ar, char& data);
267
272 GF_CORE_API Deserializer& operator|(Deserializer& ar, uint8_t& data);
273
278 GF_CORE_API Deserializer& operator|(Deserializer& ar, uint16_t& data);
279
284 GF_CORE_API Deserializer& operator|(Deserializer& ar, uint32_t& data);
285
290 GF_CORE_API Deserializer& operator|(Deserializer& ar, uint64_t& data);
291
296 GF_CORE_API Deserializer& operator|(Deserializer& ar, int8_t& data);
297
302 GF_CORE_API Deserializer& operator|(Deserializer& ar, int16_t& data);
303
308 GF_CORE_API Deserializer& operator|(Deserializer& ar, int32_t& data);
309
314 GF_CORE_API Deserializer& operator|(Deserializer& ar, int64_t& data);
315
320 template<typename T, typename E = typename std::enable_if<std::is_enum<T>::value, T>::type>
321 inline
323 using U = typename std::underlying_type<T>::type;
324 U underlying;
325 ar | underlying;
326 data = static_cast<T>(underlying);
327 return ar;
328 }
329
334 GF_CORE_API Deserializer& operator|(Deserializer& ar, float& data);
335
340 GF_CORE_API Deserializer& operator|(Deserializer& ar, double& data);
341
346 GF_CORE_API Deserializer& operator|(Deserializer& ar, std::string& str);
347
352 template<typename T>
353 inline
355 std::size_t size;
356
357 if (!ar.readSizeHeader(size)) {
358 return ar;
359 }
360
361 if (size != array.getSize()) {
362 return ar;
363 }
364
365 for (auto& item : array) {
366 ar | item;
367 }
368
369 return ar;
370 }
371
376 template<typename T, std::size_t N>
377 inline
378 Deserializer& operator|(Deserializer& ar, T (&array)[N]) {
379 return ar | Span<T>(array);
380 }
381
386 template<typename T, std::size_t N>
387 inline
388 Deserializer& operator|(Deserializer& ar, std::array<T, N>& array) {
389 return ar | Span<T>(array);
390 }
391
396 template<typename T>
397 inline
398 Deserializer& operator|(Deserializer& ar, std::vector<T>& array) {
399 std::size_t size;
400
401 if (!ar.readSizeHeader(size)) {
402 return ar;
403 }
404
405 array.clear();
406
407 for (std::size_t i = 0; i < size; ++i) {
408 T item;
409 ar | item;
410 array.emplace_back(std::move(item));
411 }
412
413 return ar;
414 }
415
420 template<typename T>
421 inline
422 Deserializer& operator|(Deserializer& ar, std::set<T>& set) {
423 std::size_t size;
424
425 if (!ar.readSizeHeader(size)) {
426 return ar;
427 }
428
429 set.clear();
430
431 for (std::size_t i = 0; i < size; ++i) {
432 T item;
433 ar | item;
434 set.emplace(std::move(item));
435 }
436
437 return ar;
438 }
439
444 template<typename T>
445 inline
446 Deserializer& operator|(Deserializer& ar, std::unordered_set<T>& set) {
447 std::size_t size;
448
449 if (!ar.readSizeHeader(size)) {
450 return ar;
451 }
452
453 set.clear();
454
455 for (std::size_t i = 0; i < size; ++i) {
456 T item;
457 ar | item;
458 set.emplace(std::move(item));
459 }
460
461 return ar;
462 }
463
468 template<typename K, typename V>
469 inline
470 Deserializer& operator|(Deserializer& ar, std::map<K,V>& map) {
471 std::size_t size;
472
473 if (!ar.readSizeHeader(size)) {
474 return ar;
475 }
476
477 map.clear();
478
479 for (std::size_t i = 0; i < size; ++i) {
480 K key;
481 ar | key;
482 V value;
483 ar | value;
484
485 map.emplace(std::move(key), std::move(value));
486 }
487
488 return ar;
489 }
490
495 template<typename K, typename V>
496 inline
497 Deserializer& operator|(Deserializer& ar, std::unordered_map<K,V>& map) {
498 std::size_t size;
499
500 if (!ar.readSizeHeader(size)) {
501 return ar;
502 }
503
504 map.clear();
505
506 for (std::size_t i = 0; i < size; ++i) {
507 K key;
508 ar | key;
509 V value;
510 ar | value;
511
512 map.emplace(std::move(key), std::move(value));
513 }
514
515 return ar;
516 }
517
518#ifndef DOXYGEN_SHOULD_SKIP_THIS
519}
520#endif
521}
522
523#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, std::vector< T > &array)
Deserialize an array object.
Definition: SerializationOps.h:398
Deserializer & operator|(Deserializer &ar, std::array< T, N > &array)
Deserialize an array object.
Definition: SerializationOps.h:388
Deserializer & operator|(Deserializer &ar, std::unordered_set< T > &set)
Deserialize a set object.
Definition: SerializationOps.h:446
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:497
Deserializer & operator|(Deserializer &ar, std::map< K, V > &map)
Deserialize a map object.
Definition: SerializationOps.h:470
Deserializer & operator|(Deserializer &ar, T(&array)[N])
Deserialize an array object.
Definition: SerializationOps.h:378
bool readSizeHeader(std::size_t &size)
Read a size header.
Deserializer & operator|(Deserializer &ar, T &data)
Deserialize an enum object.
Definition: SerializationOps.h:322
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:422
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:354
GF_CORE_API Deserializer & operator|(Deserializer &ar, uint16_t &data)
Deserialize an unsigned integer object.
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:164
Serializer & operator|(Serializer &ar, T data)
Serialize an enum object.
Definition: SerializationOps.h:111
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:244
Serializer & operator|(Serializer &ar, const std::unordered_set< T > &set)
Serialize a set object.
Definition: SerializationOps.h:212
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:148
Serializer & operator|(Serializer &ar, const std::array< T, N > &array)
Serialize an array object.
Definition: SerializationOps.h:180
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:228
Serializer & operator|(Serializer &ar, const std::set< T > &set)
Serialize a set object.
Definition: SerializationOps.h:196
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:417
constexpr std::size_t getSize() const noexcept
Get the number of elements.
Definition: Span.h:555
The namespace for gf classes.