28 #define _ML_INSTANTIATE_2D_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, CLASS_NAME, DIM) \
31 case 2: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 2, CLASS_NAME); break; \
33 ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_2D_CODE).", "DIM=", DIM); \
41 #define _ML_INSTANTIATE_3D_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, CLASS_NAME, DIM) \
44 case 3: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 3, CLASS_NAME); break; \
46 ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_3D_CODE).", "DIM=", DIM); \
54 #define _ML_INSTANTIATE_2D3D_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, CLASS_NAME, DIM) \
57 case 2: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 2, CLASS_NAME); break; \
58 case 3: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 3, CLASS_NAME); break; \
60 ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_3D_CODE).", "DIM=", DIM); \
68 #define _ML_INSTANTIATE_6D_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, CLASS_NAME, DIM) \
72 case 2: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 2, CLASS_NAME); break; \
73 case 3: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 3, CLASS_NAME); break; \
76 case 6: USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 6, CLASS_NAME); break; \
78 ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_6D_CODE).", "DIM=", DIM); \
85 #define _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, DIM_INST)\
86 switch(DATATYPE_ENUM){ \
87 case MLint8Type: DIM_INST(MLint8 , MLint8 , MLint8 , MLint8 , USER_CODE, CLASS_NAME, DIM); break; \
88 case MLuint8Type: DIM_INST(MLuint8 , MLuint8 , MLuint8 , MLuint8 , USER_CODE, CLASS_NAME, DIM); break; \
89 case MLint16Type: DIM_INST(MLint16 , MLint16 , MLint16 , MLint16 , USER_CODE, CLASS_NAME, DIM); break; \
90 case MLuint16Type: DIM_INST(MLuint16 , MLuint16 , MLuint16 , MLuint16 , USER_CODE, CLASS_NAME, DIM); break; \
91 case MLint32Type: DIM_INST(MLint32 , MLint32 , MLint32 , MLint32 , USER_CODE, CLASS_NAME, DIM); break; \
92 case MLuint32Type: DIM_INST(MLuint32 , MLuint32 , MLuint32 , MLuint32 , USER_CODE, CLASS_NAME, DIM); break; \
93 case MLfloatType: DIM_INST(MLfloat , MLfloat , MLfloat , MLfloat , USER_CODE, CLASS_NAME, DIM); break; \
94 case MLdoubleType: DIM_INST(MLdouble , MLdouble , MLdouble , MLdouble , USER_CODE, CLASS_NAME, DIM); break; \
99 ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DATA_TYPE, \
100 "Type case not executed(_ML_IMPLEMENT_ALL_ITK_CASES).", \
101 "DATATYPE_ENUM=", DATATYPE_ENUM, \
110 #define ML_IMPLEMENT_ALL_ITK_2D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
111 _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_2D_CODE)
116 #define ML_IMPLEMENT_ALL_ITK_3D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
117 _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_3D_CODE)
122 #define ML_IMPLEMENT_ALL_ITK_2D3D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
123 _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_2D3D_CODE)
128 #define ML_IMPLEMENT_ALL_ITK_6D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
129 _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_6D_CODE)
135 #define _TEMPLATE_INPUTS0 OutImageType
136 #define _TEMPLATE_INPUTS1 InImageType,OutImageType
137 #define _TEMPLATE_INPUTS2 InImageType,InImageType,OutImageType
138 #define _TEMPLATE_INPUTS3 InImageType,InImageType,InImageType,OutImageType
139 #define _TEMPLATE_INPUTS4 InImageType,InImageType,InImageType,InImageType,OutImageType
140 #define _TEMPLATE_INPUTS5 InImageType,InImageType,InImageType,InImageType,InImageType,OutImageType
149 #define _WRAPPER_DETERMINE_IN_REGION1_CPP(CLASS_NAME) \
157 #define _ML_CALL_CALCOUTSUBIMAGE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
159 reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
160 ->calcOutSubImageT(*outSubImg, outIndex, inSubImgs); \
177 #define _ML_CREATE_ITK_FILTER(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
178 reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
179 ->_createITKFilterT();
193 #define _ML_DESTROY_ITK_FILTER(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
194 reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
195 ->_destroyITKFilterT();
209 #define _ML_DETERMINE_ITK_IN_REGION(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, _DIM, CLASS_NAME) \
210 return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, _DIM>*>(this) \
211 ->_determineInRegionT(inIndex, outBox, outIndex, numActiveInputs);
226 #define _ML_DETERMINE_ITK_OUT_IMAGE_REGION(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
227 return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
228 ->_getOutImageRegionT(numImageInputs);
242 #define _ML_SET_FILTER_PARAMETERS(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
243 return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
244 ->_setFilterParametersT();
258 #define _ML_GET_FILTER_PARAMETERS(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
259 return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
260 ->_getFilterParametersT();
267 #define _ML_ITK_DETERMINE_IN_REGION_0(CLASS_NAME, NAMESPACE) \
268 SubImageBox _determineInRegionT(MLint , const SubImageBox &, MLint , MLint ) \
270 return SubImageBox(); \
279 #define _ML_ITK_DETERMINE_IN_REGION_N(CLASS_NAME, NAMESPACE) \
280 SubImageBox _determineInRegionT(MLint inIndex, const SubImageBox &outBox, MLint outIndex, MLint numActiveInputs) \
282 typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr()); \
283 return determineImageFilterInRegionTN<FilterType, InImageType> \
284 (filter, *this, inIndex, outBox, outIndex, numActiveInputs); \
293 #define _ML_ITK_DETERMINE_OUT_REGION_0(CLASS_NAME, NAMESPACE) \
294 SubImageBox _getOutImageRegionT(int ) \
296 typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr());\
297 return determineImageFilterOutImageRegionT0<FilterType, OutImageType> \
305 #define _ML_ITK_DETERMINE_OUT_REGION_N(CLASS_NAME, NAMESPACE) \
306 SubImageBox _getOutImageRegionT(int numImageInputs) \
308 typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr());\
309 return determineImageFilterOutImageRegionTN<FilterType, OutImageType, InImageType> \
310 (filter, *this, numImageInputs); \
322 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_0(CLASS_NAME, NAMESPACE) \
323 typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS0> FilterType; \
326 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_1(CLASS_NAME, NAMESPACE) \
327 typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS1> FilterType; \
330 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_2(CLASS_NAME, NAMESPACE) \
331 typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS2> FilterType; \
334 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_3(CLASS_NAME, NAMESPACE) \
335 typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS3> FilterType; \
352 #define _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, DET_IN_REGION, WRAPPER_TYPEDEFS, CREATOR_SWITCH, DET_OUT_REGION) \
355 template <typename ML_OUTDATATYPE, typename ITK_OUTDATATYPE, \
356 typename ML_INDATATYPE, typename ITK_INDATATYPE, unsigned int DIM> \
357 class CLASS_NAME##Wrapper : public PROJECT_PREFIX##CLASS_NAME \
359 friend class PROJECT_PREFIX##CLASS_NAME; \
364 typedef itk::Image<ITK_INDATATYPE,DIM> InImageType; \
369 typedef ITK_INDATATYPE InPixelType; \
374 typedef itk::Image<ITK_OUTDATATYPE,DIM> OutImageType; \
379 typedef ITK_OUTDATATYPE OutPixelType; \
384 WRAPPER_TYPEDEFS(CLASS_NAME, NAMESPACE) \
389 void _createITKFilterT() \
393 _itkObj = new TypedObjectHolderT<FilterType>(); \
400 void _destroyITKFilterT() \
402 delete _itkObj; _itkObj = nullptr; \
409 DET_IN_REGION(CLASS_NAME, NAMESPACE) \
414 DET_OUT_REGION(CLASS_NAME, NAMESPACE) \
419 MLErrorCode _setFilterParametersT(); \
424 MLErrorCode _getFilterParametersT(); \
429 void calcOutSubImageT(SubImage &outSubImg, \
431 SubImage *inSubImgs); \
440 CLASS_NAME##Wrapper(); \
442 ~CLASS_NAME##Wrapper(); \
444 CLASS_NAME##Wrapper(const CLASS_NAME##Wrapper &); \
446 CLASS_NAME##Wrapper operator=(const CLASS_NAME##Wrapper &); \
454 void PROJECT_PREFIX##CLASS_NAME::calculateOutputSubImage(SubImage *outSubImg, \
456 SubImage *inSubImgs) \
459 CREATOR_SWITCH("calculateOutputSubImage()", \
460 _ML_CALL_CALCOUTSUBIMAGE, \
461 CLASS_NAME, _m_PixelType, _m_Dimension); \
474 void PROJECT_PREFIX##CLASS_NAME::_createITKFilter(MLDataType dataType, MLint dim)\
477 _destroyITKFilter(); \
480 _m_PixelType = dataType; \
481 _m_Dimension = dim; \
486 CREATOR_SWITCH("_createITKFilter()", \
487 _ML_CREATE_ITK_FILTER, \
488 CLASS_NAME, _m_PixelType, _m_Dimension); \
490 ML_CATCH_BLOCK(...) \
492 ML_ITK_ML_PRINT_ERROR("_createITKFilter()", \
493 ML_UNKNOWN_EXCEPTION, "Filter not created.", \
494 "_m_PixelType=", _m_PixelType, \
495 "_m_Dimension=", _m_Dimension); \
512 void PROJECT_PREFIX##CLASS_NAME::_destroyITKFilter() \
515 if (!_itkObj || (_m_Dimension < 1) || \
516 (ML_INVALID_DATA_TYPE == _m_PixelType)){ return; } \
520 CREATOR_SWITCH("_destroyITKFilter()", \
521 _ML_DESTROY_ITK_FILTER, \
522 CLASS_NAME, _m_PixelType, _m_Dimension); \
524 ML_CATCH_BLOCK(...) \
526 ML_ITK_ML_PRINT_ERROR("_destroyITKFilter()", \
527 ML_UNKNOWN_EXCEPTION, "Filter destruction failed.", \
528 "_m_PixelType=", _m_PixelType, \
529 "_m_Dimension=", _m_Dimension); \
549 SubImageBox PROJECT_PREFIX##CLASS_NAME::_determineInRegion(MLint inIndex, \
550 const SubImageBox &outBox,\
552 MLint numActiveInputs) \
557 CREATOR_SWITCH("_determineInRegion()", \
558 _ML_DETERMINE_ITK_IN_REGION, \
559 CLASS_NAME, _m_PixelType, _m_Dimension); \
561 ML_CATCH_BLOCK(...) \
563 ML_ITK_ML_PRINT_ERROR("_determineInRegion()", \
564 ML_UNKNOWN_EXCEPTION, "InRegion calculation failed.", \
565 "inIndex=", inIndex, \
566 "outIndex=", outIndex, \
567 "_m_PixelType=", _m_PixelType, \
568 "_m_Dimension=", _m_Dimension); \
570 return SubImageBox();
\
583 SubImageBox PROJECT_PREFIX##CLASS_NAME::_getOutImageRegion(int numImageInputs) \
588 CREATOR_SWITCH("_getOutImageRegion()", \
589 _ML_DETERMINE_ITK_OUT_IMAGE_REGION, \
590 CLASS_NAME, _m_PixelType, _m_Dimension); \
592 ML_CATCH_BLOCK(...) \
594 ML_ITK_ML_PRINT_ERROR("_getOutImageRegion()", \
595 ML_UNKNOWN_EXCEPTION, "OutRegion calculation failed.", \
596 "numImageInputs=", numImageInputs, \
597 "_m_PixelType=", _m_PixelType, \
598 "_m_Dimension=", _m_Dimension); \
600 return SubImageBox();
\
607 MLErrorCode PROJECT_PREFIX##CLASS_NAME::_setFilterParameters() \
609 MLErrorCode retCode = ML_RESULT_OK; \
614 CREATOR_SWITCH("_setFilterParameters()", \
615 _ML_SET_FILTER_PARAMETERS, \
616 CLASS_NAME, _m_PixelType, _m_Dimension); \
618 ML_CATCH_BLOCK(...) \
620 ML_PRINT_ERROR("_setFilterParameters())", \
621 ML_UNKNOWN_EXCEPTION, "Returning empty box."); \
622 retCode = ML_UNKNOWN_EXCEPTION; \
632 MLErrorCode PROJECT_PREFIX##CLASS_NAME::_getFilterParameters() \
634 MLErrorCode retCode = ML_RESULT_OK; \
639 CREATOR_SWITCH("_getFilterParameters()", \
640 _ML_GET_FILTER_PARAMETERS, \
641 CLASS_NAME, _m_PixelType, _m_Dimension); \
643 ML_CATCH_BLOCK(...) \
645 ML_PRINT_ERROR("_getFilterParameters())", \
646 ML_UNKNOWN_EXCEPTION, "Parameter no or only partially read.");\
647 retCode = ML_UNKNOWN_EXCEPTION; \