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); \
86 #define _ML_INSTANTIATE_6D_SAME_DIM_CODE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, USER_CODE2, \
92 if constexpr (MLINDATATYPE::Size == 2) { \
93 USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 2, CLASS_NAME); \
95 ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DATA_TYPE, "Voxel type dimension must match image dimension"); \
98 if constexpr (MLINDATATYPE::Size == 3) { \
99 USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 3, CLASS_NAME); \
101 ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DATA_TYPE, "Voxel type dimension must match image dimension"); \
106 if constexpr (MLINDATATYPE::Size == 6) { \
107 USER_CODE2(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, 6, CLASS_NAME); \
109 ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DATA_TYPE, "Voxel type dimension must match image dimension"); \
112 ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DIMENSION, "Ignoring case(_ML_INSTANTIATE_6D_SAME_DIM_CODE).", "DIM=", DIM); \
119 #define _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, DIM_INST)\
120 switch(DATATYPE_ENUM){ \
121 case MLint8Type: DIM_INST(MLint8 , MLint8 , MLint8 , MLint8 , USER_CODE, CLASS_NAME, DIM); break; \
122 case MLuint8Type: DIM_INST(MLuint8 , MLuint8 , MLuint8 , MLuint8 , USER_CODE, CLASS_NAME, DIM); break; \
123 case MLint16Type: DIM_INST(MLint16 , MLint16 , MLint16 , MLint16 , USER_CODE, CLASS_NAME, DIM); break; \
124 case MLuint16Type: DIM_INST(MLuint16 , MLuint16 , MLuint16 , MLuint16 , USER_CODE, CLASS_NAME, DIM); break; \
125 case MLint32Type: DIM_INST(MLint32 , MLint32 , MLint32 , MLint32 , USER_CODE, CLASS_NAME, DIM); break; \
126 case MLuint32Type: DIM_INST(MLuint32 , MLuint32 , MLuint32 , MLuint32 , USER_CODE, CLASS_NAME, DIM); break; \
127 case MLfloatType: DIM_INST(MLfloat , MLfloat , MLfloat , MLfloat , USER_CODE, CLASS_NAME, DIM); break; \
128 case MLdoubleType: DIM_INST(MLdouble , MLdouble , MLdouble , MLdouble , USER_CODE, CLASS_NAME, DIM); break; \
133 ML_ITK_ML_PRINT_ERROR(#CLASS_NAME, ML_BAD_DATA_TYPE, \
134 "Type case not executed(_ML_IMPLEMENT_ALL_ITK_CASES).", \
135 "DATATYPE_ENUM=", DATATYPE_ENUM, \
144 #define ML_IMPLEMENT_ALL_ITK_2D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
145 _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_2D_CODE)
150 #define ML_IMPLEMENT_ALL_ITK_3D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
151 _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_3D_CODE)
156 #define ML_IMPLEMENT_ALL_ITK_2D3D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
157 _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_2D3D_CODE)
162 #define ML_IMPLEMENT_ALL_ITK_6D_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM)\
163 _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_6D_CODE)
168 #define ML_IMPLEMENT_ALL_ITK_6D_SAME_DIM_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM) \
169 _ML_IMPLEMENT_ALL_ITK_CASES(INFO_STRING, USER_CODE, CLASS_NAME, DATATYPE_ENUM, DIM, _ML_INSTANTIATE_6D_SAME_DIM_CODE)
175 #define _TEMPLATE_INPUTS0 OutImageType
176 #define _TEMPLATE_INPUTS1 InImageType,OutImageType
177 #define _TEMPLATE_INPUTS2 InImageType,InImageType,OutImageType
178 #define _TEMPLATE_INPUTS3 InImageType,InImageType,InImageType,OutImageType
179 #define _TEMPLATE_INPUTS4 InImageType,InImageType,InImageType,InImageType,OutImageType
180 #define _TEMPLATE_INPUTS5 InImageType,InImageType,InImageType,InImageType,InImageType,OutImageType
189 #define _WRAPPER_DETERMINE_IN_REGION1_CPP(CLASS_NAME) \
197 #define _ML_CALL_CALCOUTSUBIMAGE(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
199 reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
200 ->calcOutSubImageT(*outSubImg, outIndex, inSubImgs); \
217 #define _ML_CREATE_ITK_FILTER(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
218 reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
219 ->_createITKFilterT();
233 #define _ML_DESTROY_ITK_FILTER(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
234 reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
235 ->_destroyITKFilterT();
249 #define _ML_DETERMINE_ITK_IN_REGION(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, _DIM, CLASS_NAME) \
250 return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, _DIM>*>(this) \
251 ->_determineInRegionT(inIndex, outBox, outIndex, numActiveInputs);
266 #define _ML_DETERMINE_ITK_OUT_IMAGE_REGION(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
267 return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
268 ->_getOutImageRegionT(numImageInputs);
282 #define _ML_SET_FILTER_PARAMETERS(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
283 return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
284 ->_setFilterParametersT();
298 #define _ML_GET_FILTER_PARAMETERS(MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM, CLASS_NAME) \
299 return reinterpret_cast<CLASS_NAME##Wrapper<MLOUTDATATYPE, ITKOUTDATATYPE, MLINDATATYPE, ITKINDATATYPE, DIM>*>(this) \
300 ->_getFilterParametersT();
307 #define _ML_ITK_DETERMINE_IN_REGION_0(CLASS_NAME, NAMESPACE) \
308 SubImageBox _determineInRegionT(MLint , const SubImageBox &, MLint , MLint ) \
310 return SubImageBox(); \
319 #define _ML_ITK_DETERMINE_IN_REGION_N(CLASS_NAME, NAMESPACE) \
320 SubImageBox _determineInRegionT(MLint inIndex, const SubImageBox &outBox, MLint outIndex, MLint numActiveInputs) \
322 typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr()); \
323 return determineImageFilterInRegionTN<FilterType, InImageType> \
324 (filter, *this, inIndex, outBox, outIndex, numActiveInputs); \
333 #define _ML_ITK_DETERMINE_OUT_REGION_0(CLASS_NAME, NAMESPACE) \
334 SubImageBox _getOutImageRegionT(int ) \
336 typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr());\
337 return determineImageFilterOutImageRegionT0<FilterType, OutImageType> \
345 #define _ML_ITK_DETERMINE_OUT_REGION_N(CLASS_NAME, NAMESPACE) \
346 SubImageBox _getOutImageRegionT(int numImageInputs) \
348 typename FilterType::Pointer filter = static_cast<FilterType*>(_itkObj->voidFilterPtr());\
349 return determineImageFilterOutImageRegionTN<FilterType, OutImageType, InImageType> \
350 (filter, *this, numImageInputs); \
362 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_0(CLASS_NAME, NAMESPACE) \
363 typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS0> FilterType; \
366 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_1(CLASS_NAME, NAMESPACE) \
367 typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS1> FilterType; \
370 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_2(CLASS_NAME, NAMESPACE) \
371 typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS2> FilterType; \
374 #define ML_ITK_DEFAULT_WRAPPER_TYPEDEFS_3(CLASS_NAME, NAMESPACE) \
375 typedef NAMESPACE::CLASS_NAME<_TEMPLATE_INPUTS3> FilterType; \
392 #define _ML_ITK_WRAPPER(PROJECT_PREFIX, CLASS_NAME, NAMESPACE, DET_IN_REGION, WRAPPER_TYPEDEFS, CREATOR_SWITCH, DET_OUT_REGION) \
395 template <typename ML_OUTDATATYPE, typename ITK_OUTDATATYPE, \
396 typename ML_INDATATYPE, typename ITK_INDATATYPE, unsigned int DIM> \
397 class CLASS_NAME##Wrapper : public PROJECT_PREFIX##CLASS_NAME \
399 friend class PROJECT_PREFIX##CLASS_NAME; \
404 typedef itk::Image<ITK_INDATATYPE,DIM> InImageType; \
409 typedef ITK_INDATATYPE InPixelType; \
414 typedef itk::Image<ITK_OUTDATATYPE,DIM> OutImageType; \
419 typedef ITK_OUTDATATYPE OutPixelType; \
424 WRAPPER_TYPEDEFS(CLASS_NAME, NAMESPACE) \
429 void _createITKFilterT() \
433 _itkObj = new TypedObjectHolderT<FilterType>(); \
440 void _destroyITKFilterT() \
442 delete _itkObj; _itkObj = nullptr; \
449 DET_IN_REGION(CLASS_NAME, NAMESPACE) \
454 DET_OUT_REGION(CLASS_NAME, NAMESPACE) \
459 MLErrorCode _setFilterParametersT(); \
464 MLErrorCode _getFilterParametersT(); \
469 void calcOutSubImageT(SubImage &outSubImg, \
471 SubImage *inSubImgs); \
480 CLASS_NAME##Wrapper(); \
482 ~CLASS_NAME##Wrapper(); \
484 CLASS_NAME##Wrapper(const CLASS_NAME##Wrapper &); \
486 CLASS_NAME##Wrapper operator=(const CLASS_NAME##Wrapper &); \
494 void PROJECT_PREFIX##CLASS_NAME::calculateOutputSubImage(SubImage *outSubImg, \
496 SubImage *inSubImgs) \
499 CREATOR_SWITCH("calculateOutputSubImage()", \
500 _ML_CALL_CALCOUTSUBIMAGE, \
501 CLASS_NAME, _m_PixelType, _m_Dimension); \
514 void PROJECT_PREFIX##CLASS_NAME::_createITKFilter(MLDataType dataType, MLint dim)\
517 _destroyITKFilter(); \
520 _m_PixelType = dataType; \
521 _m_Dimension = dim; \
526 CREATOR_SWITCH("_createITKFilter()", \
527 _ML_CREATE_ITK_FILTER, \
528 CLASS_NAME, _m_PixelType, _m_Dimension); \
530 ML_CATCH_BLOCK(...) \
532 ML_ITK_ML_PRINT_ERROR("_createITKFilter()", \
533 ML_UNKNOWN_EXCEPTION, "Filter not created.", \
534 "_m_PixelType=", _m_PixelType, \
535 "_m_Dimension=", _m_Dimension); \
552 void PROJECT_PREFIX##CLASS_NAME::_destroyITKFilter() \
555 if (!_itkObj || (_m_Dimension < 1) || \
556 (ML_INVALID_DATA_TYPE == _m_PixelType)){ return; } \
560 CREATOR_SWITCH("_destroyITKFilter()", \
561 _ML_DESTROY_ITK_FILTER, \
562 CLASS_NAME, _m_PixelType, _m_Dimension); \
564 ML_CATCH_BLOCK(...) \
566 ML_ITK_ML_PRINT_ERROR("_destroyITKFilter()", \
567 ML_UNKNOWN_EXCEPTION, "Filter destruction failed.", \
568 "_m_PixelType=", _m_PixelType, \
569 "_m_Dimension=", _m_Dimension); \
589 SubImageBox PROJECT_PREFIX##CLASS_NAME::_determineInRegion(MLint inIndex, \
590 const SubImageBox &outBox,\
592 MLint numActiveInputs) \
597 CREATOR_SWITCH("_determineInRegion()", \
598 _ML_DETERMINE_ITK_IN_REGION, \
599 CLASS_NAME, _m_PixelType, _m_Dimension); \
601 ML_CATCH_BLOCK(...) \
603 ML_ITK_ML_PRINT_ERROR("_determineInRegion()", \
604 ML_UNKNOWN_EXCEPTION, "InRegion calculation failed.", \
605 "inIndex=", inIndex, \
606 "outIndex=", outIndex, \
607 "_m_PixelType=", _m_PixelType, \
608 "_m_Dimension=", _m_Dimension); \
610 return SubImageBox();
\
623 SubImageBox PROJECT_PREFIX##CLASS_NAME::_getOutImageRegion(int numImageInputs) \
628 CREATOR_SWITCH("_getOutImageRegion()", \
629 _ML_DETERMINE_ITK_OUT_IMAGE_REGION, \
630 CLASS_NAME, _m_PixelType, _m_Dimension); \
632 ML_CATCH_BLOCK(...) \
634 ML_ITK_ML_PRINT_ERROR("_getOutImageRegion()", \
635 ML_UNKNOWN_EXCEPTION, "OutRegion calculation failed.", \
636 "numImageInputs=", numImageInputs, \
637 "_m_PixelType=", _m_PixelType, \
638 "_m_Dimension=", _m_Dimension); \
640 return SubImageBox();
\
647 MLErrorCode PROJECT_PREFIX##CLASS_NAME::_setFilterParameters() \
649 MLErrorCode retCode = ML_RESULT_OK; \
654 CREATOR_SWITCH("_setFilterParameters()", \
655 _ML_SET_FILTER_PARAMETERS, \
656 CLASS_NAME, _m_PixelType, _m_Dimension); \
658 ML_CATCH_BLOCK(...) \
660 ML_PRINT_ERROR("_setFilterParameters())", \
661 ML_UNKNOWN_EXCEPTION, "Returning empty box."); \
662 retCode = ML_UNKNOWN_EXCEPTION; \
672 MLErrorCode PROJECT_PREFIX##CLASS_NAME::_getFilterParameters() \
674 MLErrorCode retCode = ML_RESULT_OK; \
679 CREATOR_SWITCH("_getFilterParameters()", \
680 _ML_GET_FILTER_PARAMETERS, \
681 CLASS_NAME, _m_PixelType, _m_Dimension); \
683 ML_CATCH_BLOCK(...) \
685 ML_PRINT_ERROR("_getFilterParameters())", \
686 ML_UNKNOWN_EXCEPTION, "Parameter no or only partially read.");\
687 retCode = ML_UNKNOWN_EXCEPTION; \