MeVisLabToolboxReference
FMEwork/ITK/Sources/ITK/MLITK/ITKSupport/mlITKSupportMacrosP.h
Go to the documentation of this file.
00001 // **InsertLicense** code
00002 //----------------------------------------------------------------------------------
00005 
00010 //----------------------------------------------------------------------------------
00011 #ifndef __mlITKSupportMacrosP_H
00012 #define __mlITKSupportMacrosP_H
00013 
00015 #include "mlInitSystemITKSupport.h"
00016 
00018 #ifndef __mlModuleIncludes_H
00019 #include "mlModuleIncludes.h"
00020 #endif
00021 
00023 #include <itkImage.h>
00024 
00025 //---------------------------------------------------------------------------
00028 //---------------------------------------------------------------------------
00029 #define _ML_INSTANTIATE_2D_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, CLASS_NAME, DIM)     \
00030   {                                                                      \
00031     switch (DIM){                                                        \
00032       case 2: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 2, CLASS_NAME); break;         \
00033       default:                                                           \
00034         ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_2D_CODE).", "DIM=", DIM); \
00035     }                                                                    \
00036   }
00037 
00038 //---------------------------------------------------------------------------
00041 //---------------------------------------------------------------------------
00042 #define _ML_INSTANTIATE_3D_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, CLASS_NAME, DIM)     \
00043   {                                                                      \
00044     switch (DIM){                                                        \
00045       case 3: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 3, CLASS_NAME); break;         \
00046       default:                                                           \
00047         ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_3D_CODE).", "DIM=", DIM); \
00048     }                                                                    \
00049   }
00050 
00051 //---------------------------------------------------------------------------
00054 //---------------------------------------------------------------------------
00055 #define _ML_INSTANTIATE_2D3D_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, CLASS_NAME, DIM)     \
00056   {                                                                      \
00057     switch (DIM){                                                        \
00058       case 2: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 2, CLASS_NAME); break;         \
00059       case 3: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 3, CLASS_NAME); break;         \
00060       default:                                                           \
00061         ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_3D_CODE).", "DIM=", DIM); \
00062     }                                                                    \
00063   }
00064 
00065 //---------------------------------------------------------------------------
00068 //---------------------------------------------------------------------------
00069 #define _ML_INSTANTIATE_6D_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, CLASS_NAME, DIM)     \
00070   {                                                                      \
00071     switch (DIM){                                                        \
00072   /*  case 1: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 1, CLASS_NAME); break;*/       \
00073       case 2: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 2, CLASS_NAME); break;         \
00074       case 3: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 3, CLASS_NAME); break;         \
00075   /*  case 4: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 4, CLASS_NAME); break; */      \
00076   /*  case 5: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 5, CLASS_NAME); break; */      \
00077       case 6: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 6, CLASS_NAME); break;         \
00078       default:                                                           \
00079         ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_6D_CODE).", "DIM=", DIM); \
00080     }                                                                    \
00081   }
00082 
00083 //------------------------------------------------------------------------------------
00085 //------------------------------------------------------------------------------------
00086 #define _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, DIM_INST)\
00087   switch(DATATYPE_ENUM){                                                                            \
00088     case MLint8Type:       DIM_INST(MLint8      , MLint8      , MLint8      , MLint8   , USER_CODE, CLASS_NAME, DIM); break;    \
00089     case MLuint8Type:      DIM_INST(MLuint8     , MLuint8     , MLuint8     , MLuint8  , USER_CODE, CLASS_NAME, DIM); break;    \
00090     case MLint16Type:      DIM_INST(MLint16     , MLint16     , MLint16     , MLint16  , USER_CODE, CLASS_NAME, DIM); break;    \
00091     case MLuint16Type:     DIM_INST(MLuint16    , MLuint16    , MLuint16    , MLuint16 , USER_CODE, CLASS_NAME, DIM); break;    \
00092     case MLint32Type:      DIM_INST(MLint32     , MLint32     , MLint32     , MLint32  , USER_CODE, CLASS_NAME, DIM); break;    \
00093     case MLuint32Type:     DIM_INST(MLuint32    , MLuint32    , MLuint32    , MLuint32 , USER_CODE, CLASS_NAME, DIM); break;    \
00094     case MLfloatType:      DIM_INST(MLfloat     , MLfloat     , MLfloat     , MLfloat  , USER_CODE, CLASS_NAME, DIM); break;    \
00095     case MLdoubleType:     DIM_INST(MLdouble    , MLdouble    , MLdouble    , MLdouble , USER_CODE, CLASS_NAME, DIM); break;    \
00096  /* case MLldoubleType:    DIM_INST(MLldouble   , MLldouble   , MLldouble   , MLldouble, USER_CODE, CLASS_NAME, DIM); break; */ \
00097  /* case MLint64Type:      DIM_INST(MLint64     , MLint64     , MLint64     , MLint64  , USER_CODE, CLASS_NAME, DIM); break; */ \
00098  /* case MLuint64Type:     DIM_INST(MLuint64    , MLuint64    , MLuint64    , MLuint64 , USER_CODE, CLASS_NAME, DIM); break; */ \
00099     default: { \
00100       ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DATA_TYPE, \
00101                             "Type case not executed(_ML_IMPLEMENT_ALL_ITK_CASES).", \
00102                             "DATATYPE_ENUM=", DATATYPE_ENUM, \
00103                             "DIM=", DIM); \
00104       break; \
00105     } \
00106   } \
00107 
00108 //------------------------------------------------------------------------------------
00110 //------------------------------------------------------------------------------------
00111 #define ML_IMPLEMENT_ALL_ITK_2D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
00112   _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_2D_CODE)
00113 
00114 //------------------------------------------------------------------------------------
00116 //------------------------------------------------------------------------------------
00117 #define ML_IMPLEMENT_ALL_ITK_3D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
00118   _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_3D_CODE)
00119 
00120 //------------------------------------------------------------------------------------
00122 //------------------------------------------------------------------------------------
00123 #define ML_IMPLEMENT_ALL_ITK_2D3D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
00124   _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_2D3D_CODE)
00125 
00126 //------------------------------------------------------------------------------------
00128 //------------------------------------------------------------------------------------
00129 #define ML_IMPLEMENT_ALL_ITK_6D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
00130   _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_6D_CODE)
00131 
00132 
00133 //---------------------------------------------------------------------------
00135 //---------------------------------------------------------------------------
00136 #define _TEMPLATE_INPUTS0 OutImageType
00137 #define _TEMPLATE_INPUTS1 InImageType,OutImageType
00138 #define _TEMPLATE_INPUTS2 InImageType,InImageType,OutImageType
00139 #define _TEMPLATE_INPUTS3 InImageType,InImageType,InImageType,OutImageType
00140 #define _TEMPLATE_INPUTS4 InImageType,InImageType,InImageType,InImageType,OutImageType
00141 #define _TEMPLATE_INPUTS5 InImageType,InImageType,InImageType,InImageType,InImageType,OutImageType
00142 
00143 
00144 
00145 //---------------------------------------------------------------------------
00149 //---------------------------------------------------------------------------
00150 #define _WRAPPER_DETERMINE_IN_REGION1_CPP(CLASS_NAME)                              \
00151 
00152 
00153 
00154 //---------------------------------------------------------------------------
00157 //---------------------------------------------------------------------------
00158 #define _ML_CALL_CALCOUTSUBIMAGE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
00159   {  \
00160     ((CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*)this)->calcOutSubImageT(*outSubImg, outIndex, inSubImgs); \
00161   }
00162 
00163 //---------------------------------------------------------------------------
00176 //---------------------------------------------------------------------------
00177 #define _ML_CREATE_ITK_FILTER(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
00178  ((CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*)this)->_createITKFilterT();
00179 
00180 //---------------------------------------------------------------------------
00191 //---------------------------------------------------------------------------
00192 #define _ML_DESTROY_ITK_FILTER(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
00193  ((CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*)this)->_destroyITKFilterT();
00194 
00195 //---------------------------------------------------------------------------
00206 //---------------------------------------------------------------------------
00207 #define _ML_DETERMINE_ITK_IN_REGION(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, _DIM, CLASS_NAME) \
00208  return ((CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, _DIM>*)this)->_determineInRegionT(inIndex, outBox, outIndex, numActiveInputs);
00209 
00210 
00211 //---------------------------------------------------------------------------
00222 //---------------------------------------------------------------------------
00223 #define _ML_DETERMINE_ITK_OUT_IMAGE_REGION(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
00224   return ((CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*)this)->_getOutImageRegionT(numImageInputs);
00225 
00226 //---------------------------------------------------------------------------
00237 //---------------------------------------------------------------------------
00238 #define _ML_SET_FILTER_PARAMETERS(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
00239   return ((CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*)this)->_setFilterParametersT();
00240 
00241 //---------------------------------------------------------------------------
00252 //---------------------------------------------------------------------------
00253 #define _ML_GET_FILTER_PARAMETERS(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
00254   return ((CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*)this)->_getFilterParametersT();
00255 
00256 
00257 //----------------------------------------------------------------------------
00260 //----------------------------------------------------------------------------
00261 #define _ML_ITK_DETERMINE_IN_REGION_0(CLASS_NAME, NAMESPACE)                                        \
00262   SubImageBox _determineInRegionT(MLint /*inIndex*/, const SubImageBox &/*outBox*/, MLint /*outIndex*/, MLint /*numActiveInputs*/) \
00263   {                                                                                                 \
00264     ML_TRACE_IN("template CLASS_NAME##Wrapper::_determineInRegionT(4 args, default version)");      \
00265     return SubImageBox();                                                                           \
00266   }
00267 
00268 //----------------------------------------------------------------------------
00273 //----------------------------------------------------------------------------
00274 #define _ML_ITK_DETERMINE_IN_REGION_N(CLASS_NAME, NAMESPACE)                            \
00275   SubImageBox _determineInRegionT(MLint inIndex, const SubImageBox &outBox, MLint outIndex, MLint numActiveInputs) \
00276   {                                                                                     \
00277     ML_TRACE_IN("template CLASS_NAME##Wrapper::_determineInRegionT(4 args)");           \
00278                                                                                         \
00279     typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr()); \
00280     return determineImageFilterInRegionTN<FilterType, InImageType>                      \
00281              (filter, *this, inIndex, outBox, outIndex, numActiveInputs);               \
00282   }                                                                                     \
00283 
00284 
00285 
00286 //----------------------------------------------------------------------------
00289 //----------------------------------------------------------------------------
00290 #define _ML_ITK_DETERMINE_OUT_REGION_0(CLASS_NAME, NAMESPACE)                          \
00291   SubImageBox _getOutImageRegionT(int /*numImageInputs*/)                              \
00292   {                                                                                    \
00293     ML_TRACE_IN("template CLASS_NAME##Wrapper::getOutImageRegionT() for 0 inps");      \
00294                                                                                        \
00295     typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr());\
00296     return determineImageFilterOutImageRegionT0<FilterType, OutImageType>              \
00297              (filter, *this);                                                          \
00298   }                                                                                    \
00299 
00300 //----------------------------------------------------------------------------
00303 //----------------------------------------------------------------------------
00304 #define _ML_ITK_DETERMINE_OUT_REGION_N(CLASS_NAME, NAMESPACE)                          \
00305   SubImageBox _getOutImageRegionT(int numImageInputs)                                  \
00306   {                                                                                    \
00307     ML_TRACE_IN("template CLASS_NAME##Wrapper::getOutImageRegionT() for N inps");      \
00308                                                                                        \
00309     typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr());\
00310     return determineImageFilterOutImageRegionTN<FilterType, OutImageType, InImageType> \
00311              (filter, *this, numImageInputs);                                          \
00312   }                                                                                    \
00313 
00314 
00315 
00316 //--------------------------------------------------------------------------------
00321 //--------------------------------------------------------------------------------
00323 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_0(CLASS_NAME, NAMESPACE) \
00324     typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS0> FilterType; \
00325 
00326 
00327 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_1(CLASS_NAME, NAMESPACE) \
00328     typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS1> FilterType; \
00329 
00330 
00331 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_2(CLASS_NAME, NAMESPACE) \
00332     typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS2> FilterType; \
00333 
00334 
00335 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_3(CLASS_NAME, NAMESPACE) \
00336     typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS3> FilterType; \
00337 
00338 
00339 
00340 //----------------------------------------------------------------------------------
00345 //   <typename DATATYPE, unsigned int DIM> 
00349 //    TSubImage<DATATYPE> *outSubImg, int outIndex SUB_IMGS)
00352 //----------------------------------------------------------------------------------
00353 #define _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, DET_IN_REGION, WRAPPER_TYPEDEFS, CREATOR_SWITCH, DET_OUT_REGION) \
00354                                                                                    \
00355                                                                                    \
00356   template <typename ML_OUTDATATYPE, typename ITK_OUTDATATYPE,                     \
00357             typename ML_INDATATYPE,  typename ITK_INDATATYPE, unsigned int DIM>    \
00358   class CLASS_NAME##Wrapper : public PROJECT_PREFIX##CLASS_NAME                    \
00359   {                                                                                \
00360     friend class PROJECT_PREFIX##CLASS_NAME;                                       \
00361                                                                                    \
00362     /*--------------------------------------------------------------------*/       \
00363        \
00364     /*--------------------------------------------------------------------*/       \
00365     typedef itk::Image<ITK_INDATATYPE,DIM> InImageType;                            \
00366                                                                                    \
00367     /*--------------------------------------------------------------------*/       \
00368        \
00369     /*--------------------------------------------------------------------*/       \
00370     typedef ITK_INDATATYPE InPixelType;                                            \
00371                                                                                    \
00372     /*--------------------------------------------------------------------*/       \
00373        \
00374     /*--------------------------------------------------------------------*/       \
00375     typedef itk::Image<ITK_OUTDATATYPE,DIM> OutImageType;                          \
00376                                                                                    \
00377     /*--------------------------------------------------------------------*/       \
00378        \
00379     /*--------------------------------------------------------------------*/       \
00380     typedef ITK_OUTDATATYPE OutPixelType;                                          \
00381                                                                                    \
00382     /*--------------------------------------------------------------------*/       \
00383        \
00384     /*--------------------------------------------------------------------*/       \
00385     WRAPPER_TYPEDEFS(CLASS_NAME, NAMESPACE)                                        \
00386                                                                                    \
00387     /*--------------------------------------------------------------------*/       \
00388        \
00389     /*--------------------------------------------------------------------*/       \
00390     void _createITKFilterT()                                                       \
00391     {                                                                              \
00392       ML_TRACE_IN("template CLASS_NAME##Wrapper::_createITKFilterT()");            \
00393                                                                                    \
00394       /* Create and store the typed object wrapper in */                           \
00395       /* untyped base class pointer.                  */                           \
00396       _itkObj = new TypedObjectHolderT<FilterType>();                              \
00397     }                                                                              \
00398                                                                                    \
00399     /*--------------------------------------------------------------------*/       \
00400        \
00401        \
00402     /*--------------------------------------------------------------------*/       \
00403     void _destroyITKFilterT()                                                      \
00404     {                                                                              \
00405       ML_TRACE_IN("template CLASS_NAME##Wrapper::_destroyITKFilterT()");           \
00406       ML_DELETE(_itkObj);                                                          \
00407     }                                                                              \
00408                                                                                    \
00409     /*------------------------------------------------------------------------*/   \
00410    \
00411    \
00412     /*------------------------------------------------------------------------*/   \
00413     DET_IN_REGION(CLASS_NAME, NAMESPACE)                                           \
00414                                                                                    \
00415     /*------------------------------------------------------------------------*/   \
00416    \
00417     /*------------------------------------------------------------------------*/   \
00418     DET_OUT_REGION(CLASS_NAME, NAMESPACE)                                          \
00419                                                                                    \
00420     /*------------------------------------------------------------------------*/   \
00421    \
00422     /*------------------------------------------------------------------------*/   \
00423     MLErrorCode _setFilterParametersT();                                           \
00424                                                                                    \
00425     /*------------------------------------------------------------------------*/   \
00426    \
00427     /*------------------------------------------------------------------------*/   \
00428     MLErrorCode _getFilterParametersT();                                           \
00429                                                                                    \
00430     /*------------------------------------------------------------------------*/   \
00431    \
00432     /*------------------------------------------------------------------------*/   \
00433     void calcOutSubImageT(SubImage &outSubImg,                                     \
00434                           int      outindex,                                       \
00435                           SubImage *inSubImgs);                                    \
00436                                                                                    \
00437                                                                                    \
00438     private:                                                                       \
00439     /*--- DO NOT IMPLEMENT MEMBERS IN THIS CLASS --- */                            \
00440     /*--- IT MUST BE LEGAL TO CAST IT TO ITS     --- */                            \
00441     /*--- BASE CLASS!                            --- */                            \
00442                             \
00443                                                             \
00444     CLASS_NAME##Wrapper(){}                                                        \
00445                                                              \
00446     ~CLASS_NAME##Wrapper(){}                                                       \
00447                                                        \
00448     CLASS_NAME##Wrapper(const CLASS_NAME##Wrapper &){}                             \
00449                                                     \
00450     CLASS_NAME##Wrapper operator=(const CLASS_NAME##Wrapper &){}                   \
00451                                                                         \
00452   };                                                                               \
00453                                                                                    \
00454   /*---------------------------------------------------------------------------*/  \
00455   /*--- Implement virtual calculateOutputSubImage method to call correctly  ---*/  \
00456   /*--- typed calcOutSubImageT method of template wrapper                   ---*/  \
00457   /*---------------------------------------------------------------------------*/  \
00458   void PROJECT_PREFIX##CLASS_NAME::calculateOutputSubImage(SubImage *outSubImg,    \
00459                                    int outIndex,                                   \
00460                                    SubImage *inSubImgs)                            \
00461   {                                                                                \
00462     ML_TRACE_IN("calculateOutputSubImage()");                                      \
00463                                                                                    \
00464     /* Call correct template version of calcOutSubImageT for all types and dims.*/ \
00465     CREATOR_SWITCH("calculateOutputSubImage()",                                    \
00466                    _ML_CALL_CALCOUTSUBIMAGE,                                       \
00467                    CLASS_NAME, _m_PixelType, _m_Dimension);                        \
00468   }                                                                                \
00469                                                                                    \
00470   /*---------------------------------------------------------------------------*/  \
00471   \
00472   \
00473   \
00474   \
00475   \
00476   \
00477   \
00478   \
00479   /*---------------------------------------------------------------------------*/  \
00480   void PROJECT_PREFIX##CLASS_NAME::_createITKFilter(MLDataType dataType, MLint dim)\
00481   {                                                                                \
00482     ML_TRACE_IN("_createITKFilter()");                                             \
00483                                                                                    \
00484     /* Clean up an eventually existing filter. */                                  \
00485     _destroyITKFilter();                                                           \
00486                                                                                    \
00487     /* Set data type and dimension of the filter to be created. */                 \
00488     _m_PixelType = dataType;                                                       \
00489     _m_Dimension = dim;                                                            \
00490                                                                                    \
00491     ML_TRY                                                                         \
00492     {                                                                              \
00493       /* Implement ITKImage creation for all data types and all dimensions. */     \
00494       CREATOR_SWITCH("_createITKFilter()",                                         \
00495                      _ML_CREATE_ITK_FILTER,                                        \
00496                      CLASS_NAME, _m_PixelType, _m_Dimension);                      \
00497     }                                                                              \
00498     ML_CATCH_BLOCK(...)                                                            \
00499     {                                                                              \
00500       ML_ITK_ML_PRINT_ERROR("_createITKFilter()",                                  \
00501                      ML_UNKNOWN_EXCEPTION, "Filter not created.",                  \
00502                      "_m_PixelType=", _m_PixelType,                                \
00503                      "_m_Dimension=", _m_Dimension);                               \
00504     }                                                                              \
00505   }                                                                                \
00506                                                                                    \
00507                                                                                    \
00508   /*---------------------------------------------------------------------------*/  \
00509   \
00510   \
00511   \
00512   \
00513   \
00514   \
00515   \
00516   \
00517   \
00518   \
00519   /*---------------------------------------------------------------------------*/  \
00520   void PROJECT_PREFIX##CLASS_NAME::_destroyITKFilter()                             \
00521   {                                                                                \
00522     ML_TRACE_IN("_destroyITKFilter()");                                            \
00523     /* Destroy only valid objects */                                               \
00524     if (!_itkObj || (_m_Dimension < 1) ||                                          \
00525         (ML_INVALID_DATA_TYPE == _m_PixelType)){ return; }                         \
00526     ML_TRY                                                                         \
00527     {                                                                              \
00528       /* Implement ITKImage creation for all data types and all dimensions. */     \
00529       CREATOR_SWITCH("_destroyITKFilter()",                                        \
00530                      _ML_DESTROY_ITK_FILTER,                                       \
00531                      CLASS_NAME, _m_PixelType, _m_Dimension);                      \
00532     }                                                                              \
00533     ML_CATCH_BLOCK(...)                                                            \
00534     {                                                                              \
00535       ML_ITK_ML_PRINT_ERROR("_destroyITKFilter()",                                 \
00536                      ML_UNKNOWN_EXCEPTION, "Filter destruction failed.",           \
00537                      "_m_PixelType=", _m_PixelType,                                \
00538                      "_m_Dimension=", _m_Dimension);                               \
00539     }                                                                              \
00540     _itkObj = NULL;                                                                \
00541   }                                                                                \
00542                                                                                    \
00543                                                                                    \
00544   /*----------------------------------------------------------------------------*/ \
00545  \
00546  \
00547  \
00548  \
00549  \
00550  \
00551  \
00552  \
00553  \
00554  \
00555  \
00556  \
00557   /*----------------------------------------------------------------------------*/ \
00558   SubImageBox PROJECT_PREFIX##CLASS_NAME::_determineInRegion(MLint inIndex,          \
00559                                                            const SubImageBox &outBox,\
00560                                                            MLint outIndex,         \
00561                                                            MLint numActiveInputs)  \
00562   {                                                                                \
00563     ML_TRACE_IN("_determineInRegion(4 args)");                                     \
00564     ML_TRY                                                                         \
00565     {                                                                              \
00566       /* Implement ITKImage creation for all data types and all dimensions. */     \
00567       CREATOR_SWITCH("_determineInRegion()",                                       \
00568                      _ML_DETERMINE_ITK_IN_REGION,                                  \
00569                      CLASS_NAME, _m_PixelType, _m_Dimension);                      \
00570     }                                                                              \
00571     ML_CATCH_BLOCK(...)                                                            \
00572     {                                                                              \
00573       ML_ITK_ML_PRINT_ERROR("_determineInRegion()",                                \
00574                      ML_UNKNOWN_EXCEPTION, "InRegion calculation failed.",         \
00575                      "inIndex=", inIndex,                                          \
00576                      "outIndex=", outIndex,                                        \
00577                      "_m_PixelType=", _m_PixelType,                                \
00578                      "_m_Dimension=", _m_Dimension);                               \
00579     }                                                                              \
00580     return SubImageBox();  /* Return empty box in case of error */                 \
00581   }                                                                                \
00582                                                                                    \
00583                                                                                    \
00584   /*----------------------------------------------------------------------------*/ \
00585  \
00586  \
00587  \
00588  \
00589  \
00590  \
00591  \
00592   /*----------------------------------------------------------------------------*/ \
00593   SubImageBox PROJECT_PREFIX##CLASS_NAME::_getOutImageRegion(int numImageInputs)   \
00594   {                                                                                \
00595     ML_TRACE_IN("_getOutImageRegion()");                                           \
00596     ML_TRY                                                                         \
00597     {                                                                              \
00598       /* Implement ITKImage creation for all data types and all dimensions. */     \
00599       CREATOR_SWITCH("_getOutImageRegion()",                                       \
00600                      _ML_DETERMINE_ITK_OUT_IMAGE_REGION,                           \
00601                      CLASS_NAME, _m_PixelType, _m_Dimension);                      \
00602     }                                                                              \
00603     ML_CATCH_BLOCK(...)                                                            \
00604     {                                                                              \
00605       ML_ITK_ML_PRINT_ERROR("_getOutImageRegion()",                                \
00606                      ML_UNKNOWN_EXCEPTION, "OutRegion calculation failed.",        \
00607                      "numImageInputs=", numImageInputs,                            \
00608                      "_m_PixelType=", _m_PixelType,                                \
00609                      "_m_Dimension=", _m_Dimension);                               \
00610     }                                                                              \
00611     return SubImageBox();  /* Return empty box in case of error */                 \
00612   }                                                                                \
00613                                                                                    \
00614                                                                                    \
00615   /*----------------------------------------------------------------------------*/ \
00616  \
00617   /*----------------------------------------------------------------------------*/ \
00618   MLErrorCode PROJECT_PREFIX##CLASS_NAME::_setFilterParameters()                   \
00619   {                                                                                \
00620     ML_TRACE_IN("_setFilterParameters()");                                         \
00621                                                                                    \
00622     MLErrorCode retCode = ML_RESULT_OK;                                            \
00623                                                                                    \
00624     ML_TRY                                                                         \
00625     {                                                                              \
00626       /* Implement ITKImage creation for all data types and all dimensions. */     \
00627       CREATOR_SWITCH("_setFilterParameters()",                                     \
00628                      _ML_SET_FILTER_PARAMETERS,                                    \
00629                      CLASS_NAME, _m_PixelType, _m_Dimension);                      \
00630     }                                                                              \
00631     ML_CATCH_BLOCK(...)                                                            \
00632     {                                                                              \
00633       ML_PRINT_ERROR("_setFilterParameters())",                                    \
00634                      ML_UNKNOWN_EXCEPTION, "Returning empty box.");                \
00635       retCode = ML_UNKNOWN_EXCEPTION;                                              \
00636     }                                                                              \
00637                                                                                    \
00638     return retCode;                                                                \
00639   }                                                                                \
00640                                                                                    \
00641                                                                                    \
00642   /*----------------------------------------------------------------------------*/ \
00643  \
00644   /*----------------------------------------------------------------------------*/ \
00645   MLErrorCode PROJECT_PREFIX##CLASS_NAME::_getFilterParameters()                   \
00646   {                                                                                \
00647     ML_TRACE_IN("_getFilterParameters()");                                         \
00648                                                                                    \
00649     MLErrorCode retCode = ML_RESULT_OK;                                            \
00650                                                                                    \
00651     ML_TRY                                                                         \
00652     {                                                                              \
00653       /* Call the correct template version of get filter function. */              \
00654       CREATOR_SWITCH("_getFilterParameters()",                                     \
00655                      _ML_GET_FILTER_PARAMETERS,                                    \
00656                      CLASS_NAME, _m_PixelType, _m_Dimension);                      \
00657     }                                                                              \
00658     ML_CATCH_BLOCK(...)                                                            \
00659     {                                                                              \
00660       ML_PRINT_ERROR("_getFilterParameters())",                                    \
00661                      ML_UNKNOWN_EXCEPTION, "Parameter no or only partially read.");\
00662       retCode = ML_UNKNOWN_EXCEPTION;                                              \
00663     }                                                                              \
00664                                                                                    \
00665     return retCode;                                                                \
00666   }                                                                                \
00667                                                                                    \
00668 
00669 #endif // __mlITKSupportMacrosP_H
00670