EventAnalysis  1.3.0
ObjectWrapperT.h
Go to the documentation of this file.
1 /*
2  * ObjectWrapperT.h
3  *
4  * Created on: 04 Dec 2017
5  * Author: Nicola Mori
6  */
7 
8 #ifndef OBJECTWRAPPERT_H_
9 #define OBJECTWRAPPERT_H_
10 
11 #include "core/ObjectWrapperBase.h"
12 #include "core/ObserverPtr.h"
13 #include "core/Traits.h"
14 #include "utils/Demangler.h"
15 
16 namespace EA {
17 
26 template <typename DataType> class ObjectWrapperTImpl : public ObjectWrapperBase {
27 public:
36 
44  ObjectWrapperTImpl(std::shared_ptr<DataType> dataObjPtr);
45 
53  ObjectWrapperTImpl(std::unique_ptr<DataType> dataObjPtr);
54 
57 
63 
68  bool IsPolymorphic();
69 
74  bool IsConst();
75 
80  const std::type_info &GetObjType() { return typeid(DataType); }
81 
88  void WrapNothing() {
89  _dataObjPtr = nullptr;
90  _dataObjSharedPtr = nullptr;
91  }
92 
98 
103  void *GetObjAddress() { return (void *)(_dataObjPtr ? _dataObjPtr.get() : _dataObjSharedPtr.get()); }
104 
118  bool WrapObject(void *address, const std::type_info &type, bool own, bool isPolymorphic, bool isConst);
119 
120 protected:
122  std::shared_ptr<DataType> _dataObjSharedPtr;
123 };
124 
130 template <> class ObjectWrapperTImpl<void> : public ObjectWrapperBase {
131 public:
139  ObjectWrapperTImpl(void *dataObjPtr, const std::type_info &type, bool isPolymorphic, bool isConst)
140  : _dataObjPtr{dataObjPtr}, _type{type}, _isPolymorphic{isPolymorphic}, _isConst{isConst} {};
141 
144 
149  bool IsPolymorphic() { return _isPolymorphic; }
150 
155  bool IsConst() { return _isConst; }
156 
161  const std::type_info &GetObjType() { return _type; }
162 
169  void WrapNothing() { _dataObjPtr = nullptr; }
170 
175  bool WrapsSomething() { return _dataObjPtr; }
176 
181  void *GetObjAddress() { return _dataObjPtr; }
182 
196  bool WrapObject(void *address, const std::type_info &type, bool own, bool isPolymorphic, bool isConst);
197 
198 protected:
199  void *_dataObjPtr;
200  const std::type_info &_type;
202  bool _isConst;
203 };
204 
211 template <typename DataType, typename = void> class ObjectWrapperT : public ObjectWrapperTImpl<DataType> {
213 
214 public:
220  std::unique_ptr<ObjectWrapperBase> CloneObject() {
221  throw std::logic_error("Call to ObjectWrapperT::CloneObject for non-copy-constructible class");
222  }
223 
230  std::unique_ptr<ObjectWrapperBase> CloneWrapper() {
231  return std::unique_ptr<ObjectWrapperBase>(new ObjectWrapperT<DataType>(*this));
232  }
233 };
234 
243 template <typename DataType>
244 class ObjectWrapperT<DataType, typename std::enable_if<smart_is_copy_constructible<DataType>::value>::type>
245  : public ObjectWrapperTImpl<DataType> {
246 
247 public:
249 
258  std::unique_ptr<ObjectWrapperBase> CloneObject();
259 
266  std::unique_ptr<ObjectWrapperBase> CloneWrapper() {
267  return std::unique_ptr<ObjectWrapperBase>(new ObjectWrapperT<DataType>(*this));
268  }
269 };
270 
271 } // namespace EA
272 
273 #include "core/ObjectWrapperT.hpp"
274 
275 #endif /* OBJECTWRAPPERT_H_ */
bool IsConst()
Test for const wrapped object.
Definition: ObjectWrapperT.hpp:38
bool _isPolymorphic
Definition: ObjectWrapperT.h:201
std::unique_ptr< ObjectWrapperBase > CloneWrapper()
Clones the wrapper.
Definition: ObjectWrapperT.h:266
void WrapNothing()
Remove the wrapped object.
Definition: ObjectWrapperT.h:169
ObjectWrapperTImpl(observer_ptr< DataType > dataObjPtr)
Constructor.
Definition: ObjectWrapperT.hpp:17
void * GetObjAddress()
Getter for raw pointer to the wrapped object.
Definition: ObjectWrapperT.h:103
bool WrapsSomething()
Checks if the wrapper wraps something.
Definition: ObjectWrapperT.h:175
T * get() const
Getter for pointed address.
Definition: ObserverPtr.h:155
bool IsPolymorphic()
Test for polymorphic wrapped object.
Definition: ObjectWrapperT.hpp:34
ObjectWrapperTImpl(void *dataObjPtr, const std::type_info &type, bool isPolymorphic, bool isConst)
Constructor.
Definition: ObjectWrapperT.h:139
bool _isConst
Definition: ObjectWrapperT.h:202
void * GetObjAddress()
Getter for raw pointer to the wrapped object.
Definition: ObjectWrapperT.h:181
Wrapper class for non-copy-constructible objects.
Definition: ObjectWrapperT.h:211
const std::type_info & GetObjType()
Returns the type of the wrapped object.
Definition: ObjectWrapperT.h:80
IncludeFileExc.h IncludeFileExc class declaration.
Definition: Algorithm.h:21
void WrapNothing()
Remove the wrapped object.
Definition: ObjectWrapperT.h:88
std::shared_ptr< DataType > _dataObjSharedPtr
Definition: ObjectWrapperT.h:122
std::unique_ptr< ObjectWrapperBase > CloneObject()
Throws an exception since the wrapped object is not copy-constructible.
Definition: ObjectWrapperT.h:220
bool WrapObject(void *address, const std::type_info &type, bool own, bool isPolymorphic, bool isConst)
Wrap the object at the given address.
Definition: ObjectWrapperT.hpp:52
Specialization of ObjectWrapperTImpl for void.
Definition: ObjectWrapperT.h:130
const std::type_info & _type
Definition: ObjectWrapperT.h:200
const std::type_info & GetObjType()
Returns the type of the wrapped object.
Definition: ObjectWrapperT.h:161
bool IsConst()
Test for const wrapped object.
Definition: ObjectWrapperT.h:155
virtual std::unique_ptr< ObjectWrapperBase > CloneObject()=0
Clones the wrapped object and wraps it.
Mother class for data wrapper template class.
Definition: ObjectWrapperBase.h:22
observer_ptr< DataType > _dataObjPtr
Definition: ObjectWrapperT.h:121
observer_ptr< DataType > GetObj()
Data object getter method.
Definition: ObjectWrapperT.hpp:32
bool IsPolymorphic()
Test for polymorphic wrapped object.
Definition: ObjectWrapperT.h:149
void * _dataObjPtr
Definition: ObjectWrapperT.h:199
std::unique_ptr< ObjectWrapperBase > CloneWrapper()
Clones the wrapper.
Definition: ObjectWrapperT.h:230
bool WrapsSomething()
Checks if the wrapper wraps something.
Definition: ObjectWrapperT.h:97
Wrapper for data objects.
Definition: ObjectWrapperT.h:26