Go to the documentation of this file.
13 #ifndef ML_RUNTIME_SUB_CLASS_H
14 #define ML_RUNTIME_SUB_CLASS_H
32 #define ML_BASE_IS_A(base,type) ((base && base->getTypeId()) ? base->getTypeId()->isDerivedFrom(type::getClassTypeId()) : false)
35 #if ML_DEPRECATED_SINCE(3,5,0)
41 #define BASE_IS_A(base, type) ML_BASE_IS_A(base, type)
48 #ifndef ML_EMPTY_PARAM
49 #define ML_EMPTY_PARAM
52 #define ML_INTERNAL_CLASS_HEADER_CREATECB(EXP_SYM) \
56 EXP_SYM static void* createCB(); \
59 #define ML_INTERNAL_CLASS_HEADER_EXPORTED(className, EXP_SYM, ML_INTERNAL_VIRTUAL, ML_INTERNAL_OVERRIDE) \
69 EXP_SYM static void initClass(const char* classPrefix=nullptr, \
70 const char* nameReplacement=nullptr);\
73 EXP_SYM static void destroyClass(); \
76 EXP_SYM static const RuntimeType* getClassTypeId(); \
79 EXP_SYM ML_INTERNAL_VIRTUAL const RuntimeType* getTypeId() const ML_INTERNAL_OVERRIDE; \
85 EXP_SYM ML_INTERNAL_VIRTUAL const char* getTypeIdName() const ML_INTERNAL_OVERRIDE; \
90 static const RuntimeType* _classType;
100 #define ML_CLASS_HEADER_EXPORTED(className, EXP_SYM) \
101 ML_INTERNAL_CLASS_HEADER_EXPORTED(className, EXP_SYM, ML_EMPTY_PARAM, override) \
102 ML_INTERNAL_CLASS_HEADER_CREATECB(EXP_SYM)
108 #define ML_CLASS_HEADER(className) \
109 ML_INTERNAL_CLASS_HEADER_EXPORTED(className, ML_EMPTY_PARAM, ML_EMPTY_PARAM, override) \
110 ML_INTERNAL_CLASS_HEADER_CREATECB(ML_EMPTY_PARAM)
112 #define ML_ROOT_CLASS_HEADER(className) \
113 ML_INTERNAL_CLASS_HEADER_EXPORTED(className, ML_EMPTY_PARAM, virtual, ML_EMPTY_PARAM) \
114 ML_INTERNAL_CLASS_HEADER_CREATECB(ML_EMPTY_PARAM)
116 #define ML_INTERNAL_CLASS_SOURCE(className,parentName,createCB) \
122 const RuntimeType* className::_classType = nullptr; \
132 void className::initClass(const char* classPrefix, \
133 const char* nameReplacement) \
135 _classType = Runtime::initType(_classType, \
143 void className::destroyClass() \
145 Runtime::destroyType(#className); \
149 const RuntimeType* className::getClassTypeId() \
155 const RuntimeType* className::getTypeId() const \
164 const char* className::getTypeIdName() const \
166 return Runtime::_getCheckedTypeIdName(_classType, #className); \
169 #define ML_INTERNAL_CLASS_CREATECB(className) \
171 void* className::createCB() \
173 return new className(); \
184 #define ML_CLASS_SOURCE(className,parentName) \
185 ML_INTERNAL_CLASS_SOURCE(className,parentName, className::createCB) \
186 ML_INTERNAL_CLASS_CREATECB(className)
194 #define ML_ROOT_CLASS_SOURCE(className) \
195 ML_CLASS_SOURCE(className,)
204 #define ML_ABSTRACT_CLASS_HEADER_EXPORTED(className, EXP_SYM) \
205 ML_INTERNAL_CLASS_HEADER_EXPORTED(className, EXP_SYM, ML_EMPTY_PARAM, override)
212 #define ML_ABSTRACT_CLASS_HEADER(className) \
213 ML_INTERNAL_CLASS_HEADER_EXPORTED(className, ML_EMPTY_PARAM, ML_EMPTY_PARAM, override)
215 #define ML_ABSTRACT_ROOT_CLASS_HEADER(className) \
216 ML_INTERNAL_CLASS_HEADER_EXPORTED(className, ML_EMPTY_PARAM, virtual , ML_EMPTY_PARAM)
225 #define ML_ABSTRACT_CLASS_SOURCE(className,parentName) \
226 ML_INTERNAL_CLASS_SOURCE(className,parentName, nullptr) \
234 #define ML_ABSTRACT_ROOT_CLASS_SOURCE(className) \
235 ML_ABSTRACT_CLASS_SOURCE(className,)
245 #define ML_MODULE_CLASS_HEADER(className) \
247 ML_CLASS_HEADER(className) \
250 private: className(const className&); \
253 private: className& operator=(const className&); \
264 #define ML_MODULE_CLASS_SOURCE(className, parentName) \
266 ML_CLASS_SOURCE(className, parentName)
275 #define ML_ABSTRACT_MODULE_CLASS_HEADER(className) \
277 ML_ABSTRACT_CLASS_HEADER(className) \
280 private: className(const className&); \
283 private: className& operator=(const className&); \
294 #define ML_ABSTRACT_MODULE_CLASS_SOURCE(className, parentName) \
296 ML_ABSTRACT_CLASS_SOURCE(className, parentName)
304 #define ML_MODULE_CLASS_SOURCE_EXT(className, parentName, superClassConstructs) \
306 ML_CLASS_SOURCE(className, parentName)
314 #define ML_ABSTRACT_MODULE_CLASS_SOURCE_EXT(className, parentName, superClassConstructs) \
316 ML_ABSTRACT_CLASS_SOURCE(className, parentName)
319 #if ML_DEPRECATED_SINCE(3,5,0)
326 #define ML_BASEOP_CLASS_HEADER(className) \
327 ML_MODULE_CLASS_HEADER(className)
330 #define ML_BASEOP_CLASS_SOURCE(className, parentName) \
331 ML_MODULE_CLASS_SOURCE(className, parentName)
335 #define ML_ABSTRACT_BASEOP_CLASS_HEADER(className) \
336 ML_ABSTRACT_MODULE_CLASS_HEADER(className)
340 #define ML_ABSTRACT_BASEOP_CLASS_SOURCE(className, parentName) \
341 ML_ABSTRACT_MODULE_CLASS_SOURCE(className, parentName)
345 #define ML_BASEOP_CLASS_SOURCE_EXT(className, parentName, superClassConstructs) \
346 ML_CLASS_SOURCE(className, parentName)
350 #define ML_ABSTRACT_BASEOP_CLASS_SOURCE_EXT(className, parentName, superClassConstructs) \
351 ML_ABSTRACT_CLASS_SOURCE(className, parentName)