101#ifndef MOCHI_USE_REFLECTION
102#define MOCHI_USE_REFLECTION 0
105#if MOCHI_USE_REFLECTION
107#ifdef SIMPLE_REFLECTION_ENABLE
108#if !SIMPLE_REFLECTION_ENABLE
109#error MOCHI_USE_REFLECTION cannot be defined to 1 (true) if SIMPLE_REFLECTION_ENABLE has already been defined to 0 (false).
112#define SIMPLE_REFLECTION_ENABLE 1
118#ifndef SR_USE_NLOHMANN_JSON
119#define SR_USE_NLOHMANN_JSON 0
122#ifdef assert_invariant
123#pragma push_macro("assert_invariant")
124#undef assert_invariant
125#define MOCHI_RESTORE_ASSERT_INVARIANT
128#include <simple_reflection/simple_reflection.h>
130#ifdef MOCHI_RESTORE_ASSERT_INVARIANT
131#pragma pop_macro("assert_invariant")
132#undef MOCHI_RESTORE_ASSERT_INVARIANT
135#define MOCHI_ENUM_BEGIN(name) \
136 IMPL_SR_BeginEnum(name); \
137 [[maybe_unused]] static constexpr int kEnumFirstItemLine = __LINE__ + 1;
138#define MOCHI_ENUM_ITEM(name) IMPL_SR_EnumItem(name)
139#define MOCHI_ENUM_COUNT(name) \
141 static_cast<int>(MyEnum::name) == (__LINE__ - kEnumFirstItemLine), \
142 "Unexpected number of lines in reflection enum definition. Please make sure that every enum value is listed here (one per line).");
143#define MOCHI_ENUM_END() IMPL_SR_EndEnum()
145#define MOCHI_STRUCT_BEGIN(name) IMPL_SR_BeginStruct(name, #name)
146#define MOCHI_STRUCT_END() IMPL_SR_EndStruct()
147#define MOCHI_STRUCT(name) MOCHI_STRUCT_BEGIN(name) MOCHI_STRUCT_END()
148#define MOCHI_STRUCT_WITH_BASE(name, base) \
149 MOCHI_STRUCT_BEGIN(name) MOCHI_BASE_CLASS(base) MOCHI_STRUCT_END()
151#define MOCHI_STRUCT_BEGIN_EX(name) IMPL_SR_BeginStructEx(name)
152#define MOCHI_STRUCT_END_EX() IMPL_SR_EndStructEx()
153#define MOCHI_STRUCT_EX(name) MOCHI_STRUCT_BEGIN_EX(name) MOCHI_STRUCT_END_EX()
154#define MOCHI_STRUCT_WITH_BASE_EX(name, base) \
155 MOCHI_STRUCT_BEGIN_EX(name) MOCHI_BASE_CLASS(base) MOCHI_STRUCT_END_EX()
157#define MOCHI_TEMPLATE_BEGIN(name, ...) IMPL_SR_BeginStructTemplate(name, __VA_ARGS__)
158#define MOCHI_TEMPLATE_END() IMPL_SR_EndStruct()
159#define MOCHI_TEMPLATE(name, ...) MOCHI_TEMPLATE_BEGIN(name, __VA_ARGS__) MOCHI_TEMPLATE_END()
161#define MOCHI_FIELD(name) IMPL_SR_Field_Name(name, #name)
162#define MOCHI_FIELD_NAME(realName, customName) IMPL_SR_Field_Name(realName, customName)
163#define MOCHI_REMOVE_FIELD(name) IMPL_SR_RemoveField(name)
164#define MOCHI_REPLACE_FIELD_NAME(realName, fieldNameToReplace) \
165 MOCHI_REMOVE_FIELD(fieldNameToReplace) MOCHI_FIELD_NAME(realName, fieldNameToReplace)
167#define MOCHI_BASE_CLASS(name) IMPL_SR_BaseClass(name)
171#define MOCHI_ATTRIBUTE(...) \
173 SReflect::detail::AddAttribute(*myInfo, new ::superdex::attribute::__VA_ARGS__); \
178#define MOCHI_ATTRIBUTE_IF(condition, ...) \
179 if constexpr (condition) { \
180 MOCHI_ATTRIBUTE(__VA_ARGS__); \
186using Attribute = SReflect::Attribute;
190namespace superdex::attribute {
194using Category = SReflect::Attribute_Category;
199using Color = SReflect::Attribute_Color;
203using Description = SReflect::Attribute_Description;
207using DisplayName = SReflect::Attribute_DisplayName;
211using HideFromEditor = SReflect::Attribute_HideFromEditor;
215using NoSerialize = SReflect::Attribute_DoNotSerialize;
222using NoSerializeDefaults = SReflect::Attribute_DoNotSerializeDefaults;
226using PreviouslyKnownAs = SReflect::Attribute_PreviouslyKnownAs;
230using IntRange = SReflect::Attribute_IntRange;
234using FloatRange = SReflect::Attribute_FloatRange;
238using UIntRange = SReflect::Attribute_UIntRange;
243using ReadOnly = SReflect::Attribute_ReadOnly;
247using Units = SReflect::Attribute_Units;
253using IgnoreExtraneousFields = SReflect::Attribute_IgnoreExtraneousFields;
259using JsonString = SReflect::Attribute_JsonString;
269#define IMPL_MOCHI_PUSH_IGNORE_EXTRA_SEMI() \
270 MOCHI_WARNING_PUSH() \
271 MOCHI_WARNING_IGNORE_GCC_CLANG(GCC diagnostic ignored "-Wextra-semi")
273#define MOCHI_ENUM_BEGIN(name) IMPL_MOCHI_PUSH_IGNORE_EXTRA_SEMI()
274#define MOCHI_ENUM_ITEM(name)
275#define MOCHI_ENUM_COUNT(name)
276#define MOCHI_ENUM_END() MOCHI_WARNING_POP()
278#define MOCHI_STRUCT_BEGIN(name) IMPL_MOCHI_PUSH_IGNORE_EXTRA_SEMI()
279#define MOCHI_STRUCT_END() MOCHI_WARNING_POP()
280#define MOCHI_STRUCT(name)
281#define MOCHI_STRUCT_WITH_BASE(name, base)
283#define MOCHI_STRUCT_BEGIN_EX(name) IMPL_MOCHI_PUSH_IGNORE_EXTRA_SEMI()
284#define MOCHI_STRUCT_END_EX() MOCHI_WARNING_POP()
285#define MOCHI_STRUCT_EX(name)
286#define MOCHI_STRUCT_WITH_BASE_EX(name, base)
288#define MOCHI_TEMPLATE_BEGIN(name, ...)
289#define MOCHI_TEMPLATE_END()
290#define MOCHI_TEMPLATE(name, ...)
292#define MOCHI_BASE_CLASS(name)
293#define MOCHI_FIELD(name)
294#define MOCHI_FIELD_NAME(realName, customName)
295#define MOCHI_REMOVE_FIELD(name)
296#define MOCHI_REPLACE_FIELD_NAME(realName, fieldNameToReplace)
298#define MOCHI_ATTRIBUTE(...)
299#define MOCHI_ATTRIBUTE_IF(condition, ...)
NdArray< uint8_t, 4 > Color
RGBA color representation using 4 bytes (0-255 per channel) in RGBA order.