IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
DynamicSrcMacro.h
Go to the documentation of this file.
1 // DynamicSrcMacro.h:
3 // ------------------
4 //
11 //
13 
14 #ifndef __IPSDKUTIL_DYNAMICSRCMACRO_H__
15 #define __IPSDKUTIL_DYNAMICSRCMACRO_H__
16 
17 #include <IPSDKUtil/Dynamic/DynamicObjectFactory.h>
21 #include <boost/thread/lock_guard.hpp>
22 #include <boost/make_shared.hpp>
23 #include <memory>
24 
25 // mutex used to protect data for concurrent accesses
26 IPSDK_STATIC_MUTEX(TypeNameMutex);
27 
30 
33 #define IPSDK_IMPLEMENT_DYNAMIC(namespaceSeq, className) \
34  const std::string& className::getTypeName() { \
35  boost::lock_guard<boost::mutex> lock(TypeNameMutex::get()); \
36  static const std::string g_typeName( \
37  IPSDK_FULL_CLASSNAME_STR(namespaceSeq, className)); \
38  return g_typeName; \
39  } \
40  const std::string& className::getClassName() const { \
41  return IPSDK_NAMESPACE_NAME(namespaceSeq)className::getTypeName(); \
42  } \
43  ipsdk::BaseDynamicObject* className::createNewObject() { \
44  return new className(); \
45  } \
46  ipsdk::DynamicObjectPtr className::createSharedObject() { \
47  return boost::make_shared<className>(); \
48  } \
49  ipsdk::BaseDynamicObject* className::createNew() const { \
50  return new className(); \
51  } \
52  ipsdk::DynamicObjectPtr className::createShared() const { \
53  return boost::make_shared<className>(); \
54  } \
55  namespace ipsdk { \
56  template <> \
57  struct DynamicRegistrator<className> { \
58  static BaseDynamicObject* newCreatorFcn() { \
59  return className::createNewObject(); \
60  } \
61  static DynamicObjectPtr sharedCreatorFcn() { \
62  return className::createSharedObject(); \
63  } \
64  DynamicRegistrator() \
65  { \
66  DynamicObjectFactory& factory = DynamicObjectFactory::getInstance(); \
67  factory.registerClass(IPSDK_FULL_CLASSNAME_STR(namespaceSeq, \
68  className), \
69  newCreatorFcn, sharedCreatorFcn); \
70  } \
71  ~DynamicRegistrator() \
72  { \
73  DynamicObjectFactory& factory = DynamicObjectFactory::getInstance(); \
74  factory.unRegisterClass(IPSDK_FULL_CLASSNAME_STR(namespaceSeq, \
75  className)); \
76  } \
77  static DynamicRegistrator g_classRegistrator; \
78  }; \
79  DynamicRegistrator<className> DynamicRegistrator<className>::g_classRegistrator; \
80  }
81 
84 #define IPSDK_IMPLEMENT_COPY_SUPPORT(className) \
85  className::className(const className& object) { \
86  if (this != &object) { \
87  initCtorCopy(object); \
88  copy(object); \
89  } \
90  } \
91  className& className::operator= (const className& object) { \
92  copy(object); \
93  return *this; \
94  } \
95  ipsdk::BaseDynamicObject* className::duplicate() const { \
96  std::auto_ptr<className> pObject(new className()); \
97  pObject->copy(*this); \
98  return pObject.release(); \
99  } \
100  ipsdk::DynamicObjectPtr className::duplicateShared() const { \
101  boost::shared_ptr<className> pObject(boost::make_shared<className>()); \
102  pObject->copy(*this); \
103  return pObject; \
104  }
105 
108 #define IPSDK_IMPLEMENT_DYNAMIC_WITH_COPY(namespaceSeq, className) \
109  IPSDK_IMPLEMENT_COPY_SUPPORT(className) \
110  IPSDK_IMPLEMENT_DYNAMIC(namespaceSeq, className)
111 
114 #define IPSDK_IMPLEMENT_DYNAMIC_WITHOUT_COPY(namespaceSeq, className) \
115  void className::copy(const ipsdk::BaseDynamicObject& object) { \
116  IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \
117  className::getTypeName()); \
118  } \
119  ipsdk::BaseDynamicObject* className::duplicate() const { \
120  IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \
121  className::getTypeName()); \
122  return 0; \
123  } \
124  ipsdk::DynamicObjectPtr className::duplicateShared() const { \
125  IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \
126  className::getTypeName()); \
127  return ipsdk::DynamicObjectPtr(); \
128  } \
129  IPSDK_IMPLEMENT_DYNAMIC(namespaceSeq, className)
130 
133 
136 #define IPSDK_IMPLEMENT_ABSTRACT_DYNAMIC(namespaceSeq, className) \
137  const std::string& className::getTypeName() { \
138  boost::lock_guard<boost::mutex> lock(TypeNameMutex::get()); \
139  static const std::string g_typeName( \
140  IPSDK_FULL_CLASSNAME_STR(namespaceSeq, className)); \
141  return g_typeName; \
142  } \
143  const std::string& className::getClassName() const { \
144  return className::getTypeName(); \
145  }
146 
149 #define IPSDK_IMPLEMENT_ABSTRACT_DYNAMIC_WITH_COPY(namespaceSeq, className) \
150  IPSDK_IMPLEMENT_ABSTRACT_DYNAMIC(namespaceSeq, className)
151 
154 #define IPSDK_IMPLEMENT_ABSTRACT_DYNAMIC_WITHOUT_COPY(namespaceSeq, className) \
155  void className::copy(const ipsdk::BaseDynamicObject& object) { \
156  IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \
157  className::getTypeName()); \
158  } \
159  ipsdk::BaseDynamicObject* className::duplicate() const { \
160  IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \
161  className::getTypeName()); \
162  return 0; \
163  } \
164  ipsdk::DynamicObjectPtr className::duplicateShared() const { \
165  IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \
166  className::getTypeName()); \
167  return ipsdk::DynamicObjectPtr(); \
168  } \
169  IPSDK_IMPLEMENT_ABSTRACT_DYNAMIC(namespaceSeq, className)
170 
173 
176 #define IPSDK_IMPLEMENT_COPY(className, baseClassName) \
177  void className::copy(const ipsdk::BaseDynamicObject& object) { \
178  const className* pObject = static_cast<const className*>(&object); \
179  baseClassName::copy(object);
180 
183 
184 #endif // __IPSDKUTIL_DYNAMICSRCMACRO_H__
Utility functions for dynamic objects copy.
Logger api for library IPSDKUtil.
Macros allowing to define a getter to a static mutex.
#define IPSDK_STATIC_MUTEX(MutexName)
macro allowing to create a static mutex
Definition: MutexMacros.h:27