Plasma Engine  2.0
Loading...
Searching...
No Matches
ReflectionUtils.h
1#pragma once
2
3#include <Foundation/Containers/Set.h>
4#include <Foundation/Reflection/Reflection.h>
5
6class plVariant;
8
10class PL_FOUNDATION_DLL plReflectionUtils
11{
12public:
13 static const plRTTI* GetCommonBaseType(const plRTTI* pRtti1, const plRTTI* pRtti2);
14
16 static bool IsBasicType(const plRTTI* pRtti);
17
19 static bool IsValueType(const plAbstractProperty* pProp);
20
22 static const plRTTI* GetTypeFromVariant(const plVariant& value);
23 static const plRTTI* GetTypeFromVariant(plVariantType::Enum type);
24
28 static plUInt32 GetComponentCount(plVariantType::Enum type);
29 static void SetComponent(plVariant& ref_vector, plUInt32 uiComponent, double fValue); // [tested]
30 static double GetComponent(const plVariant& vector, plUInt32 uiComponent);
31
32 static plVariant GetMemberPropertyValue(const plAbstractMemberProperty* pProp, const void* pObject); // [tested] via ToolsFoundation
33 static void SetMemberPropertyValue(const plAbstractMemberProperty* pProp, void* pObject, const plVariant& value); // [tested] via ToolsFoundation
34
35 static plVariant GetArrayPropertyValue(const plAbstractArrayProperty* pProp, const void* pObject, plUInt32 uiIndex);
36 static void SetArrayPropertyValue(const plAbstractArrayProperty* pProp, void* pObject, plUInt32 uiIndex, const plVariant& value);
37
38 static void InsertSetPropertyValue(const plAbstractSetProperty* pProp, void* pObject, const plVariant& value);
39 static void RemoveSetPropertyValue(const plAbstractSetProperty* pProp, void* pObject, const plVariant& value);
40
41 static plVariant GetMapPropertyValue(const plAbstractMapProperty* pProp, const void* pObject, const char* szKey);
42 static void SetMapPropertyValue(const plAbstractMapProperty* pProp, void* pObject, const char* szKey, const plVariant& value);
43
44 static void InsertArrayPropertyValue(const plAbstractArrayProperty* pProp, void* pObject, const plVariant& value, plUInt32 uiIndex);
45 static void RemoveArrayPropertyValue(const plAbstractArrayProperty* pProp, void* pObject, plUInt32 uiIndex);
46
47 static const plAbstractMemberProperty* GetMemberProperty(const plRTTI* pRtti, plUInt32 uiPropertyIndex);
48 static const plAbstractMemberProperty* GetMemberProperty(const plRTTI* pRtti, const char* szPropertyName); // [tested] via ToolsFoundation
49
55 static void GatherTypesDerivedFromClass(const plRTTI* pRtti, plSet<const plRTTI*>& out_types);
56
63 static void GatherDependentTypes(const plRTTI* pRtti, plSet<const plRTTI*>& inout_typesAsSet, plDynamicArray<const plRTTI*>* out_pTypesAsStack = nullptr);
64
70 static plResult CreateDependencySortedTypeArray(const plSet<const plRTTI*>& types, plDynamicArray<const plRTTI*>& out_sortedTypes);
71
73 {
74 enum Enum
75 {
76 FullyQualifiedName,
77 ValueNameOnly,
78 Default = FullyQualifiedName
79 };
80
81 using StorageType = plUInt8;
82 };
83
87 static bool EnumerationToString(const plRTTI* pEnumerationRtti, plInt64 iValue, plStringBuilder& out_sOutput,
88 plEnum<EnumConversionMode> conversionMode = EnumConversionMode::Default); // [tested]
89
91 template <typename T>
92 static bool EnumerationToString(plEnum<T> value, plStringBuilder& out_sOutput, plEnum<EnumConversionMode> conversionMode = EnumConversionMode::Default)
93 {
94 return EnumerationToString(plGetStaticRTTI<T>(), value.GetValue(), out_sOutput, conversionMode);
95 }
96
98 template <typename T>
99 static bool BitflagsToString(plBitflags<T> value, plStringBuilder& out_sOutput, plEnum<EnumConversionMode> conversionMode = EnumConversionMode::Default)
100 {
101 return EnumerationToString(plGetStaticRTTI<T>(), value.GetValue(), out_sOutput, conversionMode);
102 }
103
105 {
106 plString m_sKey;
107 plInt32 m_iValue = 0;
108 };
109
111 static void GetEnumKeysAndValues(const plRTTI* pEnumerationRtti, plDynamicArray<EnumKeyValuePair>& ref_entries, plEnum<EnumConversionMode> conversionMode = EnumConversionMode::Default);
112
116 static bool StringToEnumeration(const plRTTI* pEnumerationRtti, const char* szValue, plInt64& out_iValue); // [tested]
117
119 template <typename T>
120 static bool StringToEnumeration(const char* szValue, plEnum<T>& out_value)
121 {
122 plInt64 value;
123 const auto retval = StringToEnumeration(plGetStaticRTTI<T>(), szValue, value);
124 out_value = static_cast<typename T::Enum>(value);
125 return retval;
126 }
127
129 static plInt64 DefaultEnumerationValue(const plRTTI* pEnumerationRtti); // [tested]
130
134 static plInt64 MakeEnumerationValid(const plRTTI* pEnumerationRtti, plInt64 iValue); // [tested]
135
137 template <typename T>
138 static bool IsEqual(const T* pObject, const T* pObject2)
139 {
140 return IsEqual(pObject, pObject2, plGetStaticRTTI<T>());
141 }
142
149 static bool IsEqual(const void* pObject, const void* pObject2, const plRTTI* pType); // [tested]
150
152 static bool IsEqual(const void* pObject, const void* pObject2, const plAbstractProperty* pProp);
153
155 static void DeleteObject(void* pObject, const plAbstractProperty* pOwnerProperty);
156
158 static plVariant GetDefaultVariantFromType(plVariant::Type::Enum type); // [tested]
159
161 static plVariant GetDefaultVariantFromType(const plRTTI* pRtti);
162
164 static plVariant GetDefaultValue(const plAbstractProperty* pProperty, plVariant index = plVariant());
165
166
168 static void SetAllMemberPropertiesToDefault(const plRTTI* pRtti, void* pObject);
169
172 static plResult ClampValue(plVariant& value, const plClampValueAttribute* pAttrib);
173};
The base class for a property that represents an array of values.
Definition AbstractProperty.h:273
The base class for a property that represents a set of values.
Definition AbstractProperty.h:348
This is the base class for all properties that are members of a class. It provides more information a...
Definition AbstractProperty.h:237
This is the base interface for all properties in the reflection system. It provides enough informatio...
Definition AbstractProperty.h:150
The base class for a property that represents a set of values.
Definition AbstractProperty.h:313
A property attribute that allows to define min and max values for the UI. Min or max may be set to an...
Definition PropertyAttributes.h:216
Definition DynamicArray.h:81
This class holds information about reflected types. Each instance represents one type that is known t...
Definition RTTI.h:30
Helper functions for handling reflection related operations.
Definition ReflectionUtils.h:11
static bool IsEqual(const T *pObject, const T *pObject2)
Templated convenience function that calls IsEqual and automatically deduces the type.
Definition ReflectionUtils.h:138
static bool BitflagsToString(plBitflags< T > value, plStringBuilder &out_sOutput, plEnum< EnumConversionMode > conversionMode=EnumConversionMode::Default)
Helper template to shorten the call for plBitflags.
Definition ReflectionUtils.h:99
static bool EnumerationToString(plEnum< T > value, plStringBuilder &out_sOutput, plEnum< EnumConversionMode > conversionMode=EnumConversionMode::Default)
Helper template to shorten the call for plEnums.
Definition ReflectionUtils.h:92
static bool StringToEnumeration(const char *szValue, plEnum< T > &out_value)
Helper template to shorten the call for plEnums.
Definition ReflectionUtils.h:120
Definition Set.h:238
plStringBuilder is a class that is meant for creating and modifying strings.
Definition StringBuilder.h:35
plVariant is a class that can store different types of variables, which is useful in situations where...
Definition Variant.h:44
The plBitflags class allows you to work with type-safe bitflags.
Definition Bitflags.h:82
PL_ALWAYS_INLINE StorageType GetValue() const
Returns the stored value as the underlying integer type.
Definition Bitflags.h:199
A custom enum implementation that allows to define the underlying storage type to control its memory ...
Definition Enum.h:37
PL_ALWAYS_INLINE StorageType GetValue() const
Returns the enum value as an integer.
Definition Enum.h:98
Definition ReflectionUtils.h:73
Definition ReflectionUtils.h:105
Default enum for returning failure or success, instead of using a bool.
Definition Types.h:54
Enum
This enum describes the type of data that is currently stored inside the variant. Note that changes t...
Definition VariantType.h:26