Gamedev Framework (gf)  0.8.0
A C++14 framework for 2D games
Data.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_DATA_H
22 #define GF_DATA_H
23 
24 #include <cassert>
25 #include <cstddef>
26 #include <cstdint>
27 #include <cstring>
28 
29 #include <algorithm>
30 #include <array>
31 #include <iterator>
32 #include <map>
33 #include <string>
34 #include <unordered_map>
35 #include <vector>
36 
37 #include "DataObject.h"
38 #include "Portability.h"
39 
40 namespace gf {
41 #ifndef DOXYGEN_SHOULD_SKIP_THIS
42 inline namespace v1 {
43 #endif
44 
51  struct GF_API Data {
55  Data() = delete;
56 
63  template<typename T>
64  static DataObject convert(T data) {
65  return DataObject(data);
66  }
67 
74  static DataObject convert(const char *data) {
75  return convertString(data, data + std::strlen(data));
76  }
77 
84  static DataObject convert(const std::string& data) {
85  return convertString(data.begin(), data.end());
86  }
87 
94  template<std::size_t N>
95  static DataObject convert(const uint8_t (&data)[N]) {
96  return convertBinary(data, data + N, N);
97  }
98 
105  static DataObject convert(const std::vector<uint8_t>& data) {
106  return convertBinary(data.begin(), data.end(), data.size());
107  }
108 
115  template<std::size_t N>
116  static DataObject convert(const std::array<uint8_t,N>& data) {
117  return convertBinary(data.begin(), data.end(), data.size());
118  }
119 
126  template<typename T, std::size_t N>
127  static DataObject convert(const T (&data)[N]) {
128  return convertArray(data, data + N, N);
129  }
130 
137  template<typename T>
138  static DataObject convert(const std::vector<T>& data) {
139  return convertArray(data.begin(), data.end(), data.size());
140  }
141 
148  template<typename T, std::size_t N>
149  static DataObject convert(const std::array<T,N>& data) {
150  return convertArray(data.begin(), data.end(), data.size());
151  }
152 
159  template<typename K, typename V>
160  static DataObject convert(const std::map<K,V>& data) {
161  return convertMap(data.begin(), data.end(), data.size());
162  }
163 
170  template<typename K, typename V>
171  static DataObject convert(const std::unordered_map<K,V>& data) {
172  return convertMap(data.begin(), data.end(), data.size());
173  }
174 
175  private:
176 
177  template<typename Iterator>
178  static DataObject convertString(Iterator b, Iterator e) {
179  static_assert(std::is_same<typename std::iterator_traits<Iterator>::value_type, char>::value, "Not a string");
180 
181  DataObject object;
182  object.type = DataType::String;
183 
184  std::size_t size = std::distance(b, e);
185  assert(size < UINT32_MAX);
186  object.string.size = static_cast<uint32_t>(size);
187  auto buffer = new char[size + 1];
188  std::copy(b, e, buffer);
189  buffer[size] = '\0';
190  object.string.data = buffer;
191 
192  return object;
193  }
194 
195  template<typename Iterator>
196  static DataObject convertBinary(Iterator b, Iterator e, std::size_t size) {
197  static_assert(std::is_same<typename std::iterator_traits<Iterator>::value_type, uint8_t>::value, "Not binary");
198 
199  DataObject object;
200  object.type = DataType::Binary;
201 
202  assert(size < UINT32_MAX);
203  object.binary.size = static_cast<uint32_t>(size);
204  auto buffer = new uint8_t[size];
205  std::copy(b, e, buffer);
206  object.binary.data = buffer;
207 
208  return object;
209  }
210 
211  template<typename Iterator>
212  static DataObject convertArray(Iterator b, Iterator e, std::size_t size) {
213  DataObject object;
214  object.type = DataType::Array;
215 
216  using ItemType = typename std::iterator_traits<Iterator>::value_type;
217  assert(size < UINT32_MAX);
218  object.array.size = static_cast<uint32_t>(size);
219  auto buffer = new DataObject[size];
220  std::transform(b, e, buffer, [](const ItemType& item) {
221  return convert(item);
222  });
223  object.array.data = buffer;
224 
225  return object;
226  }
227 
228  template<typename Iterator>
229  static DataObject convertMap(Iterator b, Iterator e, std::size_t size) {
230  DataObject object;
231  object.type = DataType::Map;
232 
233  using ItemType = typename std::iterator_traits<Iterator>::value_type;
234  assert(size < UINT32_MAX);
235  object.map.size = size;
236  auto buffer = new DataKeyValue[size];
237  std::transform(b, e, buffer, [](const ItemType& item) {
238  DataKeyValue kv;
239  kv.key = convert(item.first);
240  kv.value = convert(item.second);
241  return kv;
242  });
243  object.map.data = buffer;
244 
245  return object;
246  }
247 
248  };
249 
250 #ifndef DOXYGEN_SHOULD_SKIP_THIS
251 }
252 #endif
253 }
254 
255 #endif // GF_DATA_H
DataObject value
The value of the pair.
Definition: DataObject.h:388
static DataObject convert(T data)
Convert a primitive object to a data object.
Definition: Data.h:64
static DataObject convert(const uint8_t(&data)[N])
Convert a blob to a data object.
Definition: Data.h:95
constexpr Vector2f transform(const Matrix3f &mat, Vector2f point)
Apply an affine transformation to a 2D point.
Definition: Transform.h:331
A map object.
static DataObject convert(const char *data)
Convert a string to a data object.
Definition: Data.h:74
Conversion functions for data objects.
Definition: Data.h:51
static DataObject convert(const std::array< uint8_t, N > &data)
Convert a blob to a data object.
Definition: Data.h:116
static DataObject convert(const std::vector< uint8_t > &data)
Convert a blob to a data object.
Definition: Data.h:105
A key-value pair of data objects.
Definition: DataObject.h:386
T data[N]
The internal representation of the vector.
Definition: Vector.h:270
The namespace for gf classes.
Definition: Action.h:34
static DataObject convert(const T(&data)[N])
Convert an array to a data object.
Definition: Data.h:127
An array object.
A string object.
DataObject key
The key of the pair.
Definition: DataObject.h:387
static DataObject convert(const std::map< K, V > &data)
Convert a map to a data object.
Definition: Data.h:160
static DataObject convert(const std::string &data)
Convert a string to a data object.
Definition: Data.h:84
A data object.
Definition: DataObject.h:200
DataType type
The type of the object.
Definition: DataObject.h:201
static DataObject convert(const std::vector< T > &data)
Convert an array to a data object.
Definition: Data.h:138
static DataObject convert(const std::unordered_map< K, V > &data)
Convert a map to a data object.
Definition: Data.h:171
A binary object.
static DataObject convert(const std::array< T, N > &data)
Convert an array to a data object.
Definition: Data.h:149