Gamedev Framework (gf)  0.20.0
A C++17 framework for 2D games
SerializationOps.h
1 /*
2  * Gamedev Framework (gf)
3  * Copyright (C) 2016-2021 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 
40 namespace gf {
41 #ifndef DOXYGEN_SHOULD_SKIP_THIS
42 inline 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
129 
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
Deserializer & operator|(Deserializer &ar, T &data)
Deserialize an enum object.
Definition: SerializationOps.h:322
void writeSizeHeader(std::size_t size)
Write a size header.
Deserializer & operator|(Deserializer &ar, std::unordered_map< K, V > &map)
Deserialize a map object.
Definition: SerializationOps.h:497
A span.
Definition: Span.h:36
Deserializer & operator|(Deserializer &ar, T(&array)[N])
Deserialize an array object.
Definition: SerializationOps.h:378
Deserializer & operator|(Deserializer &ar, std::set< T > &set)
Deserialize a set object.
Definition: SerializationOps.h:422
constexpr std::size_t getSize() const noexcept
Get the number of elements.
Definition: Span.h:555
Deserializer & operator|(Deserializer &ar, Span< T > array)
Deserialize an array object.
Definition: SerializationOps.h:354
bool readSizeHeader(std::size_t &size)
Read a size header.
Serializer & operator|(Serializer &ar, const std::vector< T > &array)
Serialize an array object.
Definition: SerializationOps.h:164
Serializer & operator|(Serializer &ar, const std::map< K, V > &map)
Serialize a map object.
Definition: SerializationOps.h:228
A serializer to a binary file.
Definition: Serialization.h:43
The namespace for gf classes.
Definition: Action.h:35
Serializer & operator|(Serializer &ar, const std::array< T, N > &array)
Serialize an array object.
Definition: SerializationOps.h:180
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
Serializer & operator|(Serializer &ar, const std::unordered_set< T > &set)
Serialize a set object.
Definition: SerializationOps.h:212
Deserializer & operator|(Deserializer &ar, std::vector< T > &array)
Deserialize an array object.
Definition: SerializationOps.h:398
Deserializer & operator|(Deserializer &ar, std::map< K, V > &map)
Deserialize a map object.
Definition: SerializationOps.h:470
Serializer & operator|(Serializer &ar, T data)
Serialize an enum object.
Definition: SerializationOps.h:111
Serializer & operator|(Serializer &ar, const T(&array)[N])
Serialize an array object.
Definition: SerializationOps.h:148
Serializer & operator|(Serializer &ar, const std::set< T > &set)
Serialize a set object.
Definition: SerializationOps.h:196
Serializer & operator|(Serializer &ar, const std::unordered_map< K, V > &map)
Serialize a map object.
Definition: SerializationOps.h:244