mirror of https://github.com/OpenRCT2/OpenRCT2.git
Add std::array serialiser support.
This commit is contained in:
parent
6e2514cd0d
commit
f6dbf5f1a2
|
@ -24,7 +24,7 @@ template<typename T> struct DataSerializerTraits
|
|||
{
|
||||
static void encode(IStream* stream, const T& v) = delete;
|
||||
static void decode(IStream* stream, T& val) = delete;
|
||||
static void log(IStream* stream, T& val) = delete;
|
||||
static void log(IStream* stream, const T& val) = delete;
|
||||
};
|
||||
|
||||
template<typename T> struct DataSerializerTraitsIntegral
|
||||
|
@ -246,3 +246,45 @@ template<> struct DataSerializerTraits<MemoryStream>
|
|||
{
|
||||
}
|
||||
};
|
||||
|
||||
template<typename _Ty, size_t _Size> struct DataSerializerTraits<std::array<_Ty, _Size>>
|
||||
{
|
||||
static void encode(IStream* stream, const std::array<_Ty, _Size>& val)
|
||||
{
|
||||
uint16_t len = (uint16_t)_Size;
|
||||
uint16_t swapped = ByteSwapBE(len);
|
||||
stream->Write(&swapped);
|
||||
|
||||
DataSerializerTraits<_Ty> s;
|
||||
for (auto&& sub : val)
|
||||
{
|
||||
s.encode(stream, sub);
|
||||
}
|
||||
}
|
||||
static void decode(IStream* stream, std::array<_Ty, _Size>& val)
|
||||
{
|
||||
uint16_t len;
|
||||
stream->Read(&len);
|
||||
len = ByteSwapBE(len);
|
||||
|
||||
if (len != _Size)
|
||||
throw std::exception("Invalid size, can't decode");
|
||||
|
||||
DataSerializerTraits<_Ty> s;
|
||||
for (auto&& sub : val)
|
||||
{
|
||||
s.decode(stream, sub);
|
||||
}
|
||||
}
|
||||
static void log(IStream* stream, const std::array<_Ty, _Size>& val)
|
||||
{
|
||||
stream->Write("{");
|
||||
DataSerializerTraits<_Ty> s;
|
||||
for (auto&& sub : val)
|
||||
{
|
||||
s.log(stream, sub);
|
||||
stream->Write("; ", 2);
|
||||
}
|
||||
stream->Write("}");
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue