EventAnalysis  1.0.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  const std::type_info &GetObjType() { return typeid(DataType); }
75 
82  void WrapNothing() {
83  _dataObjPtr = nullptr;
84  _dataObjSharedPtr = nullptr;
85  }
86 
92 
97  void *GetObjAddress() { return (void *)(_dataObjPtr ? _dataObjPtr.get() : _dataObjSharedPtr.get()); }
98 
111  bool WrapObject(void *address, const std::type_info &type, bool own);
112 
113 protected:
116  std::shared_ptr<DataType> _dataObjSharedPtr;
117 };
118 
125 template <typename DataType, typename = void> class ObjectWrapperT : public ObjectWrapperTImpl<DataType> {
127 
128 public:
134  std::unique_ptr<ObjectWrapperBase> CloneObject() {
135  throw std::logic_error("Call to ObjectWrapperT::CloneObject for non-copy-constructible class");
136  }
137 
144  std::unique_ptr<ObjectWrapperBase> CloneWrapper() {
145  return std::unique_ptr<ObjectWrapperBase>(new ObjectWrapperT<DataType>(*this));
146  }
147 };
148 
157 template <typename DataType>
158 class ObjectWrapperT<DataType, typename std::enable_if<smart_is_copy_constructible<DataType>::value>::type>
159  : public ObjectWrapperTImpl<DataType> {
160 
161 public:
163 
172  std::unique_ptr<ObjectWrapperBase> CloneObject();
173 
180  std::unique_ptr<ObjectWrapperBase> CloneWrapper() {
181  return std::unique_ptr<ObjectWrapperBase>(new ObjectWrapperT<DataType>(*this));
182  }
183 };
184 
185 } // namespace EA
186 
187 #include "core/ObjectWrapperT.hpp"
188 
189 #endif /* OBJECTWRAPPERT_H_ */
std::unique_ptr< ObjectWrapperBase > CloneWrapper()
Clones the wrapper.
Definition: ObjectWrapperT.h:180
ObjectWrapperTImpl(observer_ptr< DataType > dataObjPtr)
Constructor.
Definition: ObjectWrapperT.hpp:17
void * GetObjAddress()
Getter for raw pointer to the wrapped object.
Definition: ObjectWrapperT.h:97
T * get() const
Getter for pointed address.
Definition: ObserverPtr.h:155
bool IsPolymorphic()
Test for polymorphic wrapped object.
Definition: ObjectWrapperT.hpp:37
Wrapper class for non-copy-constructible objects.
Definition: ObjectWrapperT.h:125
const std::type_info & GetObjType()
Returns the type of the wrapped object.
Definition: ObjectWrapperT.h:74
IncludeFileExc.h IncludeFileExc class declaration.
Definition: Algorithm.h:21
void WrapNothing()
Remove the wrapped object.
Definition: ObjectWrapperT.h:82
std::shared_ptr< DataType > _dataObjSharedPtr
Definition: ObjectWrapperT.h:116
std::unique_ptr< ObjectWrapperBase > CloneObject()
Throws an exception since the wrapped object is not copy-constructible.
Definition: ObjectWrapperT.h:134
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:115
bool WrapObject(void *address, const std::type_info &type, bool own)
Wrap the object at the given address.
Definition: ObjectWrapperT.hpp:51
observer_ptr< DataType > GetObj()
Data object getter method.
Definition: ObjectWrapperT.hpp:35
bool _isPolymorphic
Definition: ObjectWrapperT.h:114
std::unique_ptr< ObjectWrapperBase > CloneWrapper()
Clones the wrapper.
Definition: ObjectWrapperT.h:144
bool WrapsSomething()
Checks if the wrapper wraps something.
Definition: ObjectWrapperT.h:91
Wrapper for data objects.
Definition: ObjectWrapperT.h:26