IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
DynamicTemplateSrcMacro.h
Go to the documentation of this file.
1 // DynamicTemplateSrcMacro.h:
3 // ---------------------------------
4 //
11 //
13 
14 #ifndef __IPSDKUTIL_DYNAMICTEMPLATESRCMACRO_H__
15 #define __IPSDKUTIL_DYNAMICTEMPLATESRCMACRO_H__
16 
20 #include <boost/preprocessor/seq.hpp>
21 #include <boost/preprocessor/stringize.hpp>
22 #include <boost/thread/lock_guard.hpp>
23 #include <boost/make_shared.hpp>
24 #include <memory>
25 
28 
31 #define IPSDK_TEMPLATE_CLASSID_MACRO_TRUE(state, type) \
32  state ", " BOOST_PP_STRINGIZE(type)
33 
36 #define IPSDK_TEMPLATE_CLASSID_MACRO_FALSE(state, type) \
37  state BOOST_PP_STRINGIZE(type)
38 
41 #define IPSDK_TEMPLATE_CLASSID_MACRO(s, state, type) \
42  BOOST_PP_IF(BOOST_PP_SUB(s, 2), \
43  IPSDK_TEMPLATE_CLASSID_MACRO_TRUE, \
44  IPSDK_TEMPLATE_CLASSID_MACRO_FALSE)(state, type)
45 
48 #define IPSDK_TEMPLATE_CLASSID(className, seqT) \
49  BOOST_PP_SEQ_FOLD_LEFT(IPSDK_TEMPLATE_CLASSID_MACRO, \
50  BOOST_PP_STRINGIZE(className) "<", \
51  seqT) \
52  ">"
53 
56 
59 #define IPSDK_IMPLEMENT_TEMPLATE_DYNAMIC(className, seqT) \
60  IPSDK_TEMPLATE_PARAMS(seqT) \
61  static ipsdk::BaseDynamicObject* className##NewCreatorFcn() { \
62  return new className<IPSDK_TEMPLATE_ARGS(seqT)>(); \
63  } \
64  IPSDK_TEMPLATE_PARAMS(seqT) \
65  static ipsdk::DynamicObjectPtr className##SharedCreatorFcn() { \
66  return boost::make_shared<className<IPSDK_TEMPLATE_ARGS(seqT)> >(); \
67  } \
68  IPSDK_TEMPLATE_PARAMS(seqT) \
69  struct className##DynamicRegistrator { \
70  className##DynamicRegistrator(); \
71  ~className##DynamicRegistrator(); \
72  static className##DynamicRegistrator g_classRegistrator; \
73  };
74 
77 #define IPSDK_IMPLEMENT_ABSTRACT_TEMPLATE_DYNAMIC(className, seqT)
78 
81 #define IPSDK_IMPLEMENT_TEMPLATE_COPY_SUPPORT(className, seqT) \
82  IPSDK_TEMPLATE_PARAMS(seqT) \
83  className<IPSDK_TEMPLATE_ARGS(seqT)>::className(const className<IPSDK_TEMPLATE_ARGS(seqT)>& object) { \
84  if (this != &object) { \
85  this->initCtorCopy(object); \
86  copy(object); \
87  } \
88  } \
89  IPSDK_TEMPLATE_PARAMS(seqT) \
90  className<IPSDK_TEMPLATE_ARGS(seqT)>& \
91  className<IPSDK_TEMPLATE_ARGS(seqT)>::operator= (const className<IPSDK_TEMPLATE_ARGS(seqT)>& object) { \
92  copy(object); \
93  return *this; \
94  } \
95  IPSDK_TEMPLATE_PARAMS(seqT) \
96  ipsdk::BaseDynamicObject* className<IPSDK_TEMPLATE_ARGS(seqT)>::duplicate() const { \
97  std::auto_ptr<className> pObject; \
98  pObject.reset(static_cast<className*>(createNew())); \
99  pObject->copy(*this); \
100  return pObject.release(); \
101  } \
102  IPSDK_TEMPLATE_PARAMS(seqT) \
103  ipsdk::DynamicObjectPtr className<IPSDK_TEMPLATE_ARGS(seqT)>::duplicateShared() const { \
104  boost::shared_ptr<className> pObject(boost::make_shared<className>()); \
105  pObject->copy(*this); \
106  return pObject; \
107  }
108 
111 #define IPSDK_IMPLEMENT_TEMPLATE_DYNAMIC_WITH_COPY(className, seqT) \
112  IPSDK_IMPLEMENT_TEMPLATE_COPY_SUPPORT(className, seqT) \
113  IPSDK_IMPLEMENT_TEMPLATE_DYNAMIC(className, seqT)
114 
117 #define IPSDK_IMPLEMENT_TEMPLATE_DYNAMIC_WITHOUT_COPY(className, seqT) \
118  IPSDK_TEMPLATE_PARAMS(seqT) \
119  void className<IPSDK_TEMPLATE_ARGS(seqT)>::copy(const ipsdk::BaseDynamicObject& object) { \
120  IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \
121  (className<IPSDK_TEMPLATE_ARGS(seqT)>::getTypeName())); \
122  } \
123  IPSDK_TEMPLATE_PARAMS(seqT) \
124  ipsdk::BaseDynamicObject* className<IPSDK_TEMPLATE_ARGS(seqT)>::duplicate() const { \
125  IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \
126  (className<IPSDK_TEMPLATE_ARGS(seqT)>::getTypeName())); \
127  return 0; \
128  } \
129  IPSDK_TEMPLATE_PARAMS(seqT) \
130  ipsdk::DynamicObjectPtr className<IPSDK_TEMPLATE_ARGS(seqT)>::duplicateShared() const { \
131  IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \
132  (className<IPSDK_TEMPLATE_ARGS(seqT)>::getTypeName())); \
133  return ipsdk::DynamicObjectPtr(); \
134  } \
135  IPSDK_IMPLEMENT_TEMPLATE_DYNAMIC(className, seqT)
136 
139 #define IPSDK_IMPLEMENT_ABSTRACT_TEMPLATE_DYNAMIC_WITH_COPY(className, seqT) \
140  IPSDK_IMPLEMENT_ABSTRACT_TEMPLATE_DYNAMIC(className, seqT)
141 
144 #define IPSDK_IMPLEMENT_ABSTRACT_TEMPLATE_DYNAMIC_WITHOUT_COPY(className, seqT) \
145  IPSDK_TEMPLATE_PARAMS(seqT) \
146  void className<IPSDK_TEMPLATE_ARGS(seqT)>::copy(const ipsdk::BaseDynamicObject& object) { \
147  IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \
148  (className<IPSDK_TEMPLATE_ARGS(seqT)>::getTypeName())); \
149  } \
150  IPSDK_TEMPLATE_PARAMS(seqT) \
151  ipsdk::BaseDynamicObject* className<IPSDK_TEMPLATE_ARGS(seqT)>::duplicate() const { \
152  IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \
153  (className<IPSDK_TEMPLATE_ARGS(seqT)>::getTypeName())); \
154  return 0; \
155  } \
156  IPSDK_TEMPLATE_PARAMS(seqT) \
157  ipsdk::DynamicObjectPtr className<IPSDK_TEMPLATE_ARGS(seqT)>::duplicateShared() const { \
158  IPSDKUTIL_THROW([ipsdk::eIPSDKUtilErrors::eCantCopyObject] % \
159  (className<IPSDK_TEMPLATE_ARGS(seqT)>::getTypeName())); \
160  return ipsdk::DynamicObjectPtr(); \
161  } \
162  IPSDK_IMPLEMENT_ABSTRACT_TEMPLATE_DYNAMIC(className, seqT)
163 
166 
169 #define IPSDK_EXPORT_TEMPLATE_DYNAMIC_MACRO(r, Seq, seqT) \
170  BOOST_PP_SEQ_ELEM(1, Seq) \
171  template <> BOOST_PP_SEQ_ELEM(0, Seq) \
172  const std::string& BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::getTypeName() { \
173  boost::lock_guard<boost::mutex> lock(TypeNameMutex::get()); \
174  static const std::string g_typeName(BOOST_PP_SEQ_ELEM(4, Seq) \
175  IPSDK_TEMPLATE_CLASSID(BOOST_PP_SEQ_ELEM(2, Seq), seqT)); \
176  return g_typeName; \
177  } \
178  template <> BOOST_PP_SEQ_ELEM(0, Seq) \
179  const std::string& BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::getClassName() const { \
180  return BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::getTypeName(); \
181  } \
182  template <> BOOST_PP_SEQ_ELEM(0, Seq) \
183  ipsdk::BaseDynamicObject* BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::createNewObject() { \
184  return new BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>(); \
185  } \
186  template <> BOOST_PP_SEQ_ELEM(0, Seq) \
187  ipsdk::DynamicObjectPtr BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::createSharedObject() { \
188  return boost::make_shared<BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)> >(); \
189  } \
190  template <> BOOST_PP_SEQ_ELEM(0, Seq) \
191  ipsdk::BaseDynamicObject* BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::createNew() const { \
192  return new BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>(); \
193  } \
194  template <> BOOST_PP_SEQ_ELEM(0, Seq) \
195  ipsdk::DynamicObjectPtr BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::createShared() const { \
196  return boost::make_shared<BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)> >(); \
197  } \
198  BOOST_PP_SEQ_ELEM(3, Seq) \
199  template <> \
200  BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)<IPSDK_TEMPLATE_VALUES(seqT)>:: \
201  BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)() { \
202  ipsdk::DynamicObjectFactory& factory = ipsdk::DynamicObjectFactory::getInstance(); \
203  factory.registerClass(BOOST_PP_SEQ_ELEM(4, Seq) \
204  IPSDK_TEMPLATE_CLASSID(BOOST_PP_SEQ_ELEM(2, Seq), seqT), \
205  BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), NewCreatorFcn)<IPSDK_TEMPLATE_VALUES(seqT)>, \
206  BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), SharedCreatorFcn)<IPSDK_TEMPLATE_VALUES(seqT)>); \
207  } \
208  template <> \
209  BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)<IPSDK_TEMPLATE_VALUES(seqT)>:: \
210  ~BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)() { \
211  ipsdk::DynamicObjectFactory& factory = ipsdk::DynamicObjectFactory::getInstance(); \
212  factory.unRegisterClass(BOOST_PP_SEQ_ELEM(4, Seq) \
213  IPSDK_TEMPLATE_CLASSID(BOOST_PP_SEQ_ELEM(2, Seq), seqT)); \
214  } \
215  template <> \
216  BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)<IPSDK_TEMPLATE_VALUES(seqT)> \
217  BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)<IPSDK_TEMPLATE_VALUES(seqT)>::g_classRegistrator = \
218  BOOST_PP_CAT(BOOST_PP_SEQ_ELEM(2, Seq), DynamicRegistrator)<IPSDK_TEMPLATE_VALUES(seqT)>(); \
219  template class BOOST_PP_SEQ_ELEM(0, Seq) BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>;
220 
223 #define IPSDK_EXPORT_TEMPLATE_DYNAMIC(libraryName, namespaceSeq, className, TYPE_SEQ) \
224  BOOST_PP_SEQ_FOR_EACH(IPSDK_EXPORT_TEMPLATE_DYNAMIC_MACRO, \
225  (IPSDK_LIB_API(libraryName)) \
226  (IPSDK_START_NAMESPACE(namespaceSeq)) \
227  (className) \
228  (IPSDK_END_NAMESPACE(namespaceSeq)) \
229  (IPSDK_FULL_NAMESPACE_STR(namespaceSeq)), \
230  TYPE_SEQ)
231 
234 #define IPSDK_EXPORT_ABSTRACT_TEMPLATE_DYNAMIC_MACRO(r, Seq, seqT) \
235  BOOST_PP_SEQ_ELEM(1, Seq) \
236  template <> BOOST_PP_SEQ_ELEM(0, Seq) \
237  const std::string& BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::getTypeName() { \
238  boost::lock_guard<boost::mutex> lock(TypeNameMutex::get()); \
239  static const std::string g_typeName(BOOST_PP_SEQ_ELEM(4, Seq) \
240  IPSDK_TEMPLATE_CLASSID(BOOST_PP_SEQ_ELEM(2, Seq), seqT)); \
241  return g_typeName; \
242  } \
243  template <> BOOST_PP_SEQ_ELEM(0, Seq) \
244  const std::string& BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::getClassName() const { \
245  return BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>::getTypeName(); \
246  } \
247  BOOST_PP_SEQ_ELEM(3, Seq) \
248  template class BOOST_PP_SEQ_ELEM(0, Seq) BOOST_PP_SEQ_ELEM(2, Seq)<IPSDK_TEMPLATE_VALUES(seqT)>;
249 
252 #define IPSDK_EXPORT_ABSTRACT_TEMPLATE_DYNAMIC(libraryName, namespaceSeq, className, TYPE_SEQ) \
253  BOOST_PP_SEQ_FOR_EACH(IPSDK_EXPORT_ABSTRACT_TEMPLATE_DYNAMIC_MACRO, \
254  (IPSDK_LIB_API(libraryName)) \
255  (IPSDK_START_NAMESPACE(namespaceSeq)) \
256  (className) \
257  (IPSDK_END_NAMESPACE(namespaceSeq)) \
258  (IPSDK_FULL_NAMESPACE_STR(namespaceSeq)), \
259  TYPE_SEQ)
260 
263 
266 #define IPSDK_IMPLEMENT_TEMPLATE_COPY(className, seqT, baseClassName) \
267  IPSDK_TEMPLATE_PARAMS(seqT) \
268  void className<IPSDK_TEMPLATE_ARGS(seqT)>::copy(const ipsdk::BaseDynamicObject& object) { \
269  const className<IPSDK_TEMPLATE_ARGS(seqT)>* pObject = \
270  static_cast<const className<IPSDK_TEMPLATE_ARGS(seqT)>*>(&object); \
271  baseClassName::copy(object);
272 
275 
276 #endif // __IPSDKUTIL_DYNAMICTEMPLATESRCMACRO_H__
Macro set for template class manipulation.
Macro set to manage dynamic objects (source part)
Logger api for library IPSDKUtil.