MeVisLab Toolbox Reference
mlRuntimeSubClass.h
Go to the documentation of this file.
1
/*************************************************************************************
2
**
3
** Copyright 2007, MeVis Medical Solutions AG
4
**
5
** The user may use this file in accordance with the license agreement provided with
6
** the Software or, alternatively, in accordance with the terms contained in a
7
** written agreement between the user and MeVis Medical Solutions AG.
8
**
9
** For further information use the contact form at https://www.mevislab.de/contact
10
**
11
**************************************************************************************/
12
13
#ifndef ML_RUNTIME_SUB_CLASS_H
14
#define ML_RUNTIME_SUB_CLASS_H
15
20
21
#include "
mlRuntimeType.h
"
22
23
//--------------------------------------------------------------
31
//--------------------------------------------------------------
32
#define ML_BASE_IS_A(base,type) ((base && base->getTypeId()) ? base->getTypeId()->isDerivedFrom(type::getClassTypeId()) : false)
33
34
35
//--------------------------------------------------------------
37
//--------------------------------------------------------------
38
#ifndef ML_EMPTY_PARAM
39
#define ML_EMPTY_PARAM
40
#endif
41
42
#define ML_INTERNAL_CLASS_HEADER_CREATECB(EXP_SYM) \
43
public: \
44
/* Creates an instance of this class type. */
\
45
[[nodiscard]] \
46
EXP_SYM static void* createCB(); \
47
private:
48
49
#define ML_INTERNAL_CLASS_HEADER_EXPORTED(className, EXP_SYM, ML_INTERNAL_VIRTUAL, ML_INTERNAL_OVERRIDE) \
50
public: \
51
/* Creates a new runtime type from class name and insert */
\
52
/* it into the runtime type system. */
\
53
/* A \p classPrefix (a null terminated string) can be passed */
\
54
/* which then will be prefixed to the class name before */
\
55
/* creating the runtime type name from it. */
\
56
/* \p nameReplacement is also a null terminated string which */
\
57
/* will be used as replacement of the class name if passed as */
\
58
/* non nullptr. It will still be prefixed if a prefix is passed. */
\
59
EXP_SYM static void initClass(const char* classPrefix=nullptr, \
60
const char* nameReplacement=nullptr);\
61
\
62
/* Removes the class type from the runtime type system. */
\
63
EXP_SYM static void destroyClass(); \
64
\
65
/* Returns the runtime type of this class. */
\
66
EXP_SYM static const RuntimeType* getClassTypeId(); \
67
\
68
/* Returns the (evt. overloaded) runtime type of this object.*/
\
69
EXP_SYM ML_INTERNAL_VIRTUAL const RuntimeType* getTypeId() const ML_INTERNAL_OVERRIDE; \
70
\
71
/* Returns the null terminated type name of this runtime type*/
\
72
/* or the string "<Name of Uninitialized Type>" if the type */
\
73
/* is still uninitialized. That case will also cause an ML */
\
74
/* error message with code ML_TYPE_NOT_REGISTERED. */
\
75
EXP_SYM ML_INTERNAL_VIRTUAL const char* getTypeIdName() const ML_INTERNAL_OVERRIDE; \
76
\
77
private: \
78
/* Pointer to the runtime type of this class which is stored */
\
79
/* in the runtime type system. */
\
80
static const RuntimeType* _classType;
81
82
//--------------------------------------------------------------
89
//--------------------------------------------------------------
90
#define ML_CLASS_HEADER_EXPORTED(className, EXP_SYM) \
91
ML_INTERNAL_CLASS_HEADER_EXPORTED(className, EXP_SYM, ML_EMPTY_PARAM, override) \
92
ML_INTERNAL_CLASS_HEADER_CREATECB(EXP_SYM)
93
94
//--------------------------------------------------------------
97
//--------------------------------------------------------------
98
#define ML_CLASS_HEADER(className) \
99
ML_INTERNAL_CLASS_HEADER_EXPORTED(className, ML_EMPTY_PARAM, ML_EMPTY_PARAM, override) \
100
ML_INTERNAL_CLASS_HEADER_CREATECB(ML_EMPTY_PARAM)
101
102
#define ML_ROOT_CLASS_HEADER(className) \
103
ML_INTERNAL_CLASS_HEADER_EXPORTED(className, ML_EMPTY_PARAM, virtual, ML_EMPTY_PARAM) \
104
ML_INTERNAL_CLASS_HEADER_CREATECB(ML_EMPTY_PARAM)
105
106
#define ML_INTERNAL_CLASS_SOURCE(className,parentName,createCB) \
107
\
108
/* Pointer to the runtime type of this class which is stored */
\
109
/* in the runtime type system. Types should be initialized */
\
110
/* to nullptr since Runtime::badType() could be initialized */
\
111
/* to nullptr later than the type itself. */
\
112
const RuntimeType* className::_classType = nullptr; \
113
\
114
/* Creates a new runtime type from class name and insert */
\
115
/* it into the runtime type system. */
\
116
/* A \p classPrefix (a null terminated string) can be passed */
\
117
/* which then will be prefixed to the class name before */
\
118
/* creating the runtime type name from it. */
\
119
/* \p nameReplacement is also a null terminated string which */
\
120
/* will be used as replacement of the class name if passed as */
\
121
/* non nullptr. It will still be prefixed if a prefix is passed. */
\
122
void className::initClass(const char* classPrefix, \
123
const char* nameReplacement) \
124
{ \
125
_classType = Runtime::initType(_classType, \
126
#parentName, \
127
classPrefix, \
128
#className, \
129
createCB, \
130
nameReplacement); \
131
} \
132
/* Removes the class type from the runtime type system. */
\
133
void className::destroyClass() \
134
{ \
135
Runtime::destroyType(#className); \
136
} \
137
\
138
/* Returns the runtime type of this class. */
\
139
const RuntimeType* className::getClassTypeId() \
140
{ \
141
return _classType; \
142
} \
143
\
144
/* Returns the (evt. overloaded) runtime type of this object.*/
\
145
const RuntimeType* className::getTypeId() const \
146
{ \
147
return _classType; \
148
} \
149
\
150
/* Returns the null terminated type name of this runtime type */
\
151
/* or the string "<Name of Uninitialized Type>" if the type */
\
152
/* is still uninitialized. That case will also cause an ML */
\
153
/* error message with code ML_TYPE_NOT_REGISTERED. */
\
154
const char* className::getTypeIdName() const \
155
{ \
156
return Runtime::_getCheckedTypeIdName(_classType, #className); \
157
}
158
159
#define ML_INTERNAL_CLASS_CREATECB(className) \
160
/* Creates an instance of this class type. */
\
161
void* className::createCB() \
162
{ \
163
return new className(); \
164
} \
165
166
167
//--------------------------------------------------------------
173
//--------------------------------------------------------------
174
#define ML_CLASS_SOURCE(className,parentName) \
175
ML_INTERNAL_CLASS_SOURCE(className,parentName, className::createCB) \
176
ML_INTERNAL_CLASS_CREATECB(className)
177
178
//--------------------------------------------------------------
183
//--------------------------------------------------------------
184
#define ML_ROOT_CLASS_SOURCE(className) \
185
ML_CLASS_SOURCE(className,)
186
187
188
//--------------------------------------------------------------
193
//--------------------------------------------------------------
194
#define ML_ABSTRACT_CLASS_HEADER_EXPORTED(className, EXP_SYM) \
195
ML_INTERNAL_CLASS_HEADER_EXPORTED(className, EXP_SYM, ML_EMPTY_PARAM, override)
196
197
//--------------------------------------------------------------
201
//--------------------------------------------------------------
202
#define ML_ABSTRACT_CLASS_HEADER(className) \
203
ML_INTERNAL_CLASS_HEADER_EXPORTED(className, ML_EMPTY_PARAM, ML_EMPTY_PARAM, override)
204
205
#define ML_ABSTRACT_ROOT_CLASS_HEADER(className) \
206
ML_INTERNAL_CLASS_HEADER_EXPORTED(className, ML_EMPTY_PARAM, virtual , ML_EMPTY_PARAM)
207
208
//--------------------------------------------------------------
214
//--------------------------------------------------------------
215
#define ML_ABSTRACT_CLASS_SOURCE(className,parentName) \
216
ML_INTERNAL_CLASS_SOURCE(className,parentName, nullptr) \
217
218
//--------------------------------------------------------------
223
//--------------------------------------------------------------
224
#define ML_ABSTRACT_ROOT_CLASS_SOURCE(className) \
225
ML_ABSTRACT_CLASS_SOURCE(className,)
226
227
228
//--------------------------------------------------------------
234
//--------------------------------------------------------------
235
#define ML_MODULE_CLASS_HEADER(className) \
236
/* Implement normal class header stuff. */
\
237
ML_CLASS_HEADER(className) \
238
\
239
/* Implement private copy constructor. */
\
240
private: className(const className&); \
241
\
242
/* Implement private assignment operator. */
\
243
private: className& operator=(const className&); \
244
245
246
//--------------------------------------------------------------
253
//--------------------------------------------------------------
254
#define ML_MODULE_CLASS_SOURCE(className, parentName) \
255
/* Implement normal class source stuff. */
\
256
ML_CLASS_SOURCE(className, parentName)
257
258
//--------------------------------------------------------------
264
//--------------------------------------------------------------
265
#define ML_ABSTRACT_MODULE_CLASS_HEADER(className) \
266
/* Implement normal class header stuff. */
\
267
ML_ABSTRACT_CLASS_HEADER(className) \
268
\
269
/* Implement private copy constructor. */
\
270
private: className(const className&); \
271
\
272
/* Implement private assignment operator. */
\
273
private: className& operator=(const className&); \
274
275
276
//--------------------------------------------------------------
283
//--------------------------------------------------------------
284
#define ML_ABSTRACT_MODULE_CLASS_SOURCE(className, parentName) \
285
/* Implement normal class source stuff. */
\
286
ML_ABSTRACT_CLASS_SOURCE(className, parentName)
287
288
289
//--------------------------------------------------------------
293
//--------------------------------------------------------------
294
#define ML_MODULE_CLASS_SOURCE_EXT(className, parentName, superClassConstructs) \
295
/* Implement normal class source stuff. */
\
296
ML_CLASS_SOURCE(className, parentName)
297
298
299
//--------------------------------------------------------------
303
//--------------------------------------------------------------
304
#define ML_ABSTRACT_MODULE_CLASS_SOURCE_EXT(className, parentName, superClassConstructs) \
305
/* Implement normal class source stuff. */
\
306
ML_ABSTRACT_CLASS_SOURCE(className, parentName)
307
308
309
#endif
// __mlRuntimeSubClass_H
310
mlRuntimeType.h
MeVis
Foundation
Sources
MLUtilities
mlRuntimeSubClass.h
Generated by
1.10.0