8#ifndef SEN_CORE_META_VARIANT_TRAITS_H
9#define SEN_CORE_META_VARIANT_TRAITS_H
49 template <std::
size_t index>
50 [[nodiscard]]
static bool tryPrintField(std::ostream& out,
const char* typeName,
const T& val,
bool requiresNewline);
53 template <std::
size_t index>
55 const char* expectedTypeLong,
56 const char* expectedTypeShort,
57 const char* expectedAliasTypeShort,
58 const Var& fieldValue,
61 template <std::
size_t index>
64 template <std::
size_t index>
67 template <std::
size_t index>
70 template <std::
size_t index>
73 template <std::
size_t index>
84template <std::
size_t index>
87 using F = std::variant_alternative_t<index, T>;
90 val.template emplace<index>(std::move(fieldVal));
94template <std::
size_t index>
96 const char* expectedTypeLong,
97 const char* expectedTypeShort,
98 const char* expectedAliasTypeShort,
99 const Var& fieldValue,
102 if (strcmp(currentType, expectedTypeShort) == 0U || strcmp(currentType, expectedTypeLong) == 0U ||
103 (expectedAliasTypeShort !=
nullptr && strcmp(currentType, expectedAliasTypeShort) == 0U))
112template <std::
size_t index>
115 using F = std::variant_alternative_t<index, T>;
116 if (val.index() == index)
126template <std::
size_t index>
129 using F = std::variant_alternative_t<index, T>;
130 if (val.index() == index)
140template <std::
size_t index>
143 using F = std::variant_alternative_t<index, T>;
146 val.template emplace<index>(std::move(fieldVal));
150template <std::
size_t index>
153 std::shared_ptr<Var> valueVar,
156 using F = std::variant_alternative_t<index, T>;
157 if (val.index() == index)
160 var =
KeyedVar {key, std::move(valueVar)};
167template <std::
size_t index>
169 const char* typeName,
171 bool requiresNewline)
173 if (val.index() == index)
175 out.setf(std::ios::left, std::ios::adjustfield);
176 const auto indent = std::setw(
static_cast<int>(out.width() + 2U));
177 out << indent <<
' ' <<
"type: " << typeName <<
"\n";
179 if (
auto valPtr = std::get_if<index>(&val); valPtr)
183 out << indent <<
' ' <<
"value:\n" << indent << *valPtr;
187 out << indent <<
' ' <<
"value: " << *valPtr;
void writeUInt32(uint32_t val)
Definition output_stream.h:44
Contiguous view of elements of type T. Inspired by http://www.open-std.org/jtc1/sc22/wg21/docs/papers...
Definition span.h:34
InputStreamTemplate< LittleEndian > InputStream
Definition input_stream.h:84
Definition type_traits.h:47
Definition type_traits.h:34
std::tuple< uint32_t, std::shared_ptr< Var > > KeyedVar
A key-var tuple, to represent variants.
Definition var.h:110
TypeHandle< const T > ConstTypeHandle
Definition type.h:319
OutputStreamTemplate< LittleEndian > OutputStream
Definition output_stream.h:64
Can hold any supported value type. Wraps std::variant to allow recursion and implements some helpers.
Definition var.h:119
Definition variant_traits.h:34
static void throwNonNativeField(const char *variantName, const char *fieldName)
static void throwInvalidFieldIndex(const char *variantName, uint16_t index)
static void expectAtLeastOneField(const char *name, const Span< uint16_t > &fields)
static std::tuple< const char *, const Var * > getTypeAndValue(const Var &var, ConstTypeHandle< VariantType > meta)
Base class for variant traits.
Definition variant_traits.h:46
static bool assignFieldByName(const char *currentType, const char *expectedTypeLong, const char *expectedTypeShort, const char *expectedAliasTypeShort, const Var &fieldValue, T &val)
Definition variant_traits.h:95
static bool tryWriteField(OutputStream &out, const T &val, uint32_t key)
Definition variant_traits.h:127
static void readField(InputStream &in, T &val)
Definition variant_traits.h:141
static constexpr bool available
Definition variant_traits.h:47
static bool tryPrintField(std::ostream &out, const char *typeName, const T &val, bool requiresNewline)
Definition variant_traits.h:168
static bool tryFieldValueToVariant(const T &val, Var &var, std::shared_ptr< Var > valueVar, uint32_t key)
Definition variant_traits.h:151
static bool getFieldSerializedSize(const T &val, uint32_t key, uint32_t &result)
Definition variant_traits.h:113
static void assignField(const Var &fieldValue, T &val)
Definition variant_traits.h:85