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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
this->Write(data.base());
|
||||
|
@ -74,6 +86,21 @@ private:
|
|||
((*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. */
|
||||
void Write(std::string_view value)
|
||||
{
|
||||
|
@ -135,6 +162,18 @@ public:
|
|||
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>
|
||||
EndianBufferReader &operator >>(T &data)
|
||||
{
|
||||
|
@ -170,6 +209,21 @@ private:
|
|||
((*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. */
|
||||
std::string ReadStr()
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue