ezEngine  Milestone 7
AbstractProperty.h
Go to the documentation of this file.
1 #pragma once
2 
4 
5 #include <Foundation/Basics.h>
8 #include <Foundation/Containers/Set.h>
9 
10 class ezRTTI;
12 
13 
16 {
17  typedef ezUInt16 StorageType;
18 
19  enum Enum
20  {
23  Pointer = EZ_BIT(2),
25  IsEnum = EZ_BIT(4),
28  Phantom = EZ_BIT(7),
29  Hidden = EZ_BIT(8),
30  Default = 0
31  };
32 
33  struct Bits
34  {
35  StorageType StandardType : 1;
36  StorageType ReadOnly : 1;
37  StorageType Pointer : 1;
38  StorageType PointerOwner : 1;
39  StorageType IsEnum : 1;
40  StorageType Bitflags : 1;
41  StorageType Constant : 1;
42  StorageType Phantom : 1;
43  StorageType Hidden : 1;
44  };
45 };
46 
48 
49 
51 {
52  typedef ezUInt8 StorageType;
53 
54  enum Enum
55  {
60  Set,
61  Map,
62  Default = Member
63  };
64 };
65 
67 class EZ_FOUNDATION_DLL ezAbstractProperty
68 {
69 public:
71  ezAbstractProperty(const char* szPropertyName)
72  {
73  m_szPropertyName = szPropertyName;
74  }
75 
76  virtual ~ezAbstractProperty(){}
77 
79  const char* GetPropertyName() const { return m_szPropertyName; }
80 
82  virtual const ezRTTI* GetSpecificType() const = 0;
83 
85  virtual ezPropertyCategory::Enum GetCategory() const = 0; // [tested]
86 
88  const ezBitflags<ezPropertyFlags>& GetFlags() const
89  {
90  return m_Flags;
91  };
92 
95  {
96  m_Flags.Add(flags);
97  return this;
98  };
99 
101  ezAbstractProperty* AddAttributes(ezPropertyAttribute* pAttrib1, ezPropertyAttribute* pAttrib2 = nullptr, ezPropertyAttribute* pAttrib3 = nullptr, ezPropertyAttribute* pAttrib4 = nullptr, ezPropertyAttribute* pAttrib5 = nullptr, ezPropertyAttribute* pAttrib6 = nullptr)
102  {
103  EZ_ASSERT_DEV(pAttrib1 != nullptr, "invalid attribute");
104 
105  m_Attributes.PushBack(pAttrib1);
106  if (pAttrib2) m_Attributes.PushBack(pAttrib2);
107  if (pAttrib3) m_Attributes.PushBack(pAttrib3);
108  if (pAttrib4) m_Attributes.PushBack(pAttrib4);
109  if (pAttrib5) m_Attributes.PushBack(pAttrib5);
110  if (pAttrib6) m_Attributes.PushBack(pAttrib6);
111  return this;
112  };
113 
115  const ezArrayPtr<ezPropertyAttribute* const> GetAttributes() const
116  {
117  return m_Attributes.GetArrayPtr();
118  }
119 
121  template<typename Type>
122  const Type* GetAttributeByType() const
123  {
124  for (const auto* pAttr : m_Attributes)
125  {
126  if (pAttr->GetDynamicRTTI()->IsDerivedFrom<Type>())
127  return static_cast<const Type*>(pAttr);
128  }
129  return nullptr;
130  }
131 
132 protected:
134  const char* m_szPropertyName;
136 };
137 
139 class EZ_FOUNDATION_DLL ezAbstractConstantProperty : public ezAbstractProperty
140 {
141 public:
142 
144  ezAbstractConstantProperty(const char* szPropertyName) : ezAbstractProperty(szPropertyName)
145  {
146  }
147 
149  virtual ezPropertyCategory::Enum GetCategory() const override { return ezPropertyCategory::Constant; } // [tested]
150 
152  virtual void* GetPropertyPointer() const = 0;
153 
155  virtual ezVariant GetConstant() const = 0;
156 
157 };
158 
163 class EZ_FOUNDATION_DLL ezAbstractMemberProperty : public ezAbstractProperty
164 {
165 public:
166 
168  ezAbstractMemberProperty(const char* szPropertyName) : ezAbstractProperty(szPropertyName)
169  {
170  }
171 
174 
186  virtual void* GetPropertyPointer(const void* pInstance) const = 0;
187 
190  virtual void GetValuePtr(const void* pInstance, void* pObject) const = 0;
191 
194  virtual void SetValuePtr(void* pInstance, void* pObject) = 0;
195 
196 };
197 
199 class EZ_FOUNDATION_DLL ezAbstractFunctionProperty : public ezAbstractProperty
200 {
201 public:
202 
204  ezAbstractFunctionProperty(const char* szPropertyName) : ezAbstractProperty(szPropertyName)
205  {
206  }
207 
210 
212  virtual void Execute(void* pInstance) const = 0;
213 };
214 
215 
217 class EZ_FOUNDATION_DLL ezAbstractArrayProperty : public ezAbstractProperty
218 {
219 public:
221  ezAbstractArrayProperty(const char* szPropertyName) : ezAbstractProperty(szPropertyName)
222  {
223  }
224 
227 
229  virtual ezUInt32 GetCount(const void* pInstance) const = 0;
230 
232  virtual void GetValue(const void* pInstance, ezUInt32 uiIndex, void* pObject) const = 0;
233 
235  virtual void SetValue(void* pInstance, ezUInt32 uiIndex, const void* pObject) = 0;
236 
238  virtual void Insert(void* pInstance, ezUInt32 uiIndex, void* pObject) = 0;
239 
241  virtual void Remove(void* pInstance, ezUInt32 uiIndex) = 0;
242 
244  virtual void Clear(void* pInstance) = 0;
245 
247  virtual void SetCount(void* pInstance, ezUInt32 uiCount) = 0;
248 
249 };
250 
251 
255 class EZ_FOUNDATION_DLL ezAbstractSetProperty : public ezAbstractProperty
256 {
257 public:
259  ezAbstractSetProperty(const char* szPropertyName) : ezAbstractProperty(szPropertyName)
260  {
261 
262  }
263 
265  virtual ezPropertyCategory::Enum GetCategory() const override { return ezPropertyCategory::Set; }
266 
268  virtual ezUInt32 GetCount(const void* pInstance) const = 0;
269 
271  virtual void Clear(void* pInstance) = 0;
272 
274  virtual void Insert(void* pInstance, void* pObject) = 0;
275 
277  virtual void Remove(void* pInstance, void* pObject) = 0;
278 
280  virtual bool Contains(const void* pInstance, void* pObject) const = 0;
281 
283  virtual void GetValues(const void* pInstance, ezHybridArray<ezVariant, 16>& out_keys) const = 0;
284 
285 };
286 
287 
289 template <typename FUNC>
291 {
292 };
293 
294 template <class Class, typename R, typename P>
296 {
297  typedef P ParameterType;
298  typedef R ReturnType;
299 };
300 
302 template <typename CONTAINER>
304 {
305 };
306 
307 
308 template <typename T>
310 {
311  typedef typename ezTypeTraits<T>::NonConstReferenceType Type;
312 };
313 
314 template <typename T>
316 {
317  typedef typename ezTypeTraits<T>::NonConstReferenceType Type;
318 };
319 
320 template <typename T, ezUInt32 Size>
322 {
323  typedef typename ezTypeTraits<T>::NonConstReferenceType Type;
324 };
325 
326 template <typename T>
328 {
329  typedef typename ezTypeTraits<T>::NonConstReferenceType Type;
330 };
331 
332 template <typename T>
334 {
335  typedef typename ezTypeTraits<T>::NonConstReferenceType Type;
336 };
337