Devel Lib
ObjectData.h
1 #pragma once
2 
3 #include <type_traits>
4 #include <functional>
5 #include <memory>
8 namespace Devel {
37  class CObjectData {
40  typedef std::function<void *()> Constructor;
43  typedef std::function<std::shared_ptr<void>()> ConstructorShared;
46  typedef std::function<void(void *)> Deconstructor;
47 
48  public:
50  CObjectData() = default;
51 
55  CObjectData(const CObjectData &i_oObjectData) {
56  this->m_fnClassConstructor = i_oObjectData.m_fnClassConstructor;
57  this->m_fnClassConstructorShared = i_oObjectData.m_fnClassConstructorShared;
58  this->m_fnClassDeconstructor = i_oObjectData.m_fnClassDeconstructor;
59 
60  this->m_nClassSize = i_oObjectData.m_nClassSize;
61  this->m_fHasVirtual = i_oObjectData.m_fHasVirtual;
62  }
63 
65  virtual ~CObjectData() = default;
66 
67  public:
72  template<typename T>
73  static CObjectData get() {
74  typedef typename std::remove_pointer<T>::type Type;
75 
76  CObjectData oData;
77 
78  // Get constructors
79  oData.m_fnClassConstructor = []() { return new Type(); };
80 
81  // Get move constructor
82  oData.m_fnClassConstructorShared = []() {
83  return std::static_pointer_cast<void>(std::make_shared<Type>());
84  };
85 
86  // Get deconstructor
87  oData.m_fnClassDeconstructor = [](void *i_pData) { delete reinterpret_cast<Type *>(i_pData); };
88 
89  // Get meta data
90  oData.m_nClassSize = sizeof(Type);
91  oData.m_fHasVirtual = std::has_virtual_destructor<Type>::value;
92 
93  return oData;
94  }
95 
96  public:
101  template<typename T = void>
102  T *construct() {
103  return (this->m_fnClassConstructor ? reinterpret_cast<T *>(this->m_fnClassConstructor()) : nullptr);
104  }
105 
110  template<typename T = void>
111  std::shared_ptr<T> constructShared() {
112  return (this->m_fnClassConstructorShared ? std::static_pointer_cast<T>(this->m_fnClassConstructorShared())
113  : nullptr);
114  }
115 
120  template<typename T = void>
121  void deconstruct(T *i_tData) {
122  if (this->m_fnClassDeconstructor) {
123  return this->m_fnClassDeconstructor(i_tData);
124  }
125  }
126 
127  public:
131  [[nodiscard]] Constructor constructor() const {
132  return this->m_fnClassConstructor;
133  }
134 
138  [[nodiscard]] ConstructorShared constructorShared() const {
139  return this->m_fnClassConstructorShared;
140  }
141 
145  [[nodiscard]] Deconstructor deconstructor() const {
146  return this->m_fnClassDeconstructor;
147  }
148 
152  [[nodiscard]] size_t size() const {
153  return this->m_nClassSize;
154  }
155 
159  [[nodiscard]] bool hasVirtual() const {
160  return this->m_fHasVirtual;
161  }
162 
163  private:
166  Constructor m_fnClassConstructor;
169  ConstructorShared m_fnClassConstructorShared;
172  Deconstructor m_fnClassDeconstructor;
175  size_t m_nClassSize{};
178  bool m_fHasVirtual{};
179  };
180 }
A class for representing and handling data of an arbitrary type.
Definition: ObjectData.h:37
bool hasVirtual() const
Getter for m_fHasVirtual.
Definition: ObjectData.h:159
Constructor constructor() const
Getter for m_fnClassConstructor.
Definition: ObjectData.h:131
size_t size() const
Getter for m_nClassSize.
Definition: ObjectData.h:152
std::shared_ptr< T > constructShared()
Constructs an object of a specific type.
Definition: ObjectData.h:111
CObjectData()=default
Default constructor.
Deconstructor deconstructor() const
Getter for m_fnClassDeconstructor.
Definition: ObjectData.h:145
virtual ~CObjectData()=default
Default virtual destructor.
ConstructorShared constructorShared() const
Getter for m_fnClassConstructorShared.
Definition: ObjectData.h:138
void deconstruct(T *i_tData)
Deconstructs an object of a specific type.
Definition: ObjectData.h:121
static CObjectData get()
Static function for creating CObjectData for a specific type.
Definition: ObjectData.h:73
T * construct()
Constructs an object of a specific type.
Definition: ObjectData.h:102
CObjectData(const CObjectData &i_oObjectData)
Copy constructor.
Definition: ObjectData.h:55
A namespace for development related classes and functions.