Plasma Engine  2.0
Loading...
Searching...
No Matches
RttiConverter.h
1#pragma once
2
4
5#include <Foundation/Basics.h>
6#include <Foundation/Reflection/Reflection.h>
7#include <Foundation/Serialization/AbstractObjectGraph.h>
8
11
12struct PL_FOUNDATION_DLL plRttiConverterObject
13{
15 : m_pType(nullptr)
16 , m_pObject(nullptr)
17 {
18 }
19 plRttiConverterObject(const plRTTI* pType, void* pObject)
20 : m_pType(pType)
21 , m_pObject(pObject)
22 {
23 }
24
25 PL_DECLARE_POD_TYPE();
26
27 const plRTTI* m_pType;
28 void* m_pObject;
29};
30
31
32class PL_FOUNDATION_DLL plRttiConverterContext
33{
34public:
35 virtual void Clear();
36
39 virtual plUuid GenerateObjectGuid(const plUuid& parentGuid, const plAbstractProperty* pProp, plVariant index, void* pObject) const;
40
41 virtual plInternal::NewInstance<void> CreateObject(const plUuid& guid, const plRTTI* pRtti);
42 virtual void DeleteObject(const plUuid& guid);
43
44 virtual void RegisterObject(const plUuid& guid, const plRTTI* pRtti, void* pObject);
45 virtual void UnregisterObject(const plUuid& guid);
46
47 virtual plRttiConverterObject GetObjectByGUID(const plUuid& guid) const;
48 virtual plUuid GetObjectGUID(const plRTTI* pRtti, const void* pObject) const;
49
50 virtual const plRTTI* FindTypeByName(plStringView sName) const;
51
52 template <typename T>
53 void GetObjectsByType(plDynamicArray<T*>& out_objects, plDynamicArray<plUuid>* out_pUuids = nullptr)
54 {
55 for (auto it : m_GuidToObject)
56 {
57 if (it.Value().m_pType->IsDerivedFrom(plGetStaticRTTI<T>()))
58 {
59 out_objects.PushBack(static_cast<T*>(it.Value().m_pObject));
60 if (out_pUuids)
61 {
62 out_pUuids->PushBack(it.Key());
63 }
64 }
65 }
66 }
67
68 virtual plUuid EnqueObject(const plUuid& guid, const plRTTI* pRtti, void* pObject);
69 virtual plRttiConverterObject DequeueObject();
70
71 virtual void OnUnknownTypeError(plStringView sTypeName);
72
73protected:
75 mutable plHashTable<const void*, plUuid> m_ObjectToGuid;
76 plSet<plUuid> m_QueuedObjects;
77};
78
79
80class PL_FOUNDATION_DLL plRttiConverterWriter
81{
82public:
83 using FilterFunction = plDelegate<bool(const void* pObject, const plAbstractProperty* pProp)>;
84
85 plRttiConverterWriter(plAbstractObjectGraph* pGraph, plRttiConverterContext* pContext, bool bSerializeReadOnly, bool bSerializeOwnerPtrs);
87
88 plAbstractObjectNode* AddObjectToGraph(plReflectedClass* pObject, const char* szNodeName = nullptr)
89 {
90 return AddObjectToGraph(pObject->GetDynamicRTTI(), pObject, szNodeName);
91 }
92 plAbstractObjectNode* AddObjectToGraph(const plRTTI* pRtti, const void* pObject, const char* szNodeName = nullptr);
93
94 void AddProperty(plAbstractObjectNode* pNode, const plAbstractProperty* pProp, const void* pObject);
95 void AddProperties(plAbstractObjectNode* pNode, const plRTTI* pRtti, const void* pObject);
96
97 plAbstractObjectNode* AddSubObjectToGraph(const plRTTI* pRtti, const void* pObject, const plUuid& guid, const char* szNodeName);
98
99private:
100 plRttiConverterContext* m_pContext = nullptr;
101 plAbstractObjectGraph* m_pGraph = nullptr;
102 FilterFunction m_Filter;
103};
104
105class PL_FOUNDATION_DLL plRttiConverterReader
106{
107public:
109
110 plInternal::NewInstance<void> CreateObjectFromNode(const plAbstractObjectNode* pNode);
111 void ApplyPropertiesToObject(const plAbstractObjectNode* pNode, const plRTTI* pRtti, void* pObject);
112
113private:
114 void ApplyProperty(void* pObject, const plAbstractProperty* pProperty, const plAbstractObjectNode::Property* pSource);
115 void CallOnObjectCreated(const plAbstractObjectNode* pNode, const plRTTI* pRtti, void* pObject);
116
117 plRttiConverterContext* m_pContext = nullptr;
118 const plAbstractObjectGraph* m_pGraph = nullptr;
119};
Definition AbstractObjectGraph.h:115
Definition AbstractObjectGraph.h:17
This is the base interface for all properties in the reflection system. It provides enough informatio...
Definition AbstractProperty.h:150
void PushBack(const T &value)
Pushes value at the end of the array.
Definition ArrayBase_inl.h:333
Definition DynamicArray.h:81
Definition HashTable.h:333
This class holds information about reflected types. Each instance represents one type that is known t...
Definition RTTI.h:30
All classes that should be dynamically reflectable, need to be derived from this base class.
Definition DynamicRTTI.h:86
Definition RttiConverter.h:33
Definition RttiConverter.h:106
Definition RttiConverter.h:81
Definition Set.h:238
plStringView represent a read-only sub-string of a larger string, as it can store a dedicated string ...
Definition StringView.h:34
This data type is the abstraction for 128-bit Uuid (also known as GUID) instances.
Definition Uuid.h:11
plVariant is a class that can store different types of variables, which is useful in situations where...
Definition Variant.h:44
Definition AbstractObjectGraph.h:20
Definition Allocator_inl.h:18
Definition RttiConverter.h:13