MeVisLabToolboxReference
MeVisLab/Standard/Sources/ML/MLTools/include/mlWrapperMacros.h
Go to the documentation of this file.
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