MeVisLab Toolbox Reference
mlWrapperMacros.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_WRAPPER_MACROS_H
14#define ML_WRAPPER_MACROS_H
15
16
49
51#ifndef ML_EMPTY_SPACE
52#define ML_EMPTY_SPACE
53#endif
54
55
79#define IMPLEMENT_DIM_DISPATCHER_P0(FUNC_NAME, CLASS_NAME, RET_TYPE, RET_COMMAND) \
80 /* Create function type.*/ \
81 typedef RET_TYPE(*FUNC_NAME##TYPE)(CLASS_NAME *obj); \
82 \
83 /* Implement a member used to call the selected function. */ \
84 FUNC_NAME##TYPE FUNC_NAME; \
85 \
86 /* Implement 6 static functions where one is really selected by calling FUNC_NAME. */ \
87 static inline RET_TYPE FUNC_NAME##1DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##1D(); } \
88 static inline RET_TYPE FUNC_NAME##2DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##2D(); } \
89 static inline RET_TYPE FUNC_NAME##3DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##3D(); } \
90 static inline RET_TYPE FUNC_NAME##4DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##4D(); } \
91 static inline RET_TYPE FUNC_NAME##5DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##5D(); } \
92 static inline RET_TYPE FUNC_NAME##6DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##6D(); } \
93 \
94 /* Implement a switch to set the correct function for the correct dimension extent. */ \
95 void _init##FUNC_NAME##TYPE(MLint dim){ \
96 switch (dim){ \
97 case 1: FUNC_NAME = FUNC_NAME##1DCB; break; \
98 case 2: FUNC_NAME = FUNC_NAME##2DCB; break; \
99 case 3: FUNC_NAME = FUNC_NAME##3DCB; break; \
100 case 4: FUNC_NAME = FUNC_NAME##4DCB; break; \
101 case 5: FUNC_NAME = FUNC_NAME##5DCB; break; \
102 case 6: FUNC_NAME = FUNC_NAME##6DCB; break; \
103 default: ML_PRINT_FATAL_ERROR("IMPLEMENT_DIM_DISPATCHER_P0", ML_PROGRAMMING_ERROR, \
104 "Using 6d implementation."); \
105 } \
106 }
107
112#define IMPLEMENT_DIM_DISPATCHER_P1(FUNC_NAME, CLASS_NAME, RET_TYPE, RET_COMMAND, P_TYPE) \
113 /* Create function type.*/ \
114 typedef RET_TYPE(*FUNC_NAME##TYPE)(CLASS_NAME *obj, P_TYPE p); \
115 \
116 /* Implement a member used to call the selected function. */ \
117 FUNC_NAME##TYPE FUNC_NAME; \
118 \
119 /* Implement 6 static functions where one is really selected by calling FUNC_NAME. */ \
120 static inline RET_TYPE FUNC_NAME##1DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##1D(p);} \
121 static inline RET_TYPE FUNC_NAME##2DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##2D(p);} \
122 static inline RET_TYPE FUNC_NAME##3DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##3D(p);} \
123 static inline RET_TYPE FUNC_NAME##4DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##4D(p);} \
124 static inline RET_TYPE FUNC_NAME##5DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##5D(p);} \
125 static inline RET_TYPE FUNC_NAME##6DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##6D(p);} \
126 \
127 /* Implement a switch to set the correct function for the correct dimension extent. */ \
128 void _init##FUNC_NAME##TYPE(MLint dim){ \
129 switch (dim){ \
130 case 1: FUNC_NAME = FUNC_NAME##1DCB; break; \
131 case 2: FUNC_NAME = FUNC_NAME##2DCB; break; \
132 case 3: FUNC_NAME = FUNC_NAME##3DCB; break; \
133 case 4: FUNC_NAME = FUNC_NAME##4DCB; break; \
134 case 5: FUNC_NAME = FUNC_NAME##5DCB; break; \
135 case 6: FUNC_NAME = FUNC_NAME##6DCB; break; \
136 default: ML_PRINT_FATAL_ERROR("IMPLEMENT_DIM_DISPATCHER_P1", ML_PROGRAMMING_ERROR, \
137 "Using 6d implementation."); \
138 } \
139 }
140
141
166#define IMPLEMENT_EXC_DISPATCHER_P0(FUNC_NAME, CLASS_NAME, RET_TYPE, RET_COMMAND) \
167 /* Create function type.*/ \
168 typedef RET_TYPE(*FUNC_NAME##TYPE)(CLASS_NAME *obj); \
169 \
170 /* Implement one function pointer for each dimension. */ \
171 /* They will be set to the normal or the exception version. */ \
172 FUNC_NAME##TYPE FUNC_NAME##1; \
173 FUNC_NAME##TYPE FUNC_NAME##2; \
174 FUNC_NAME##TYPE FUNC_NAME##3; \
175 FUNC_NAME##TYPE FUNC_NAME##4; \
176 FUNC_NAME##TYPE FUNC_NAME##5; \
177 FUNC_NAME##TYPE FUNC_NAME##6; \
178 \
179 /* Implement 6 static functions where one is really selected by calling FUNC_NAME. */ \
180 static inline RET_TYPE FUNC_NAME##1##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##1N ();} \
181 static inline RET_TYPE FUNC_NAME##2##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##2N ();} \
182 static inline RET_TYPE FUNC_NAME##3##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##3N ();} \
183 static inline RET_TYPE FUNC_NAME##4##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##4N ();} \
184 static inline RET_TYPE FUNC_NAME##5##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##5N ();} \
185 static inline RET_TYPE FUNC_NAME##6##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##6N ();} \
186 \
187 static inline RET_TYPE FUNC_NAME##1E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##1E();} \
188 static inline RET_TYPE FUNC_NAME##2E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##2E();} \
189 static inline RET_TYPE FUNC_NAME##3E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##3E();} \
190 static inline RET_TYPE FUNC_NAME##4E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##4E();} \
191 static inline RET_TYPE FUNC_NAME##5E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##5E();} \
192 static inline RET_TYPE FUNC_NAME##6E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##6E();} \
193 \
194 /* Implement a switch to set the correct function for the correct dimension extent. */ \
195 void _init##FUNC_NAME##TYPE(bool useExceptions){ \
196 /* Set function pointers to the code of the corresponding static functions. */ \
197 /* If exception handling is enabled then use the exception version otherwise the normal version. */ \
198 FUNC_NAME##1 = useExceptions ? FUNC_NAME##1E##CB : FUNC_NAME##1##CB; \
199 FUNC_NAME##2 = useExceptions ? FUNC_NAME##2E##CB : FUNC_NAME##2##CB; \
200 FUNC_NAME##3 = useExceptions ? FUNC_NAME##3E##CB : FUNC_NAME##3##CB; \
201 FUNC_NAME##4 = useExceptions ? FUNC_NAME##4E##CB : FUNC_NAME##4##CB; \
202 FUNC_NAME##5 = useExceptions ? FUNC_NAME##5E##CB : FUNC_NAME##5##CB; \
203 FUNC_NAME##6 = useExceptions ? FUNC_NAME##6E##CB : FUNC_NAME##6##CB; \
204 }
205
206
207#endif // __mlWrapperMacros_H