Gamedev Framework (gf)  0.8.0
A C++14 framework for 2D games
SerializationOps.h
1 /*
2  * Gamedev Framework (gf)
3  * Copyright (C) 2016-2018 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 
27 #include <array>
28 #include <map>
29 #include <unordered_map>
30 #include <vector>
31 
32 #include "BufferRef.h"
33 #include "Portability.h"
34 #include "Serialization.h"
35 
36 namespace gf {
37 #ifndef DOXYGEN_SHOULD_SKIP_THIS
38 inline namespace v1 {
39 #endif
40 
41  struct DataObject;
42 
47  GF_API Serializer& operator|(Serializer& ar, std::nullptr_t);
48 
53  GF_API Serializer& operator|(Serializer& ar, bool data);
54 
59  GF_API Serializer& operator|(Serializer& ar, uint8_t data);
60 
65  GF_API Serializer& operator|(Serializer& ar, uint16_t data);
66 
71  GF_API Serializer& operator|(Serializer& ar, uint32_t data);
72 
77  GF_API Serializer& operator|(Serializer& ar, uint64_t data);
78 
83  GF_API Serializer& operator|(Serializer& ar, int8_t data);
84 
89  GF_API Serializer& operator|(Serializer& ar, int16_t data);
90 
95  GF_API Serializer& operator|(Serializer& ar, int32_t data);
96 
101  GF_API Serializer& operator|(Serializer& ar, int64_t data);
102 
107  GF_API Serializer& operator|(Serializer& ar, float data);
108 
113  GF_API Serializer& operator|(Serializer& ar, double data);
114 
119  GF_API Serializer& operator|(Serializer& ar, const char *str);
120 
125  GF_API Serializer& operator|(Serializer& ar, const std::string& str);
126 
131  template<std::size_t N>
132  inline
133  Serializer& operator|(Serializer& ar, const uint8_t (&bin)[N]) {
134  ar.writeBinary(bin, static_cast<uint32_t>(N));
135  return ar;
136  }
137 
142  GF_API Serializer& operator|(Serializer& ar, const std::vector<uint8_t>& bin);
143 
148  template<std::size_t N>
149  inline
150  Serializer& operator|(Serializer& ar, const std::array<uint8_t, N>& bin) {
151  ar.writeBinary(bin.data(), static_cast<uint32_t>(bin.size()));
152  return ar;
153  }
154 
159  template<typename T, std::size_t N>
160  inline
161  Serializer& operator|(Serializer& ar, const T (&array)[N]) {
162  ar.writeArrayHeader(static_cast<uint32_t>(N));
163 
164  for (auto& item : array) {
165  ar | item;
166  }
167 
168  return ar;
169  }
170 
175  template<typename T>
176  inline
177  Serializer& operator|(Serializer& ar, const std::vector<T>& array) {
178  ar.writeArrayHeader(static_cast<uint32_t>(array.size()));
179 
180  for (auto& item : array) {
181  ar | item;
182  }
183 
184  return ar;
185  }
186 
191  template<typename T, std::size_t N>
192  inline
193  Serializer& operator|(Serializer& ar, const std::array<T, N>& array) {
194  ar.writeArrayHeader(static_cast<uint32_t>(array.size()));
195 
196  for (auto& item : array) {
197  ar | item;
198  }
199 
200  return ar;
201  }
202 
207  template<typename K, typename V>
208  inline
209  Serializer& operator|(Serializer& ar, const std::map<K, V>& map) {
210  ar.writeMapHeader(static_cast<uint32_t>(map.size()));
211 
212  for (auto& item : map) {
213  ar | item.first | item.second;
214  }
215 
216  return ar;
217  }
218 
223  template<typename K, typename V>
224  inline
225  Serializer& operator|(Serializer& ar, const std::unordered_map<K, V>& map) {
226  ar.writeMapHeader(static_cast<uint32_t>(map.size()));
227 
228  for (auto& item : map) {
229  ar | item.first | item.second;
230  }
231 
232  return ar;
233  }
234 
239  GF_API Serializer& operator|(Serializer& ar, const DataObject& object);
240 
241 
242 
247  GF_API Deserializer& operator|(Deserializer& ar, std::nullptr_t);
248 
253  GF_API Deserializer& operator|(Deserializer& ar, bool& data);
254 
259  GF_API Deserializer& operator|(Deserializer& ar, uint8_t& data);
260 
265  GF_API Deserializer& operator|(Deserializer& ar, uint16_t& data);
266 
271  GF_API Deserializer& operator|(Deserializer& ar, uint32_t& data);
272 
277  GF_API Deserializer& operator|(Deserializer& ar, uint64_t& data);
278 
283  GF_API Deserializer& operator|(Deserializer& ar, int8_t& data);
284 
289  GF_API Deserializer& operator|(Deserializer& ar, int16_t& data);
290 
295  GF_API Deserializer& operator|(Deserializer& ar, int32_t& data);
296 
301  GF_API Deserializer& operator|(Deserializer& ar, int64_t& data);
302 
307  GF_API Deserializer& operator|(Deserializer& ar, float& data);
308 
313  GF_API Deserializer& operator|(Deserializer& ar, double& data);
314 
319  GF_API Deserializer& operator|(Deserializer& ar, BufferRef<char> str);
320 
325  GF_API Deserializer& operator|(Deserializer& ar, std::string& str);
326 
331  GF_API Deserializer& operator|(Deserializer& ar, BufferRef<uint8_t> bin);
332 
337  GF_API Deserializer& operator|(Deserializer& ar, std::vector<uint8_t>& bin);
338 
343  template<typename T>
344  inline
346  uint32_t size;
347 
348  if (!ar.readArrayHeader(size)) {
349  return ar;
350  }
351 
352  if (size != array.getSize()) {
353  return ar;
354  }
355 
356  for (auto& item : array) {
357  ar | item;
358  }
359 
360  return ar;
361  }
362 
367  template<typename T, std::size_t N>
368  inline
369  Deserializer& operator|(Deserializer& ar, T (&array)[N]) {
370  return ar | BufferRef<T>(array);
371  }
372 
377  template<typename T, std::size_t N>
378  inline
379  Deserializer& operator|(Deserializer& ar, std::array<T, N>& array) {
380  return ar | BufferRef<T>(array);
381  }
382 
387  template<typename T>
388  inline
389  Deserializer& operator|(Deserializer& ar, std::vector<T>& array) {
390  uint32_t size;
391 
392  if (!ar.readArrayHeader(size)) {
393  return ar;
394  }
395 
396  array.clear();
397 
398  for (uint32_t i = 0; i < size; ++i) {
399  T item;
400  ar | item;
401  array.emplace_back(std::move(item));
402  }
403 
404  return ar;
405  }
406 
411  template<typename K, typename V>
412  inline
413  Deserializer& operator|(Deserializer& ar, std::map<K,V>& map) {
414  uint32_t size;
415 
416  if (!ar.readMapHeader(size)) {
417  return ar;
418  }
419 
420  map.clear();
421 
422  for (uint32_t i = 0; i < size; ++i) {
423  K key;
424  ar | key;
425  V value;
426  ar | value;
427 
428  map.emplace(std::move(key), std::move(value));
429  }
430 
431  return ar;
432  }
433 
438  template<typename K, typename V>
439  inline
440  Deserializer& operator|(Deserializer& ar, std::unordered_map<K,V>& map) {
441  uint32_t size;
442 
443  if (!ar.readMapHeader(size)) {
444  return ar;
445  }
446 
447  map.clear();
448 
449  for (uint32_t i = 0; i < size; ++i) {
450  K key;
451  ar | key;
452  V value;
453  ar | value;
454 
455  map.emplace(std::move(key), std::move(value));
456  }
457 
458  return ar;
459  }
460 
465  GF_API Deserializer& operator|(Deserializer& ar, DataObject& object);
466 
467 #ifndef DOXYGEN_SHOULD_SKIP_THIS
468 }
469 #endif
470 }
471 
472 #endif // GF_SERIALIZATION_OPS_H
A deserializer from a binary file.
Definition: Serialization.h:130
void writeArrayHeader(uint32_t size)
Write an array header.
Serializer & operator|(Serializer &ar, const std::array< uint8_t, N > &bin)
Serialize a binary object.
Definition: SerializationOps.h:150
Deserializer & operator|(Deserializer &ar, std::unordered_map< K, V > &map)
Deserialize a map object.
Definition: SerializationOps.h:440
constexpr std::size_t getSize() const noexcept
Get the number of elements.
Definition: BufferRef.h:136
bool readMapHeader(uint32_t &size)
Read a map header.
Deserializer & operator|(Deserializer &ar, T(&array)[N])
Deserialize an array object.
Definition: SerializationOps.h:369
A reference to a modifiable buffer and its size.
Definition: BufferRef.h:43
Serializer & operator|(Serializer &ar, const std::vector< T > &array)
Serialize an array object.
Definition: SerializationOps.h:177
Serializer & operator|(Serializer &ar, const uint8_t(&bin)[N])
Serialize a binary object.
Definition: SerializationOps.h:133
Serializer & operator|(Serializer &ar, const std::map< K, V > &map)
Serialize a map object.
Definition: SerializationOps.h:209
void writeMapHeader(uint32_t size)
Write a map header.
A serializer to a binary file.
Definition: Serialization.h:47
The namespace for gf classes.
Definition: Action.h:34
Serializer & operator|(Serializer &ar, const std::array< T, N > &array)
Serialize an array object.
Definition: SerializationOps.h:193
Deserializer & operator|(Deserializer &ar, std::array< T, N > &array)
Deserialize an array object.
Definition: SerializationOps.h:379
Deserializer & operator|(Deserializer &ar, BufferRef< T > array)
Deserialize an array object.
Definition: SerializationOps.h:345
A data object.
Definition: DataObject.h:200
void writeBinary(const uint8_t *data, uint32_t size)
Write a binary object.
Deserializer & operator|(Deserializer &ar, std::vector< T > &array)
Deserialize an array object.
Definition: SerializationOps.h:389
Deserializer & operator|(Deserializer &ar, std::map< K, V > &map)
Deserialize a map object.
Definition: SerializationOps.h:413
Serializer & operator|(Serializer &ar, const T(&array)[N])
Serialize an array object.
Definition: SerializationOps.h:161
bool readArrayHeader(uint32_t &size)
Read an array header.
Serializer & operator|(Serializer &ar, const std::unordered_map< K, V > &map)
Serialize a map object.
Definition: SerializationOps.h:225