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