24 #ifndef _cmnClassRegisterMacros_h
25 #define _cmnClassRegisterMacros_h
113 #ifdef CMN_DECLARE_SERVICES
114 #undef CMN_DECLARE_SERVICES
116 #define CMN_DECLARE_SERVICES(hasDynamicCreation, lod) \
118 enum {HAS_DYNAMIC_CREATION = hasDynamicCreation}; \
119 enum {InitialLoD = lod}; \
120 static cmnClassServicesBase * ClassServices(void); \
121 virtual const cmnClassServicesBase * Services(void) const; \
123 static cmnClassServicesBase * ClassServicesPointer;
127 #ifdef CMN_DECLARE_SERVICES_EXPORT
128 #undef CMN_DECLARE_SERVICES_EXPORT
130 #define CMN_DECLARE_SERVICES_EXPORT(hasDynamicCreation, lod) \
132 enum {HAS_DYNAMIC_CREATION = hasDynamicCreation}; \
133 enum {InitialLoD = lod}; \
134 CISST_EXPORT static cmnClassServicesBase * ClassServices(void); \
135 virtual CISST_EXPORT const cmnClassServicesBase * Services(void) const; \
137 static cmnClassServicesBase * ClassServicesPointer;
139 #ifdef CMN_DECLARE_SERVICES_EXPORT_ALWAYS
140 #undef CMN_DECLARE_SERVICES_EXPORT_ALWAYS
142 #if WIN32 && _MSC_VER && CISST_DLL
143 #define CMN_DECLARE_SERVICES_EXPORT_ALWAYS(hasDynamicCreation, lod) \
145 enum {HAS_DYNAMIC_CREATION = hasDynamicCreation}; \
146 enum {InitialLoD = lod}; \
147 _declspec(dllexport) static cmnClassServicesBase * ClassServices(void); \
148 virtual _declspec(dllexport) const cmnClassServicesBase * Services(void) const; \
150 static cmnClassServicesBase * ClassServicesPointer;
152 #define CMN_DECLARE_SERVICES_EXPORT_ALWAYS(hasDynamicCreation, lod) CMN_DECLARE_SERVICES_EXPORT(hasDynamicCreation, lod)
199 #ifdef CMN_DECLARE_SERVICES_INSTANTIATION
200 #undef CMN_DECLARE_SERVICES_INSTANTIATION
202 #define CMN_DECLARE_SERVICES_INSTANTIATION(className) \
204 cmnClassServicesBase * cmnClassServicesInstantiate<className>(void);
206 #ifdef CMN_DECLARE_SERVICES_INSTANTIATION_EXPORT
207 #undef CMN_DECLARE_SERVICES_INSTANTIATION_EXPORT
209 #define CMN_DECLARE_SERVICES_INSTANTIATION_EXPORT(className) \
210 template<> CISST_EXPORT \
211 cmnClassServicesBase * cmnClassServicesInstantiate<className>(void);
239 #ifndef LIBRARY_NAME_FOR_CISST_REGISTER
240 #define LIBRARY_NAME_FOR_CISST_REGISTER ""
244 #ifdef CMN_IMPLEMENT_SERVICES
245 #undef CMN_IMPLEMENT_SERVICES
247 #define CMN_IMPLEMENT_SERVICES_INTERNAL(className, parentServices, argType) \
248 cmnClassServicesBase * className::ClassServices(void) \
250 static cmnClassServicesBase * classServices = cmnClassServicesInstantiate<className>(); \
251 return classServices; \
253 cmnClassServicesBase * className::ClassServicesPointer = className::ClassServices(); \
254 const cmnClassServicesBase * className::Services(void) const \
256 return this->ClassServices(); \
259 cmnClassServicesBase * cmnClassServicesInstantiate<className>(void) \
261 static cmnClassServices<className::HAS_DYNAMIC_CREATION, className, argType> \
262 classServices(#className, &typeid(className), parentServices, LIBRARY_NAME_FOR_CISST_REGISTER, className::InitialLoD); \
263 return static_cast<cmnClassServicesBase *>(&classServices); \
265 static cmnClassServicesBase * className##ClassServicesPointer = className::ClassServices();
267 #define CMN_IMPLEMENT_SERVICES(className) \
268 CMN_IMPLEMENT_SERVICES_INTERNAL(className, 0, className)
270 #define CMN_IMPLEMENT_SERVICES_DERIVED(className, parentName) \
271 CMN_IS_DERIVED_FROM_ASSERT(className, parentName) \
272 CMN_IMPLEMENT_SERVICES_INTERNAL(className, parentName::ClassServices(), className)
274 #ifdef CMN_IMPLEMENT_SERVICES_TEMPLATED
275 #undef CMN_IMPLEMENT_SERVICES_TEMPLATED
277 #define CMN_IMPLEMENT_SERVICES_TEMPLATED_INTERNAL(className, parentServices, argType) \
279 cmnClassServicesBase * className::ClassServices(void) \
281 static cmnClassServicesBase * classServices = cmnClassServicesInstantiate<className>(); \
282 return classServices; \
285 cmnClassServicesBase * className::ClassServicesPointer = className::ClassServices(); \
287 const cmnClassServicesBase * className::Services(void) const \
289 return this->ClassServices(); \
292 cmnClassServicesBase * cmnClassServicesInstantiate<className>(void) \
294 static cmnClassServices<className::HAS_DYNAMIC_CREATION, className, argType> \
295 classServices(#className, &typeid(className), parentServices, LIBRARY_NAME_FOR_CISST_REGISTER, className::InitialLoD); \
296 return static_cast<cmnClassServicesBase *>(&classServices); \
298 static cmnClassServicesBase * className##ClassServicesPointer = className::ClassServices();
300 #define CMN_IMPLEMENT_SERVICES_TEMPLATED(className) \
301 CMN_IMPLEMENT_SERVICES_TEMPLATED_INTERNAL(className, 0, className)
303 #define CMN_IMPLEMENT_SERVICES_DERIVED_TEMPLATED(className, parentName) \
304 CMN_IS_DERIVED_FROM_ASSERT(className, parentName) \
305 CMN_IMPLEMENT_SERVICES_TEMPLATED_INTERNAL(className, parentName::ClassServices(), className)
337 #endif // _cmnClassRegisterMacros_h
const int CMN_DYNAMIC_CREATION_DEFAULT
Definition: cmnClassRegisterMacros.h:329
const int CMN_DYNAMIC_CREATION_ONEARG
Definition: cmnClassRegisterMacros.h:333
Declaration of the class cmnTypeTraits.
const int CMN_NO_DYNAMIC_CREATION
Definition: cmnClassRegisterMacros.h:328
const int CMN_DYNAMIC_CREATION
Definition: cmnClassRegisterMacros.h:331
const int CMN_DYNAMIC_CREATION_COPY
Definition: cmnClassRegisterMacros.h:330
const int CMN_DYNAMIC_CREATION_SETNAME
Definition: cmnClassRegisterMacros.h:332