EventAnalysis  0.95
ObjectWrapperT.hpp
Go to the documentation of this file.
1 /*
2  * ObjectWrapperT.hpp
3  *
4  * Created on: 04 Dec 2017
5  * Author: Nicola Mori
6  */
7 
8 #ifndef OBJECTWRAPPERT_HPP_
9 #define OBJECTWRAPPERT_HPP_
10 
11 #include "core/InheritsFrom.h"
12 #include "utils/SmartLog.h"
13 
14 namespace EA {
15 
16 template <typename DataType>
18  : _dataObjPtr(dataObjPtr), _dataObjSharedPtr(NULL), _isPolymorphic(std::is_polymorphic<DataType>::value) {}
19 
20 template <typename DataType>
21 ObjectWrapperTImpl<DataType>::ObjectWrapperTImpl(std::shared_ptr<DataType> dataObjPtr)
22  : _dataObjPtr((DataType *)(dataObjPtr.get())), _dataObjSharedPtr(dataObjPtr),
23  _isPolymorphic(std::is_polymorphic<DataType>::value) {}
24 
25 template <typename DataType>
26 ObjectWrapperTImpl<DataType>::ObjectWrapperTImpl(std::unique_ptr<DataType> dataObjPtr)
27  : _dataObjPtr((DataType *)(dataObjPtr.get())), _dataObjSharedPtr(std::shared_ptr<DataType>(std::move(dataObjPtr))),
28  _isPolymorphic(std::is_polymorphic<DataType>::value) {}
29 
30 template <typename DataType>
33  _isPolymorphic(original._isPolymorphic) {}
34 
36 
37 template <typename DataType> bool ObjectWrapperTImpl<DataType>::IsPolymorphic() { return _isPolymorphic; }
38 
39 template <typename DataType>
40 std::unique_ptr<ObjectWrapperBase>
43  return std::make_unique<ObjectWrapperT<DataType, void>>(
44  std::shared_ptr<DataType>(new DataType(*ObjectWrapperTImpl<DataType>::_dataObjPtr)));
45  } else {
46  return std::make_unique<ObjectWrapperT<DataType, void>>(
47  std::shared_ptr<DataType>(new DataType(*ObjectWrapperTImpl<DataType>::_dataObjSharedPtr)));
48  }
49 }
50 template <typename DataType>
51 bool ObjectWrapperTImpl<DataType>::WrapObject(void *address, const std::type_info &type, bool own) {
52  static const std::string routineName(
53  std::string("ObjectWrapperTImpl<").append(Demangler::ClassName<DataType>()).append(">::WrapObject"));
54  if (InheritsFrom(type, typeid(DataType))) {
55  if (own)
56  _dataObjSharedPtr = std::shared_ptr<DataType>((DataType *)address);
57  else
58  _dataObjPtr = (DataType *)(address);
59  return true;
60  } else {
61  COUT(ERROR) << "Can't wrap an object of type \"" << Demangler::ClassName(type) << "\" in a wrapper for type \""
62  << Demangler::ClassName<DataType>() << "\"" << ENDL;
63  return false;
64  }
65 }
66 
67 } // namespace EA
68 
69 #endif /* OBJECTWRAPPERT_HPP_ */
ObjectWrapperTImpl(observer_ptr< DataType > dataObjPtr)
Constructor.
Definition: ObjectWrapperT.hpp:17
bool IsPolymorphic()
Test for polymorphic wrapped object.
Definition: ObjectWrapperT.hpp:37
#define COUT(level)
Definition: SmartLog.h:88
static std::string ClassName()
Static method which returns the name of the class.
Definition: Demangler.h:46
Wrapper class for non-copy-constructible objects.
Definition: ObjectWrapperT.h:125
IncludeFileExc.h IncludeFileExc class declaration.
Definition: Algorithm.h:21
std::shared_ptr< DataType > _dataObjSharedPtr
Definition: ObjectWrapperT.h:116
#define ENDL
Definition: SmartLog.h:117
virtual std::unique_ptr< ObjectWrapperBase > CloneObject()=0
Clones the wrapped object and wraps it.
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
bool InheritsFrom(const std::type_info &type, const std::type_info &baseType)
Check if a given type inherits from a given class.
Definition: InheritsFrom.cpp:20
Aliased objet is an alias.
Wrapper for data objects.
Definition: ObjectWrapperT.h:26