8#ifndef SEN_CORE_META_VARIANT_TRAITS_H
9#define SEN_CORE_META_VARIANT_TRAITS_H
50 template <std::
size_t index>
51 [[nodiscard]]
static bool tryPrintField(std::ostream& out,
const char* typeName,
const T& val,
bool requiresNewline);
54 template <std::
size_t index>
56 const char* expectedTypeLong,
57 const char* expectedTypeShort,
58 const char* expectedAliasTypeShort,
59 const Var& fieldValue,
62 template <std::
size_t index>
65 template <std::
size_t index>
68 template <std::
size_t index>
71 template <std::
size_t index>
74 template <std::
size_t index>
85template <std::
size_t index>
88 using F = std::variant_alternative_t<index, T>;
91 val.template emplace<index>(std::move(fieldVal));
95template <std::
size_t index>
97 const char* expectedTypeLong,
98 const char* expectedTypeShort,
99 const char* expectedAliasTypeShort,
100 const Var& fieldValue,
103 if (strcmp(currentType, expectedTypeShort) == 0U || strcmp(currentType, expectedTypeLong) == 0U ||
104 (expectedAliasTypeShort !=
nullptr && strcmp(currentType, expectedAliasTypeShort) == 0U))
113template <std::
size_t index>
116 using F = std::variant_alternative_t<index, T>;
117 if (val.index() == index)
127template <std::
size_t index>
130 using F = std::variant_alternative_t<index, T>;
131 if (val.index() == index)
141template <std::
size_t index>
144 using F = std::variant_alternative_t<index, T>;
147 val.template emplace<index>(std::move(fieldVal));
151template <std::
size_t index>
154 std::shared_ptr<Var> valueVar,
157 using F = std::variant_alternative_t<index, T>;
158 if (val.index() == index)
161 var =
KeyedVar {key, std::move(valueVar)};
168template <std::
size_t index>
170 const char* typeName,
172 bool requiresNewline)
174 if (val.index() == index)
176 out.setf(std::ios::left, std::ios::adjustfield);
177 const auto indent = std::setw(
static_cast<int>(out.width() + 2U));
178 out << indent <<
' ' <<
"type: " << typeName <<
"\n";
180 if (
auto valPtr = std::get_if<index>(&val); valPtr)
184 out << indent <<
' ' <<
"value:\n" << indent << *valPtr;
188 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 throwEmptyStructError(const char *name)
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:47
static bool assignFieldByName(const char *currentType, const char *expectedTypeLong, const char *expectedTypeShort, const char *expectedAliasTypeShort, const Var &fieldValue, T &val)
Definition variant_traits.h:96
static bool tryWriteField(OutputStream &out, const T &val, uint32_t key)
Definition variant_traits.h:128
static void readField(InputStream &in, T &val)
Definition variant_traits.h:142
static constexpr bool available
Definition variant_traits.h:48
static bool tryPrintField(std::ostream &out, const char *typeName, const T &val, bool requiresNewline)
Definition variant_traits.h:169
static bool tryFieldValueToVariant(const T &val, Var &var, std::shared_ptr< Var > valueVar, uint32_t key)
Definition variant_traits.h:152
static bool getFieldSerializedSize(const T &val, uint32_t key, uint32_t &result)
Definition variant_traits.h:114
static void assignField(const Var &fieldValue, T &val)
Definition variant_traits.h:86