8#ifndef SEN_CORE_META_VARIANT_TRAITS_H
9#define SEN_CORE_META_VARIANT_TRAITS_H
48 template <std::
size_t index>
49 [[nodiscard]]
static bool tryPrintField(std::ostream& out,
const char* typeName,
const T& val,
bool requiresNewline);
52 template <std::
size_t index>
54 const char* expectedTypeLong,
55 const char* expectedTypeShort,
56 const char* expectedAliasTypeShort,
57 const Var& fieldValue,
60 template <std::
size_t index>
63 template <std::
size_t index>
66 template <std::
size_t index>
69 template <std::
size_t index>
72 template <std::
size_t index>
83template <std::
size_t index>
86 using F = std::variant_alternative_t<index, T>;
89 val.template emplace<index>(std::move(fieldVal));
93template <std::
size_t index>
95 const char* expectedTypeLong,
96 const char* expectedTypeShort,
97 const char* expectedAliasTypeShort,
98 const Var& fieldValue,
101 if (strcmp(currentType, expectedTypeShort) == 0U || strcmp(currentType, expectedTypeLong) == 0U ||
102 (expectedAliasTypeShort !=
nullptr && strcmp(currentType, expectedAliasTypeShort) == 0U))
111template <std::
size_t index>
114 using F = std::variant_alternative_t<index, T>;
115 if (val.index() == index)
125template <std::
size_t index>
128 using F = std::variant_alternative_t<index, T>;
129 if (val.index() == index)
139template <std::
size_t index>
142 using F = std::variant_alternative_t<index, T>;
145 val.template emplace<index>(std::move(fieldVal));
149template <std::
size_t index>
152 std::shared_ptr<Var> valueVar,
155 using F = std::variant_alternative_t<index, T>;
156 if (val.index() == index)
159 var =
KeyedVar {key, std::move(valueVar)};
166template <std::
size_t index>
168 const char* typeName,
170 bool requiresNewline)
172 if (val.index() == index)
174 out.setf(std::ios::left, std::ios::adjustfield);
179 const auto indent =
static_cast<int>(out.width() + 2U);
182 out <<
' ' <<
"type: " << typeName <<
"\n";
184 if (
auto valPtr = std::get_if<index>(&val); valPtr)
189 out <<
' ' <<
"value:\n";
196 out <<
' ' <<
"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:33
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:45
static bool assignFieldByName(const char *currentType, const char *expectedTypeLong, const char *expectedTypeShort, const char *expectedAliasTypeShort, const Var &fieldValue, T &val)
Definition variant_traits.h:94
static bool tryWriteField(OutputStream &out, const T &val, uint32_t key)
Definition variant_traits.h:126
static void readField(InputStream &in, T &val)
Definition variant_traits.h:140
static constexpr bool available
Definition variant_traits.h:46
static bool tryPrintField(std::ostream &out, const char *typeName, const T &val, bool requiresNewline)
Definition variant_traits.h:167
static bool tryFieldValueToVariant(const T &val, Var &var, std::shared_ptr< Var > valueVar, uint32_t key)
Definition variant_traits.h:150
static bool getFieldSerializedSize(const T &val, uint32_t key, uint32_t &result)
Definition variant_traits.h:112
static void assignField(const Var &fieldValue, T &val)
Definition variant_traits.h:84