mirror of https://github.com/OpenTTD/OpenTTD
Codechange: add support for std::variant in EndianBuffer
parent
a50c953854
commit
e8beb0eff3
|
@ -40,6 +40,18 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename... Targs>
|
||||||
|
EndianBufferWriter &operator <<(const std::variant<Targs...> &variant)
|
||||||
|
{
|
||||||
|
this->WriteVariant(variant);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
EndianBufferWriter &operator <<(const std::monostate &)
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
EndianBufferWriter &operator <<(const ConvertibleThroughBase auto data)
|
EndianBufferWriter &operator <<(const ConvertibleThroughBase auto data)
|
||||||
{
|
{
|
||||||
this->Write(data.base());
|
this->Write(data.base());
|
||||||
|
@ -74,6 +86,21 @@ private:
|
||||||
((*this << std::get<Tindices>(values)), ...);
|
((*this << std::get<Tindices>(values)), ...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t I = 0>
|
||||||
|
void WriteVariant(const T &variant )
|
||||||
|
{
|
||||||
|
if constexpr (I < std::variant_size_v<T>) {
|
||||||
|
if (I == variant.index()) {
|
||||||
|
static_assert(std::variant_size_v<T> < std::numeric_limits<uint8_t>::max());
|
||||||
|
this->Write(static_cast<uint8_t>(variant.index()));
|
||||||
|
*this << std::get<I>(variant);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
WriteVariant<T, I + 1>(variant);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Write overload for string values. */
|
/** Write overload for string values. */
|
||||||
void Write(std::string_view value)
|
void Write(std::string_view value)
|
||||||
{
|
{
|
||||||
|
@ -135,6 +162,18 @@ public:
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename... Targs>
|
||||||
|
EndianBufferReader &operator >>(std::variant<Targs...> &variant)
|
||||||
|
{
|
||||||
|
this->ReadVariant(this->Read<uint8_t>(), variant);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
EndianBufferReader &operator >>(const std::monostate &)
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
template <ConvertibleThroughBase T>
|
template <ConvertibleThroughBase T>
|
||||||
EndianBufferReader &operator >>(T &data)
|
EndianBufferReader &operator >>(T &data)
|
||||||
{
|
{
|
||||||
|
@ -170,6 +209,21 @@ private:
|
||||||
((*this >> std::get<Tindices>(values)), ...);
|
((*this >> std::get<Tindices>(values)), ...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t I = 0>
|
||||||
|
void ReadVariant(uint8_t index, T &variant)
|
||||||
|
{
|
||||||
|
if constexpr (I < std::variant_size_v<T>) {
|
||||||
|
if (I != index) {
|
||||||
|
ReadVariant<T, I + 1>(index, variant);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::variant_alternative_t<I, T> data;
|
||||||
|
*this >> data;
|
||||||
|
variant = data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** Read overload for string data. */
|
/** Read overload for string data. */
|
||||||
std::string ReadStr()
|
std::string ReadStr()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue