MeVisLabToolboxReference
MeVisLab/Standard/Sources/ML/MLKernel/mlKernelMacros.h
Go to the documentation of this file.
00001 // **InsertLicense** code
00002 //-------------------------------------------------------------------------
00006 
00016 //-------------------------------------------------------------------------
00017 // Prevent multiple including of this file.
00018 #ifndef __mlKernelMacros_H
00019 #define __mlKernelMacros_H
00020 
00021 // TODO !!! investigate !!!: (Guenter Ott - 05.04.2004) OK:
00022 //   Quite difficult to understand this file.
00023 //   Maybe a code-examble as comment without macros would be helpful to understand this file
00024 
00025 
00026 //----------------------------------------------------------------------------------------------------
00033 //----------------------------------------------------------------------------------------------------
00034 #define CALC_ROW_H()                                          \
00035   protected:                                                  \
00036   virtual void _calcKernelPage(SubImage      *outSubImg,      \
00037                                int            outIndex,       \
00038                                SubImage      *inSubImgs,      \
00039                                int            numInSubImgs,   \
00040                                MLsoffset     *indexTab,       \
00041                                size_t         indexTabSize,   \
00042                                MLsoffset      srcVoxelOffset, \
00043                                size_t         loopIdx,        \
00044                                size_t         iteration,      \
00045                                const ImageVector  &ov1,            \
00046                                const ImageVector  &ov2,            \
00047                                const ImageVector  &pOf,            \
00048                                size_t         numVox);        \
00049 
00050 
00051 //----------------------------------------------------------------------------------------------------
00055 //----------------------------------------------------------------------------------------------------
00056 #define CALC_ROW_CPP(CLASS_NAME, SUPER_CLASS)                                                 \
00057   _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_SCALAR_CASES, _KERNEL_CASE_CODE)
00058 
00059 //----------------------------------------------------------------------------------------------------
00063 //----------------------------------------------------------------------------------------------------
00064 #define CALC_ROW_DEFAULT_TYPES_CPP(CLASS_NAME, SUPER_CLASS)                                                 \
00065   _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_DEFAULT_CASES, _KERNEL_CASE_CODE)
00066 
00067 //----------------------------------------------------------------------------------------------------
00073 //----------------------------------------------------------------------------------------------------
00074 #define CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION)                           \
00075   _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION, _KERNEL_CASE_CODE)
00076 
00077 //----------------------------------------------------------------------------------------------------
00081 //----------------------------------------------------------------------------------------------------
00082 #define CALC_ROW_CPP_EXT(CLASS_NAME, SUPER_CLASS)                                             \
00083   _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_SCALAR_CASES, _KERNEL_CASE_CODE_EXT)
00084 
00085 //----------------------------------------------------------------------------------------------------
00089 //----------------------------------------------------------------------------------------------------
00090 #define CALC_ROW_CPP_EXT_DD(CLASS_NAME, SUPER_CLASS)                                          \
00091   _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_SCALAR_CASES, _KERNEL_CASE_CODE_EXT_DD)
00092 
00093 //----------------------------------------------------------------------------------------------------
00100 //----------------------------------------------------------------------------------------------------
00101 #define CALC_ROW_CPP_ANY_EXT(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION)                       \
00102   _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION, _KERNEL_CASE_CODE_EXT)
00103 
00104 
00105 
00106 //----------------------------------------------------------------------------------------------------
00110 //----------------------------------------------------------------------------------------------------
00111 #define CALC_ROW_CPP_SUBIMG(CLASS_NAME, SUPER_CLASS)                                          \
00112   _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_SCALAR_CASES, _KERNEL_CASE_CODE_SUBIMG)
00113 
00114 //----------------------------------------------------------------------------------------------------
00120 //----------------------------------------------------------------------------------------------------
00121 #define CALC_ROW_CPP_ANY_SUBIMG(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION)                    \
00122   _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION, _KERNEL_CASE_CODE_SUBIMG)
00123 
00124 //----------------------------------------------------------------------------------------------------
00128 //----------------------------------------------------------------------------------------------------
00129 #define CALC_ROW_CPP_SUBIMG_EXT(CLASS_NAME, SUPER_CLASS)                                      \
00130   _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_SCALAR_CASES, _KERNEL_CASE_CODE_SUBIMG_EXT)
00131 
00132 //----------------------------------------------------------------------------------------------------
00137 //----------------------------------------------------------------------------------------------------
00138 #define CALC_ROW_CPP_SUBIMG_EXT_DD(CLASS_NAME, SUPER_CLASS)                                      \
00139   _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, ML_IMPLEMENT_SCALAR_CASES, _KERNEL_CASE_CODE_SUBIMG_EXT_DD)
00140 
00141 //----------------------------------------------------------------------------------------------------
00147 //----------------------------------------------------------------------------------------------------
00148 #define CALC_ROW_CPP_ANY_SUBIMG_EXT(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION)                \
00149   _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, SWITCH_SELECTION, _KERNEL_CASE_CODE_SUBIMG_EXT)
00150 
00151 
00152 
00153 
00154 
00155 
00156 
00157 
00158 //----------------------------------------------------------------------------------------------------
00159 //
00160 //
00161 //
00162 //
00163 //  Now follows PRIVATE Stuff: Do not use! It is subject to change!
00164 //
00165 //
00166 //
00167 //
00168 //----------------------------------------------------------------------------------------------------
00169 
00170 
00171 //----------------------------------------------------------------------------------------------------
00173 //----------------------------------------------------------------------------------------------------
00174 #define _KERNEL_STD_PARAMS        indexTab, indexTabSize, srcVoxelOffset, numVox,         \
00175                                   rowTab[0], outRowStartPointer, rowStart
00176 
00177 //----------------------------------------------------------------------------------------------------
00179 //----------------------------------------------------------------------------------------------------
00180 #define _KERNEL_STD_PARAMS_SUBIMG indexTab, indexTabSize, srcVoxelOffset, numVox,         \
00181                                   typedInTSubImgs[0], typedOutSubImg, rowStart
00182 
00183 //----------------------------------------------------------------------------------------------------
00185 //----------------------------------------------------------------------------------------------------
00186 #define _KERNEL_EXT_PARAMS        indexTab, indexTabSize, srcVoxelOffset, numVox,         \
00187                                   rowTab, outRowStartPointer, rowStart,                   \
00188                                   outIndex, numInSubImgs, loopIdx, iteration
00189 
00190 //----------------------------------------------------------------------------------------------------
00192 //----------------------------------------------------------------------------------------------------
00193 #define _KERNEL_EXT_PARAMS_SUBIMG indexTab, indexTabSize, srcVoxelOffset, numVox,         \
00194                                   typedInTSubImgs, typedOutSubImg, rowStart,              \
00195                                   outIndex, numInSubImgs, loopIdx, iteration
00196 
00197 
00198 //----------------------------------------------------------------------------------------------------
00211 //------------------------------------------------------------------------------------------------------
00212 #define _CALC_ROW_CPP_ANY(CLASS_NAME, SUPER_CLASS, TYPE_IMPLEMENTER, CASE_CODE)                 \
00213                                                                                                 \
00214   void CLASS_NAME::_calcKernelPage(SubImage                   *outSubImg,                       \
00215                                    int                         outIndex,                        \
00216                                    SubImage                   *inSubImgs,                       \
00217                                    int                         numInSubImgs,                    \
00218                                    MLsoffset                  *indexTab,                        \
00219                                    size_t                      indexTabSize,                    \
00220                                    MLsoffset                   srcVoxelOffset,                  \
00221                                    size_t                      loopIdx,                         \
00222                                    size_t                      iteration,                       \
00223                                    const ImageVector          &ov1,                             \
00224                                    const ImageVector          &ov2,                             \
00225                                    const ImageVector          &pOf,                             \
00226                                    size_t                      numVox)                          \
00227   {                                                                                             \
00228     /* Loop and position variables used in inner macros. */                                     \
00229     ImageVector p, rowStart;                                                                         \
00230                                                                                                 \
00231     /* Only to avoid warnings if not used by macro. */                                          \
00232     loopIdx   += 0;                                                                             \
00233     iteration += 0;                                                                             \
00234     outIndex  += 0;                                                                             \
00235                                                                                                 \
00236     switch(outSubImg->getDataType()){                                                           \
00237       TYPE_IMPLEMENTER(CLASS_NAME, CASE_CODE, OUT_SWITCH_TYPE,                                  \
00238                        "_CALC_ROW_CPP_ANY", INTYPE_DUMMY)                                       \
00239       ML_IMPLEMENT_DEFAULT_HANDLING("_CALC_ROW_CPP_ANY")                                        \
00240     }                                                                                           \
00241   }                                                                                             \
00242 
00243 
00244 
00245 //----------------------------------------------------------------------------------------------------
00249 //----------------------------------------------------------------------------------------------------
00250 template <typename INDTYPE>
00251   void __ML_KERNEL_CASE_CODE_clearAndHandleError(ML_NAMESPACE::TSubImageWithCursor<INDTYPE> *&typedInTSubImgs,
00252                                                  INDTYPE **&rowTab, 
00253                                                  bool err,
00254                                                  const char *className)
00255   {
00256     if (err){
00257       // Print error only if requested.
00258       ML_PRINT_ERROR(className ? className : "__KERNEL_CASE_CODE_SUBIMG",
00259                      ML_UNKNOWN_EXCEPTION,
00260                      "Unknown exception or out of memory. Returning "
00261                      "without calculating output page.");
00262     }
00263     /* Clean up. */
00264     MLFree(rowTab);
00265     rowTab = NULL;
00266     ML_DELETE_ARRAY(typedInTSubImgs);
00267   }
00268 
00269 //----------------------------------------------------------------------------------------------------
00284 //----------------------------------------------------------------------------------------------------
00285 #define __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, ADD_PARAMS)                       \
00286   {                                                                                                   \
00287     /* Pointer table to row starts in all input subimages. */                                         \
00288     IN_DATA_TYPE** rowTab = NULL;                                                                     \
00289                                                                                                       \
00290     /* Create typed versions of the subimages. */                                                     \
00291     TSubImageWithCursor<OUT_DATA_TYPE > typedOutSubImg(*outSubImg);                                               \
00292     TSubImageWithCursor<IN_DATA_TYPE > *typedInTSubImgs = NULL;                                                   \
00293     ML_TRY                                                                                            \
00294     {                                                                                                 \
00295       /* Create a table of typed input subimages. */                                                  \
00296       ML_CHECK_NEW_TH(typedInTSubImgs, TSubImageWithCursor<IN_DATA_TYPE >[numInSubImgs]);                         \
00297                                                                                                       \
00298       /* Define contents of typed input subimages. */                                                 \
00299       for (int inIdx=0; inIdx < numInSubImgs; ++inIdx){                                               \
00300         typedInTSubImgs[inIdx].setData(inSubImgs[inIdx].getData());                                   \
00301         typedInTSubImgs[inIdx].setBox (inSubImgs[inIdx].getBox());                                    \
00302       }                                                                                               \
00303                                                                                                       \
00304       /* Create a table of input pointers to rows. */                                                 \
00305       rowTab = static_cast<IN_DATA_TYPE**>                                                            \
00306                 (MLAlloc(numInSubImgs*sizeof(IN_DATA_TYPE*), ML_THROW_NO_MEMORY));                    \
00307                                                                                                       \
00308       /* Loop over all rows of the subimages. */                                                      \
00309       for (p.u=ov1.u;   p.u<=ov2.u;   p.u++){                                                         \
00310         for (p.t=ov1.t;   p.t<=ov2.t;   p.t++){                                                       \
00311           for (p.c=ov1.c;   p.c<=ov2.c;   p.c++){                                                     \
00312             for (p.z=ov1.z;   p.z<=ov2.z;   p.z++){                                                   \
00313               for (p.y=ov1.y;   p.y<=ov2.y;   p.y++){                                                 \
00314                 /* Set cursors to begin of rows in input and output subimage. */                      \
00315                 rowStart.set(ov1.x, p.y, p.z, p.c, p.t, p.u);                                         \
00316                                                                                                       \
00317                 /* Call the calcRow() method of the module and pass all important information, */     \
00318                 /* especially the pointers to the rows starts in input and output subimages. */       \
00319                 for (int inIdx=0; inIdx < numInSubImgs; ++inIdx){                                     \
00320                   /* Set subimage cursor to row start and store it in rowStart. */                    \
00321                   /* Note that pOf is the position offset passed to _calcKernelPage as argument. */   \
00322                   typedInTSubImgs[inIdx].setCursorImagePosition(rowStart-pOf);                               \
00323                   rowTab[inIdx] = typedInTSubImgs[inIdx].getCursorPointer();                              \
00324                 }                                                                                     \
00325                                                                                                       \
00326                 /* Set subimage cursor to row start and also set outRowStartPointer to it. */         \
00327                 typedOutSubImg.setCursorImagePosition(rowStart);                                             \
00328                 OUT_DATA_TYPE *outRowStartPointer = typedOutSubImg.getCursorPointer();                    \
00329                                                                                                       \
00330                 /* Pointer table to row starts in all input subimages. */                             \
00331                 outRowStartPointer += 0; /* To avoid compiler warnings. */                            \
00332                                                                                                       \
00333                 /* Call the user implemented calcRow function with the specified parameter set. */    \
00334                 calcRow(ADD_PARAMS);                                                                  \
00335               } /* y */                                                                               \
00336             }                                                                                         \
00337           }                                                                                           \
00338         }                                                                                             \
00339       } /* u */                                                                                       \
00340                                                                                                       \
00341       /* Clean up without error. */                                                                   \
00342       __ML_KERNEL_CASE_CODE_clearAndHandleError(typedInTSubImgs, rowTab, false, #CLASS_NAME);         \
00343     }                                                                                                 \
00344     ML_CATCH_BLOCK(...){                                                                              \
00345       /* Clean up with error. */                                                                      \
00346       __ML_KERNEL_CASE_CODE_clearAndHandleError(typedInTSubImgs, rowTab, true, #CLASS_NAME);          \
00347                                                                                                       \
00348       /* Propagate the error to the next exception handler to clean up higher level allocations. */   \
00349       throw;                                                                                          \
00350     }                                                                                                 \
00351   }
00352 
00353 
00354 //----------------------------------------------------------------------------------------------------
00356 //----------------------------------------------------------------------------------------------------
00357 #define __KERNEL_CASE_CODE_EXT_DD_HELPER(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME)                     \
00358     __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, OPNAME, _KERNEL_EXT_PARAMS)                       \
00359 
00360 //----------------------------------------------------------------------------------------------------
00363 //----------------------------------------------------------------------------------------------------
00364 #define __KERNEL_CASE_CODE_EXT_DD(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, ADD_PARAMS)                \
00365   {                                                                                                   \
00366     ML_IMPLEMENT_DIFFERENT_INOUT_DATATYPES_CASES("",                                                                         \
00367                           __KERNEL_CASE_CODE_EXT_DD_HELPER,                                           \
00368                           inSubImgs->getDataType(),                                                   \
00369                           "__KERNEL_CASE_CODE_DD",                                                    \
00370                           OUT_DATA_TYPE);                                                             \
00371                                                                                                       \
00372   }                                                                                                   \
00373 
00374 //----------------------------------------------------------------------------------------------------
00377 //----------------------------------------------------------------------------------------------------
00378 #define __KERNEL_CASE_CODE_SUBIMG_EXT_DD_HELPER(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME)              \
00379     __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, OPNAME, _KERNEL_EXT_PARAMS_SUBIMG)                \
00380 
00381 //----------------------------------------------------------------------------------------------------
00385 //----------------------------------------------------------------------------------------------------
00386 #define __KERNEL_CASE_CODE_SUBIMG_EXT_DD(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, ADD_PARAMS)         \
00387   {                                                                                                   \
00388     ML_IMPLEMENT_DIFFERENT_SCALAR_INOUT_DATATYPES_CASES("",                                                                         \
00389                           __KERNEL_CASE_CODE_SUBIMG_EXT_DD_HELPER,                                    \
00390                           inSubImgs->getDataType(),                                                   \
00391                           "__KERNEL_CASE_SUBIMG_CODE_DD",                                             \
00392                           OUT_DATA_TYPE);                                                             \
00393   }                                                                                                   \
00394 
00395 
00396 
00397 
00398 //----------------------------------------------------------------------------------------------------
00400 //----------------------------------------------------------------------------------------------------
00401 #define _KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME)                                   \
00402   __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, _KERNEL_STD_PARAMS)
00403 
00404 //----------------------------------------------------------------------------------------------------
00406 //----------------------------------------------------------------------------------------------------
00407 #define _KERNEL_CASE_CODE_EXT(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME)                               \
00408   __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, _KERNEL_EXT_PARAMS)
00409 
00410 //----------------------------------------------------------------------------------------------------
00413 //----------------------------------------------------------------------------------------------------
00414 #define _KERNEL_CASE_CODE_EXT_DD(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME)                            \
00415   __KERNEL_CASE_CODE_EXT_DD(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, _KERNEL_EXT_PARAMS)
00416 
00417 
00418 
00419 //----------------------------------------------------------------------------------------------------
00421 //----------------------------------------------------------------------------------------------------
00422 #define _KERNEL_CASE_CODE_SUBIMG(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME)                            \
00423   __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, _KERNEL_STD_PARAMS_SUBIMG)
00424 
00425 //----------------------------------------------------------------------------------------------------
00427 //----------------------------------------------------------------------------------------------------
00428 #define _KERNEL_CASE_CODE_SUBIMG_EXT(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME)                        \
00429   __KERNEL_CASE_CODE(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, _KERNEL_EXT_PARAMS_SUBIMG)
00430 
00431 //----------------------------------------------------------------------------------------------------
00434 //----------------------------------------------------------------------------------------------------
00435 #define _KERNEL_CASE_CODE_SUBIMG_EXT_DD(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME)                     \
00436   __KERNEL_CASE_CODE_SUBIMG_EXT_DD(OUT_DATA_TYPE, IN_DATA_TYPE, CLASS_NAME, _KERNEL_EXT_PARAMS_SUBIMG)
00437 
00438 
00439 
00440 #endif // __mlKernelMacros_H
00441 
00442 
00443 
00444