MeVisLabToolboxReference
|
00001 // **InsertLicense** code 00002 //---------------------------------------------------------------------------------- 00036 00041 //---------------------------------------------------------------------------------- 00042 #ifndef __mlWrapperMacros_H 00043 #define __mlWrapperMacros_H 00044 00045 00047 #ifndef ML_EMPTY_SPACE 00048 #define ML_EMPTY_SPACE 00049 #endif 00050 00051 00075 #define IMPLEMENT_DIM_DISPATCHER_P0(FUNC_NAME, CLASS_NAME, RET_TYPE, RET_COMMAND) \ 00076 /* Create function type.*/ \ 00077 typedef RET_TYPE(*FUNC_NAME##TYPE)(register CLASS_NAME *obj); \ 00078 \ 00079 /* Implement a member used to call the selected function. */ \ 00080 FUNC_NAME##TYPE FUNC_NAME; \ 00081 \ 00082 /* Implement 6 static functions where one is really selected by calling FUNC_NAME. */ \ 00083 static inline RET_TYPE FUNC_NAME##1DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##1D(); } \ 00084 static inline RET_TYPE FUNC_NAME##2DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##2D(); } \ 00085 static inline RET_TYPE FUNC_NAME##3DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##3D(); } \ 00086 static inline RET_TYPE FUNC_NAME##4DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##4D(); } \ 00087 static inline RET_TYPE FUNC_NAME##5DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##5D(); } \ 00088 static inline RET_TYPE FUNC_NAME##6DCB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##6D(); } \ 00089 \ 00090 /* Implement a switch to set the correct function for the correct dimension extent. */ \ 00091 void _init##FUNC_NAME##TYPE(MLint dim){ \ 00092 switch (dim){ \ 00093 case 1: FUNC_NAME = FUNC_NAME##1DCB; break; \ 00094 case 2: FUNC_NAME = FUNC_NAME##2DCB; break; \ 00095 case 3: FUNC_NAME = FUNC_NAME##3DCB; break; \ 00096 case 4: FUNC_NAME = FUNC_NAME##4DCB; break; \ 00097 case 5: FUNC_NAME = FUNC_NAME##5DCB; break; \ 00098 case 6: FUNC_NAME = FUNC_NAME##6DCB; break; \ 00099 default: ML_PRINT_FATAL_ERROR("IMPLEMENT_DIM_DISPATCHER_P0", ML_PROGRAMMING_ERROR, \ 00100 "Using 6d implementation."); \ 00101 } \ 00102 } 00103 00108 #define IMPLEMENT_DIM_DISPATCHER_P1(FUNC_NAME, CLASS_NAME, RET_TYPE, RET_COMMAND, P_TYPE) \ 00109 /* Create function type.*/ \ 00110 typedef RET_TYPE(*FUNC_NAME##TYPE)(register CLASS_NAME *obj, P_TYPE p); \ 00111 \ 00112 /* Implement a member used to call the selected function. */ \ 00113 FUNC_NAME##TYPE FUNC_NAME; \ 00114 \ 00115 /* Implement 6 static functions where one is really selected by calling FUNC_NAME. */ \ 00116 static inline RET_TYPE FUNC_NAME##1DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##1D(p);} \ 00117 static inline RET_TYPE FUNC_NAME##2DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##2D(p);} \ 00118 static inline RET_TYPE FUNC_NAME##3DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##3D(p);} \ 00119 static inline RET_TYPE FUNC_NAME##4DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##4D(p);} \ 00120 static inline RET_TYPE FUNC_NAME##5DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##5D(p);} \ 00121 static inline RET_TYPE FUNC_NAME##6DCB(CLASS_NAME *obj, P_TYPE p){RET_COMMAND obj->FUNC_NAME##6D(p);} \ 00122 \ 00123 /* Implement a switch to set the correct function for the correct dimension extent. */ \ 00124 void _init##FUNC_NAME##TYPE(MLint dim){ \ 00125 switch (dim){ \ 00126 case 1: FUNC_NAME = FUNC_NAME##1DCB; break; \ 00127 case 2: FUNC_NAME = FUNC_NAME##2DCB; break; \ 00128 case 3: FUNC_NAME = FUNC_NAME##3DCB; break; \ 00129 case 4: FUNC_NAME = FUNC_NAME##4DCB; break; \ 00130 case 5: FUNC_NAME = FUNC_NAME##5DCB; break; \ 00131 case 6: FUNC_NAME = FUNC_NAME##6DCB; break; \ 00132 default: ML_PRINT_FATAL_ERROR("IMPLEMENT_DIM_DISPATCHER_P1", ML_PROGRAMMING_ERROR, \ 00133 "Using 6d implementation."); \ 00134 } \ 00135 } 00136 00137 00162 #define IMPLEMENT_EXC_DISPATCHER_P0(FUNC_NAME, CLASS_NAME, RET_TYPE, RET_COMMAND) \ 00163 /* Create function type.*/ \ 00164 typedef RET_TYPE(*FUNC_NAME##TYPE)(register CLASS_NAME *obj); \ 00165 \ 00166 /* Implement one function pointer for each dimension. */ \ 00167 /* They will be set to the normal or the exception version. */ \ 00168 FUNC_NAME##TYPE FUNC_NAME##1; \ 00169 FUNC_NAME##TYPE FUNC_NAME##2; \ 00170 FUNC_NAME##TYPE FUNC_NAME##3; \ 00171 FUNC_NAME##TYPE FUNC_NAME##4; \ 00172 FUNC_NAME##TYPE FUNC_NAME##5; \ 00173 FUNC_NAME##TYPE FUNC_NAME##6; \ 00174 \ 00175 /* Implement 6 static functions where one is really selected by calling FUNC_NAME. */ \ 00176 static inline RET_TYPE FUNC_NAME##1##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##1N ();} \ 00177 static inline RET_TYPE FUNC_NAME##2##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##2N ();} \ 00178 static inline RET_TYPE FUNC_NAME##3##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##3N ();} \ 00179 static inline RET_TYPE FUNC_NAME##4##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##4N ();} \ 00180 static inline RET_TYPE FUNC_NAME##5##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##5N ();} \ 00181 static inline RET_TYPE FUNC_NAME##6##CB (CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##6N ();} \ 00182 \ 00183 static inline RET_TYPE FUNC_NAME##1E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##1E();} \ 00184 static inline RET_TYPE FUNC_NAME##2E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##2E();} \ 00185 static inline RET_TYPE FUNC_NAME##3E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##3E();} \ 00186 static inline RET_TYPE FUNC_NAME##4E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##4E();} \ 00187 static inline RET_TYPE FUNC_NAME##5E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##5E();} \ 00188 static inline RET_TYPE FUNC_NAME##6E##CB(CLASS_NAME *obj){ RET_COMMAND obj->FUNC_NAME##6E();} \ 00189 \ 00190 /* Implement a switch to set the correct function for the correct dimension extent. */ \ 00191 void _init##FUNC_NAME##TYPE(bool useExceptions){ \ 00192 /* Set function pointers to the code of the corresponding static functions. */ \ 00193 /* If exception handling is enabled then use the exception version otherwise the normal version. */ \ 00194 FUNC_NAME##1 = useExceptions ? FUNC_NAME##1E##CB : FUNC_NAME##1##CB; \ 00195 FUNC_NAME##2 = useExceptions ? FUNC_NAME##2E##CB : FUNC_NAME##2##CB; \ 00196 FUNC_NAME##3 = useExceptions ? FUNC_NAME##3E##CB : FUNC_NAME##3##CB; \ 00197 FUNC_NAME##4 = useExceptions ? FUNC_NAME##4E##CB : FUNC_NAME##4##CB; \ 00198 FUNC_NAME##5 = useExceptions ? FUNC_NAME##5E##CB : FUNC_NAME##5##CB; \ 00199 FUNC_NAME##6 = useExceptions ? FUNC_NAME##6E##CB : FUNC_NAME##6##CB; \ 00200 } 00201 00202 00203 #endif // __mlWrapperMacros_H