From e8beb0eff3ffe510063aaaf1fcfba3300d3fee26 Mon Sep 17 00:00:00 2001 From: Rubidium Date: Wed, 12 Feb 2025 17:40:26 +0100 Subject: [PATCH] Codechange: add support for std::variant in EndianBuffer --- src/misc/endian_buffer.hpp | 54 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/misc/endian_buffer.hpp b/src/misc/endian_buffer.hpp index 284b2c9364..e3c561d5e6 100644 --- a/src/misc/endian_buffer.hpp +++ b/src/misc/endian_buffer.hpp @@ -40,6 +40,18 @@ public: return *this; } + template + EndianBufferWriter &operator <<(const std::variant &variant) + { + this->WriteVariant(variant); + return *this; + } + + EndianBufferWriter &operator <<(const std::monostate &) + { + return *this; + } + EndianBufferWriter &operator <<(const ConvertibleThroughBase auto data) { this->Write(data.base()); @@ -74,6 +86,21 @@ private: ((*this << std::get(values)), ...); } + template + void WriteVariant(const T &variant ) + { + if constexpr (I < std::variant_size_v) { + if (I == variant.index()) { + static_assert(std::variant_size_v < std::numeric_limits::max()); + this->Write(static_cast(variant.index())); + *this << std::get(variant); + return; + } + + WriteVariant(variant); + } + } + /** Write overload for string values. */ void Write(std::string_view value) { @@ -135,6 +162,18 @@ public: return *this; } + template + EndianBufferReader &operator >>(std::variant &variant) + { + this->ReadVariant(this->Read(), variant); + return *this; + } + + EndianBufferReader &operator >>(const std::monostate &) + { + return *this; + } + template EndianBufferReader &operator >>(T &data) { @@ -170,6 +209,21 @@ private: ((*this >> std::get(values)), ...); } + template + void ReadVariant(uint8_t index, T &variant) + { + if constexpr (I < std::variant_size_v) { + if (I != index) { + ReadVariant(index, variant); + return; + } + + std::variant_alternative_t data; + *this >> data; + variant = data; + } + } + /** Read overload for string data. */ std::string ReadStr() {