ezEngine  Milestone 7
Variant.h
1 #pragma once
2 
3 #include <Foundation/Containers/DynamicArray.h>
4 #include <Foundation/Containers/HashTable.h>
5 #include <Foundation/Threading/AtomicInteger.h>
6 #include <Foundation/Utilities/ConversionUtils.h>
7 
8 class ezReflectedClass;
9 
16 class EZ_FOUNDATION_DLL ezVariant
17 {
18 public:
20  struct Type
21  {
22  typedef ezUInt8 StorageType;
24  enum Enum
25  {
27  Bool,
28  Int8,
46  Time,
47  Uuid,
53  Default = Invalid
54  };
55  };
56 
58  template <typename T>
60  {
61  enum
62  {
63  value = Type::Invalid,
64  forceSharing = false,
65  hasReflectedMembers = false
66  };
67 
68  typedef T StorageType;
69  };
70 
72  ezVariant(); // [tested]
73 
79  ezVariant(const ezVariant& other); // [tested]
80 
82  ezVariant(ezVariant&& other); // [tested]
83 
87  template <typename T>
88  ezVariant(const T& value); // [tested]
89 
91  ~ezVariant();
92 
94  void operator=(const ezVariant& other); // [tested]
95 
97  void operator=(ezVariant&& other); // [tested]
98 
102  template <typename T>
103  void operator=(const T& value); // [tested]
104 
111  bool operator==(const ezVariant& other) const; // [tested]
112 
114  bool operator!=(const ezVariant& other) const; // [tested]
115 
117  template <typename T>
118  bool operator==(const T& other) const; // [tested]
119 
121  template <typename T>
122  bool operator!=(const T& other) const; // [tested]
123 
125  bool IsValid() const; // [tested]
126 
131  template <typename T>
132  bool IsA() const; // [tested]
133 
135  Type::Enum GetType() const; // [tested]
136 
144  template <typename T>
145  const T& Get() const; // [tested]
146 
148  void* GetData(); // [tested]
149 
151  const void* GetData() const; // [tested]
152 
156  ezVariant operator[](ezUInt32 uiIndex) const; // [tested]
157 
161  ezVariant operator[](ezHashing::StringWrapper szKey) const; // [tested]
162 
174  template <typename T>
175  bool CanConvertTo() const; // [tested]
176 
178  bool CanConvertTo(Type::Enum type) const; // [tested]
179 
185  template <typename T>
186  T ConvertTo(ezResult* out_pConversionStatus = nullptr) const; // [tested]
187 
189  ezVariant ConvertTo(Type::Enum type, ezResult* out_pConversionStatus = nullptr) const; // [tested]
190 
197  template <typename Functor>
198  static void DispatchTo(Functor& functor, Type::Enum type); // [tested]
199 
201  ezUInt64 ComputeHash(ezUInt64 uiSeed = 0) const;
202 
203 private:
204 
205  friend class ezVariantHelper;
206  friend struct CompareFunc;
207 
208  struct SharedData
209  {
210  void* m_Ptr;
211  ezAtomicInteger32 m_uiRef;
212  EZ_FORCE_INLINE SharedData(void* ptr) : m_Ptr(ptr), m_uiRef(1) { }
213  virtual ~SharedData() { }
214  };
215 
216  template <typename T>
218  {
219  private:
220  T m_t;
221  public:
222  EZ_FORCE_INLINE TypedSharedData(const T& value) : SharedData(&m_t), m_t(value) { }
223  };
224 
225  union Data
226  {
227  float f[4];
228  SharedData* shared;
229  } m_Data;
230 
231  ezUInt32 m_Type : 31;
232  ezUInt32 m_bIsShared : 1;
233 
234  template <typename T>
235  void Init(const T& value);
236 
237  template <typename StorageType, typename T>
238  void Store(const T& value, ezTraitInt<0>); // in-place storage
239 
240  template <typename StorageType, typename T>
241  void Store(const T& value, ezTraitInt<1>); // shared storage
242 
243  void Release();
244  void CopyFrom(const ezVariant& other);
245  void MoveFrom(ezVariant&& other);
246 
247  template <typename T>
248  T& Cast();
249 
250  template <typename T>
251  const T& Cast() const;
252 
253  static bool IsNumber(ezUInt32 type);
254  static bool IsFloatingPoint(ezUInt32 type);
255 
256  template <typename T>
257  T ConvertNumber() const;
258 };
259 
263 
264 #include <Foundation/Types/Implementation/VariantTypeDeduction_inl.h>
265 #include <Foundation/Types/Implementation/VariantHelper_inl.h>
266 #include <Foundation/Types/Implementation/Variant_inl.h>
267