Skip to content

Commit 3b699a3

Browse files
committed
serialize Array2D better
1 parent 9227c53 commit 3b699a3

File tree

2 files changed

+31
-37
lines changed

2 files changed

+31
-37
lines changed

include/gf2/core/Array2D.h

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,19 @@
99

1010
#include "Range.h"
1111
#include "Vec2.h"
12-
#include "gf2/core/Serialization.h"
1312

1413
namespace gf {
1514

15+
namespace details {
16+
17+
template<typename Archive, typename Self>
18+
Archive& handle_array2d_serialization(Archive& ar, Self& self)
19+
{
20+
return ar | self.m_size | self.m_data;
21+
}
22+
23+
}
24+
1625
template<typename T>
1726
class Array2D {
1827
public:
@@ -144,6 +153,9 @@ namespace gf {
144153
return static_cast<std::size_t>(index.x) + (static_cast<std::size_t>(index.y) * static_cast<std::size_t>(m_size.x));
145154
}
146155

156+
template<typename Archive, typename Self>
157+
friend Archive& details::handle_array2d_serialization(Archive& ar, Self& self);
158+
147159
Vec2I m_size;
148160
std::vector<T> m_data;
149161
};
@@ -164,6 +176,18 @@ namespace gf {
164176
return true;
165177
}
166178

179+
template<typename Archive, typename T>
180+
inline Archive& operator|(Archive& ar, Array2D<T>& vec)
181+
{
182+
return details::handle_array2d_serialization(ar, vec);
183+
}
184+
185+
template<typename Archive, typename T>
186+
inline Archive& operator|(Archive& ar, const Array2D<T>& vec)
187+
{
188+
return details::handle_array2d_serialization(ar, vec);
189+
}
190+
167191
} // namespace gf
168192

169193
#endif // GF_ARRAY_2D_H

include/gf2/core/SerializationOps.h

Lines changed: 6 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#include <string>
1111
#include <type_traits>
1212

13-
#include "Array2D.h"
1413
#include "Flags.h"
1514
#include "Serialization.h"
1615

@@ -116,33 +115,20 @@ namespace gf {
116115
}
117116

118117
template<typename T, typename E = std::enable_if_t<std::is_enum_v<T>, T>>
119-
inline Serializer& operator|(Serializer& ar, T data)
118+
Serializer& operator|(Serializer& ar, T data)
120119
{
121120
using U = std::underlying_type_t<T>;
122121
return ar | static_cast<U>(data);
123122
}
124123

125124
template<typename E>
126-
inline Serializer& operator|(Serializer& ar, Flags<E> data)
125+
Serializer& operator|(Serializer& ar, Flags<E> data)
127126
{
128127
return ar | data.m_data;
129128
}
130129

131-
template<typename T>
132-
inline Serializer& operator|(Serializer& ar, const Array2D<T>& array)
133-
{
134-
const Vec2I size = array.size();
135-
ar | size.w | size.h;
136-
137-
for (auto& item : array) {
138-
ar | item;
139-
}
140-
141-
return ar;
142-
}
143-
144130
template<typename K, typename V>
145-
inline Serializer& operator|(Serializer& ar, const std::pair<K, V>& pair)
131+
Serializer& operator|(Serializer& ar, const std::pair<K, V>& pair)
146132
{
147133
return ar | pair.first | pair.second;
148134
}
@@ -257,7 +243,7 @@ namespace gf {
257243
}
258244

259245
template<typename T, typename E = std::enable_if_t<std::is_enum_v<T>, T>>
260-
inline Deserializer& operator|(Deserializer& ar, T& data)
246+
Deserializer& operator|(Deserializer& ar, T& data)
261247
{
262248
using U = std::underlying_type_t<T>;
263249
U underlying;
@@ -267,29 +253,13 @@ namespace gf {
267253
}
268254

269255
template<typename E>
270-
inline Deserializer& operator|(Deserializer& ar, Flags<E>& data)
256+
Deserializer& operator|(Deserializer& ar, Flags<E>& data)
271257
{
272258
return ar | data.m_data;
273259
}
274260

275-
template<typename T>
276-
inline Deserializer& operator|(Deserializer& ar, Array2D<T>& array)
277-
{
278-
Vec2I size(0, 0);
279-
ar | size.w | size.h;
280-
281-
Array2D<T> tmp(size);
282-
283-
for (auto& item : tmp) {
284-
ar | item;
285-
}
286-
287-
array = std::move(tmp);
288-
return ar;
289-
}
290-
291261
template<typename K, typename V>
292-
inline Deserializer& operator|(Deserializer& ar, std::pair<K, V>& pair)
262+
Deserializer& operator|(Deserializer& ar, std::pair<K, V>& pair)
293263
{
294264
return ar | pair.first | pair.second;
295265
}

0 commit comments

Comments
 (0)