From f6dbf5f1a2123e5182c4e50951fd7adff7df4f19 Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 11 Dec 2018 03:32:12 +0100 Subject: [PATCH] Add std::array serialiser support. --- src/openrct2/core/DataSerialiserTraits.h | 44 +++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/openrct2/core/DataSerialiserTraits.h b/src/openrct2/core/DataSerialiserTraits.h index 80b2fb6ab6..d996419ef3 100644 --- a/src/openrct2/core/DataSerialiserTraits.h +++ b/src/openrct2/core/DataSerialiserTraits.h @@ -24,7 +24,7 @@ template 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 struct DataSerializerTraitsIntegral @@ -246,3 +246,45 @@ template<> struct DataSerializerTraits { } }; + +template struct DataSerializerTraits> +{ + 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("}"); + } +};