Add std::array serialiser support.

This commit is contained in:
Matt 2018-12-11 03:32:12 +01:00
parent 6e2514cd0d
commit f6dbf5f1a2
1 changed files with 43 additions and 1 deletions

View File

@ -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("}");
}
};