13 #ifndef ML_TYPED_HANDLERS_H
14 #define ML_TYPED_HANDLERS_H
25 #define MLCarrierForType(TYPE) TYPE
26 #define MLCarrierInForType(TYPE) TYPE
30 #pragma deprecated("MLCarrierForType")
31 #pragma deprecated("MLCarrierInForType")
44 #define ML_N_INPUTS 0x4000
47 #define _ML_SWITCH_SELECT_OFFSET 32768
50 #define _ML_OUTPUTINDEX -1
96 #ifndef DOXYGEN_SHOULD_SKIP_THIS
101 template <
int select,
typename Types>
102 struct SwitchOrFixedTypeSelector {
108 template <
typename Types>
110 typedef typename Types::T0
Type;
111 typedef TSubImage<Type> SubImageType;
113 template <
typename Types>
115 typedef typename Types::T1
Type;
116 typedef TSubImage<Type> SubImageType;
118 template <
typename Types>
120 typedef typename Types::T2
Type;
121 typedef TSubImage<Type> SubImageType;
123 template <
typename Types>
125 typedef typename Types::T3
Type;
126 typedef TSubImage<Type> SubImageType;
128 template <
typename Types>
131 typedef SubImage SubImageType;
137 template <
int shouldBeConst,
typename InType>
138 struct ConstTypeSelector {};
141 template <
typename InType>
142 struct ConstTypeSelector<0, InType> {
typedef InType
Type; };
143 template <
typename InType>
144 struct ConstTypeSelector<1, InType> {
typedef const InType
Type; };
150 class InputImagesCount {
160 struct CalculateOutputSubImageArguments {
162 CalculateOutputSubImageArguments() {
165 userThreadData =
nullptr;
169 CalculateOutputSubImageArguments(SubImage* outImage, SubImage* inImages, UserThreadData* threadData) {
172 userThreadData = threadData;
178 UserThreadData* userThreadData;
179 int variableDataType[4];
185 template<
typename InT0,
typename InT1,
typename InT2,
typename InT3>
197 typedef TypeTuple4<EmptyType, EmptyType, EmptyType, EmptyType> EmptyTypeTuple4;
201 template <
int position,
typename T,
typename Tuple>
202 struct TypeTuple4Insert {};
205 template <
typename T,
typename Tuple>
206 struct TypeTuple4Insert<0,
T, Tuple> {
207 typedef TypeTuple4<T, T, T, T>
Type;
209 template <
typename T,
typename Tuple>
210 struct TypeTuple4Insert<1,
T, Tuple> {
211 typedef TypeTuple4<typename Tuple::T0, T, T, T>
Type;
213 template <
typename T,
typename Tuple>
214 struct TypeTuple4Insert<2,
T, Tuple> {
215 typedef TypeTuple4<typename Tuple::T0, typename Tuple::T1, T, T>
Type;
217 template <
typename T,
typename Tuple>
218 struct TypeTuple4Insert<3,
T, Tuple> {
219 typedef TypeTuple4<typename Tuple::T0, typename Tuple::T1, typename Tuple::T2, T>
Type;
224 #ifndef DOXYGEN_SHOULD_SKIP_THIS
228 MLEXPORT void setupKnownPagedImgProperties(PagedImage* outImg,
int templateNumImages,
int outputType,
const int inputTypes[10],
const int inputReadOnly[10],
int numVariableTypes,
const int variableTypes[4]);
232 MLEXPORT void verifyPagedImgProperties(PagedImage* outImg,
int templateNumImages,
int outputType,
const int inputTypes[10],
const int inputReadOnly[10],
int numVariableTypes,
const int variableTypes[4],
int resultDataTypes[4]);
243 template<
class BaseClass,
class Derived,
int NumberOfInputImages>
262 InputSubImage0_ReadOnly =
true,
263 InputSubImage1_ReadOnly =
true,
264 InputSubImage2_ReadOnly =
true,
265 InputSubImage3_ReadOnly =
true,
266 InputSubImage4_ReadOnly =
true,
267 InputSubImage5_ReadOnly =
true,
268 InputSubImage6_ReadOnly =
true,
269 InputSubImage7_ReadOnly =
true,
270 InputSubImage8_ReadOnly =
true,
271 InputSubImage9_ReadOnly =
true,
275 setupVariableTypes(_variableTypeIndex);
280 int _variableTypeIndex[4];
283 static void setupVariableTypes(
int variableTypeIndex[4]) {
284 const int inputTypes[10] = {
285 Derived::InputSubImage0_Type, Derived::InputSubImage1_Type, Derived::InputSubImage2_Type, Derived::InputSubImage3_Type, Derived::InputSubImage4_Type,
286 Derived::InputSubImage5_Type, Derived::InputSubImage6_Type, Derived::InputSubImage7_Type, Derived::InputSubImage8_Type, Derived::InputSubImage9_Type };
287 for (
int i=0;i<Derived::getNumVariableTypes();i++) {
295 const int numInputs = (NumberOfInputImages==
ML_N_INPUTS)?1:NumberOfInputImages;
296 for (
int j=0;j<numInputs;j++) {
298 variableTypeIndex[i] = j;
311 CalculateOutputSubImageArguments args(outImg, inImgs, userThreadData);
314 for (
int i=0; i<Derived::getNumVariableTypes(); i++) {
315 args.variableDataType[i] = (_variableTypeIndex[i] ==
_ML_OUTPUTINDEX) ?
316 args.outImg->getDataType() : args.inImgs[_variableTypeIndex[i]].getDataType();
320 static_cast<Derived*
>(
this)->doSwitching(args);
323 #ifndef DOXYGEN_SHOULD_SKIP_THIS
325 template<
typename Types>
326 void helperCalculateOutputSubImage(
const CalculateOutputSubImageArguments& args) {
328 helperCalculateOutputSubImage<Types>(args,
static_cast<InputImagesCount<NumberOfInputImages>*
>(
nullptr));
331 template<
typename Types>
332 void helperCalculateOutputSubImage(
const CalculateOutputSubImageArguments& args, InputImagesCount<ML_N_INPUTS>*) {
336 typedef typename ConstTypeSelector<Derived::InputSubImage0_ReadOnly, TSubImage<INTYPE0> >
::Type INTSUBIMG0;
338 INTSUBIMG0* inTSubImgs = tsubimage_cast<INTYPE0>(args.inImgs);
339 static_cast<Derived*
>(
this)->typedCalculateOutputSubImage(outTSubImg, inTSubImgs, args.userThreadData);
342 template<
typename Types>
343 void helperCalculateOutputSubImage(
const CalculateOutputSubImageArguments& args, InputImagesCount<0>*) {
344 typedef typename SwitchOrFixedTypeSelector<Derived::OutputSubImage_Type, Types>::SubImageType OUTIMAGETYPE;
345 OUTIMAGETYPE outTSubImg(*args.outImg);
346 static_cast<Derived*
>(
this)->typedCalculateOutputSubImage(outTSubImg, args.userThreadData);
349 template<
typename Types>
350 void helperCalculateOutputSubImage(
const CalculateOutputSubImageArguments& args, InputImagesCount<1>*) {
351 typedef typename SwitchOrFixedTypeSelector<Derived::OutputSubImage_Type, Types>::SubImageType OUTIMAGETYPE;
352 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage0_Type, Types>::SubImageType INIMAGETYPE0;
353 OUTIMAGETYPE outTSubImg(*args.outImg);
355 static_cast<Derived*
>(
this)->typedCalculateOutputSubImage(outTSubImg, inTSubImg0, args.userThreadData);
358 template<
typename Types>
359 void helperCalculateOutputSubImage(
const CalculateOutputSubImageArguments& args, InputImagesCount<2>*) {
360 typedef typename SwitchOrFixedTypeSelector<Derived::OutputSubImage_Type, Types>::SubImageType OUTIMAGETYPE;
361 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage0_Type, Types>::SubImageType INIMAGETYPE0;
362 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage1_Type, Types>::SubImageType INIMAGETYPE1;
363 OUTIMAGETYPE outTSubImg(*args.outImg);
366 static_cast<Derived*
>(
this)->typedCalculateOutputSubImage(outTSubImg, inTSubImg0, inTSubImg1, args.userThreadData);
369 template<
typename Types>
370 void helperCalculateOutputSubImage(
const CalculateOutputSubImageArguments& args, InputImagesCount<3>*) {
371 typedef typename SwitchOrFixedTypeSelector<Derived::OutputSubImage_Type, Types>::SubImageType OUTIMAGETYPE;
372 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage0_Type, Types>::SubImageType INIMAGETYPE0;
373 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage1_Type, Types>::SubImageType INIMAGETYPE1;
374 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage2_Type, Types>::SubImageType INIMAGETYPE2;
375 OUTIMAGETYPE outTSubImg(*args.outImg);
379 static_cast<Derived*
>(
this)->typedCalculateOutputSubImage(outTSubImg, inTSubImg0, inTSubImg1, inTSubImg2, args.userThreadData);
382 template<
typename Types>
383 void helperCalculateOutputSubImage(
const CalculateOutputSubImageArguments& args, InputImagesCount<4>*) {
384 typedef typename SwitchOrFixedTypeSelector<Derived::OutputSubImage_Type, Types>::SubImageType OUTIMAGETYPE;
385 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage0_Type, Types>::SubImageType INIMAGETYPE0;
386 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage1_Type, Types>::SubImageType INIMAGETYPE1;
387 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage2_Type, Types>::SubImageType INIMAGETYPE2;
388 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage3_Type, Types>::SubImageType INIMAGETYPE3;
389 OUTIMAGETYPE outTSubImg(*args.outImg);
394 static_cast<Derived*
>(
this)->typedCalculateOutputSubImage(outTSubImg, inTSubImg0, inTSubImg1, inTSubImg2, inTSubImg3, args.userThreadData);
397 template<
typename Types>
398 void helperCalculateOutputSubImage(
const CalculateOutputSubImageArguments& args, InputImagesCount<5>*) {
399 typedef typename SwitchOrFixedTypeSelector<Derived::OutputSubImage_Type, Types>::SubImageType OUTIMAGETYPE;
400 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage0_Type, Types>::SubImageType INIMAGETYPE0;
401 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage1_Type, Types>::SubImageType INIMAGETYPE1;
402 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage2_Type, Types>::SubImageType INIMAGETYPE2;
403 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage3_Type, Types>::SubImageType INIMAGETYPE3;
404 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage4_Type, Types>::SubImageType INIMAGETYPE4;
405 OUTIMAGETYPE outTSubImg(*args.outImg);
411 static_cast<Derived*
>(
this)->typedCalculateOutputSubImage(outTSubImg, inTSubImg0, inTSubImg1, inTSubImg2, inTSubImg3, inTSubImg4, args.userThreadData);
414 template<
typename Types>
415 void helperCalculateOutputSubImage(
const CalculateOutputSubImageArguments& args, InputImagesCount<6>*) {
416 typedef typename SwitchOrFixedTypeSelector<Derived::OutputSubImage_Type, Types>::SubImageType OUTIMAGETYPE;
417 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage0_Type, Types>::SubImageType INIMAGETYPE0;
418 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage1_Type, Types>::SubImageType INIMAGETYPE1;
419 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage2_Type, Types>::SubImageType INIMAGETYPE2;
420 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage3_Type, Types>::SubImageType INIMAGETYPE3;
421 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage4_Type, Types>::SubImageType INIMAGETYPE4;
422 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage5_Type, Types>::SubImageType INIMAGETYPE5;
423 OUTIMAGETYPE outTSubImg(*args.outImg);
430 static_cast<Derived*
>(
this)->typedCalculateOutputSubImage(outTSubImg, inTSubImg0, inTSubImg1, inTSubImg2, inTSubImg3, inTSubImg4, inTSubImg5, args.userThreadData);
433 template<
typename Types>
434 void helperCalculateOutputSubImage(
const CalculateOutputSubImageArguments& args, InputImagesCount<7>*) {
435 typedef typename SwitchOrFixedTypeSelector<Derived::OutputSubImage_Type, Types>::SubImageType OUTIMAGETYPE;
436 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage0_Type, Types>::SubImageType INIMAGETYPE0;
437 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage1_Type, Types>::SubImageType INIMAGETYPE1;
438 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage2_Type, Types>::SubImageType INIMAGETYPE2;
439 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage3_Type, Types>::SubImageType INIMAGETYPE3;
440 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage4_Type, Types>::SubImageType INIMAGETYPE4;
441 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage5_Type, Types>::SubImageType INIMAGETYPE5;
442 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage6_Type, Types>::SubImageType INIMAGETYPE6;
443 OUTIMAGETYPE outTSubImg(*args.outImg);
451 static_cast<Derived*
>(
this)->typedCalculateOutputSubImage(outTSubImg, inTSubImg0, inTSubImg1, inTSubImg2, inTSubImg3, inTSubImg4, inTSubImg5, inTSubImg6, args.userThreadData);
454 template<
typename Types>
455 void helperCalculateOutputSubImage(
const CalculateOutputSubImageArguments& args, InputImagesCount<8>*) {
456 typedef typename SwitchOrFixedTypeSelector<Derived::OutputSubImage_Type, Types>::SubImageType OUTIMAGETYPE;
457 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage0_Type, Types>::SubImageType INIMAGETYPE0;
458 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage1_Type, Types>::SubImageType INIMAGETYPE1;
459 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage2_Type, Types>::SubImageType INIMAGETYPE2;
460 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage3_Type, Types>::SubImageType INIMAGETYPE3;
461 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage4_Type, Types>::SubImageType INIMAGETYPE4;
462 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage5_Type, Types>::SubImageType INIMAGETYPE5;
463 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage6_Type, Types>::SubImageType INIMAGETYPE6;
464 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage7_Type, Types>::SubImageType INIMAGETYPE7;
465 OUTIMAGETYPE outTSubImg(*args.outImg);
474 static_cast<Derived*
>(
this)->typedCalculateOutputSubImage(outTSubImg, inTSubImg0, inTSubImg1, inTSubImg2, inTSubImg3, inTSubImg4, inTSubImg5, inTSubImg6, inTSubImg7, args.userThreadData);
477 template<
typename Types>
478 void helperCalculateOutputSubImage(
const CalculateOutputSubImageArguments& args, InputImagesCount<9>*) {
479 typedef typename SwitchOrFixedTypeSelector<Derived::OutputSubImage_Type, Types>::SubImageType OUTIMAGETYPE;
480 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage0_Type, Types>::SubImageType INIMAGETYPE0;
481 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage1_Type, Types>::SubImageType INIMAGETYPE1;
482 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage2_Type, Types>::SubImageType INIMAGETYPE2;
483 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage3_Type, Types>::SubImageType INIMAGETYPE3;
484 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage4_Type, Types>::SubImageType INIMAGETYPE4;
485 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage5_Type, Types>::SubImageType INIMAGETYPE5;
486 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage6_Type, Types>::SubImageType INIMAGETYPE6;
487 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage7_Type, Types>::SubImageType INIMAGETYPE7;
488 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage8_Type, Types>::SubImageType INIMAGETYPE8;
489 OUTIMAGETYPE outTSubImg(*args.outImg);
499 static_cast<Derived*
>(
this)->typedCalculateOutputSubImage(outTSubImg, inTSubImg0, inTSubImg1, inTSubImg2, inTSubImg3, inTSubImg4, inTSubImg5, inTSubImg6, inTSubImg7, inTSubImg8, args.userThreadData);
502 template<
typename Types>
503 void helperCalculateOutputSubImage(
const CalculateOutputSubImageArguments& args, InputImagesCount<10>*) {
504 typedef typename SwitchOrFixedTypeSelector<Derived::OutputSubImage_Type, Types>::SubImageType OUTIMAGETYPE;
505 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage0_Type, Types>::SubImageType INIMAGETYPE0;
506 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage1_Type, Types>::SubImageType INIMAGETYPE1;
507 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage2_Type, Types>::SubImageType INIMAGETYPE2;
508 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage3_Type, Types>::SubImageType INIMAGETYPE3;
509 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage4_Type, Types>::SubImageType INIMAGETYPE4;
510 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage5_Type, Types>::SubImageType INIMAGETYPE5;
511 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage6_Type, Types>::SubImageType INIMAGETYPE6;
512 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage7_Type, Types>::SubImageType INIMAGETYPE7;
513 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage8_Type, Types>::SubImageType INIMAGETYPE8;
514 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage9_Type, Types>::SubImageType INIMAGETYPE9;
515 OUTIMAGETYPE outTSubImg(*args.outImg);
526 static_cast<Derived*
>(
this)->typedCalculateOutputSubImage(outTSubImg, inTSubImg0, inTSubImg1, inTSubImg2, inTSubImg3, inTSubImg4, inTSubImg5, inTSubImg6, inTSubImg7, inTSubImg8, inTSubImg9, args.userThreadData);
532 #define _ML_COLLECT_ENUMS \
533 const int inputTypes[10] = { \
534 Derived::InputSubImage0_Type, Derived::InputSubImage1_Type, Derived::InputSubImage2_Type, Derived::InputSubImage3_Type, Derived::InputSubImage4_Type, \
535 Derived::InputSubImage5_Type, Derived::InputSubImage6_Type, Derived::InputSubImage7_Type, Derived::InputSubImage8_Type, Derived::InputSubImage9_Type }; \
536 const int inputReadOnly[10] = { \
537 Derived::InputSubImage0_ReadOnly, Derived::InputSubImage1_ReadOnly, Derived::InputSubImage2_ReadOnly, Derived::InputSubImage3_ReadOnly, Derived::InputSubImage4_ReadOnly, \
538 Derived::InputSubImage5_ReadOnly, Derived::InputSubImage6_ReadOnly, Derived::InputSubImage7_ReadOnly, Derived::InputSubImage8_ReadOnly, Derived::InputSubImage9_ReadOnly }; \
539 int variableTypes[4] {}; \
540 setupVariableTypes(variableTypes);
547 setupKnownPagedImgProperties(outImg, NumberOfInputImages, Derived::OutputSubImage_Type, inputTypes, inputReadOnly, Derived::getNumVariableTypes(), variableTypes);
556 int resultDataTypes[4];
557 verifyPagedImgProperties(outImg, NumberOfInputImages, Derived::OutputSubImage_Type, inputTypes, inputReadOnly, Derived::getNumVariableTypes(), variableTypes, resultDataTypes);
559 std::ostringstream errorMessages;
560 for (
int i = 0; i < Derived::getNumVariableTypes(); i++) {
561 if (!Derived::doesVariableTypeSupportDataType(i, resultDataTypes[i])) {
563 errorMessages <<
"Unsupported datatype '" <<
MLNameFromDataType(resultDataTypes[i]) <<
"' at input" << variableTypes[i] <<
" using variable type " << Derived::variableTypeName(i) << std::endl;
565 errorMessages <<
"Unsupported datatype '" <<
MLNameFromDataType(resultDataTypes[i]) <<
"' at output using variable type " << Derived::variableTypeName(i) << std::endl;
569 if (errorMessages.str().size()) {
577 #undef _ML_COLLECT_ENUMS
580 #ifndef DOXYGEN_SHOULD_SKIP_THIS
584 template<
class Derived,
int Step,
class Args >
591 static const char* name() {
return "NoTypes"; }
594 template<
typename PrevTypes,
typename TargetLabelType>
595 bool doSwitchingCode(
int ,
const Args& ,
bool =
true) {
return true; }
601 struct DispatchVariableType1Label {};
602 struct DispatchVariableType2Label {};
603 struct DispatchVariableType3Label {};
604 struct DispatchDoneLabel {};
605 struct DispatchDoNothingLabel {};
609 typedef TypeTuple4<DispatchDoneLabel, DispatchDoneLabel, DispatchDoneLabel, DispatchDoneLabel> JumpTable1;
612 typedef TypeTuple4<DispatchVariableType1Label, DispatchDoneLabel, DispatchDoneLabel, DispatchDoneLabel> JumpTable2;
615 typedef TypeTuple4<DispatchVariableType1Label, DispatchVariableType2Label, DispatchDoneLabel, DispatchDoneLabel> JumpTable3;
618 typedef TypeTuple4<DispatchVariableType1Label, DispatchVariableType2Label, DispatchVariableType3Label, DispatchDoneLabel> JumpTable4;
622 template<
class Derived>
623 class EmptyVariableTypeDispatcher
626 static int getNumVariableTypes() {
return 0; }
627 static bool doesVariableTypeSupportDataType(
int ,
int ) {
return false; }
628 static const char* variableTypeName(
int ) {
return "NoTypes"; }
630 void doSwitching(
const CalculateOutputSubImageArguments& args) {
632 static_cast<Derived*
>(
this)->
template helperCalculateOutputSubImage<EmptyTypeTuple4>(args);
639 template<
class Derived,
class JumpTable,
class VariableType0,
class VariableType1,
class VariableType2,
class VariableType3>
640 class VariableTypeDispatcher :
public VariableType0,
public VariableType1,
public VariableType2,
public VariableType3 {
644 static int getNumVariableTypes() {
645 return (VariableType0::IsEmpty?0:1) + (VariableType1::IsEmpty?0:1) +
646 (VariableType2::IsEmpty?0:1) + (VariableType3::IsEmpty?0:1);
649 static bool doesVariableTypeSupportDataType(
int variableType,
int switchCode) {
650 VariableTypeDispatcher<Derived, JumpTable, VariableType0, VariableType1, VariableType2, VariableType3>
self;
651 CalculateOutputSubImageArguments args;
652 if (variableType == 0) {
653 return static_cast<VariableType0*
>(&
self)->
template doSwitchingCode<EmptyTypeTuple4, DispatchDoNothingLabel>(switchCode, args,
false );
654 }
else if (variableType == 1) {
655 return static_cast<VariableType1*
>(&
self)->
template doSwitchingCode<EmptyTypeTuple4, DispatchDoNothingLabel>(switchCode, args,
false );
656 }
else if (variableType == 2) {
657 return static_cast<VariableType2*
>(&
self)->
template doSwitchingCode<EmptyTypeTuple4, DispatchDoNothingLabel>(switchCode, args,
false );
658 }
else if (variableType == 3) {
659 return static_cast<VariableType3*
>(&
self)->
template doSwitchingCode<EmptyTypeTuple4, DispatchDoNothingLabel>(switchCode, args,
false );
664 static const char* variableTypeName(
int variableType) {
665 if (variableType == 0) {
666 return VariableType0::name();
667 }
else if (variableType == 1) {
668 return VariableType1::name();
669 }
else if (variableType == 2) {
670 return VariableType2::name();
671 }
else if (variableType == 3) {
672 return VariableType3::name();
677 void doSwitching(
const CalculateOutputSubImageArguments& args) {
679 static_cast<VariableType0*
>(
this)->
template doSwitchingCode<EmptyTypeTuple4, typename JumpTable::T0>(dt, args);
682 template<
typename Types>
683 void doSwitchingWithLabel(
const CalculateOutputSubImageArguments& args, DispatchVariableType1Label*) {
685 static_cast<VariableType1*
>(
this)->
template doSwitchingCode<Types, typename JumpTable::T1>(dt, args);
688 template<
typename Types>
689 void doSwitchingWithLabel(
const CalculateOutputSubImageArguments& args, DispatchVariableType2Label*) {
691 static_cast<VariableType2*
>(
this)->
template doSwitchingCode<Types, typename JumpTable::T2>(dt, args);
694 template<
typename Types>
695 void doSwitchingWithLabel(
const CalculateOutputSubImageArguments& args, DispatchVariableType3Label*) {
697 static_cast<VariableType3*
>(
this)->
template doSwitchingCode<Types, typename JumpTable::T3>(dt, args);
700 template<
typename Types>
701 void doSwitchingWithLabel(
const CalculateOutputSubImageArguments& args, DispatchDoneLabel*) {
702 static_cast<Derived*
>(
this)->
template helperCalculateOutputSubImage<Types>(args);
705 template<
typename Types>
706 void doSwitchingWithLabel(
const CalculateOutputSubImageArguments&, DispatchDoNothingLabel*) {
721 template <
typename Derived,
int NumberOfInputImages,
722 template <
typename,
int,
typename>
class VariableType0 = internal::NoTypes,
723 template <
typename,
int,
typename>
class VariableType1 = internal::NoTypes,
724 template <
typename,
int,
typename>
class VariableType2 = internal::NoTypes,
725 template <
typename,
int,
typename>
class VariableType3 = internal::NoTypes >
727 public internal::VariableTypeDispatcher<Derived, internal::JumpTable4, VariableType0<Derived, 0, internal::CalculateOutputSubImageArguments >,
728 VariableType1<Derived, 1, internal::CalculateOutputSubImageArguments >,
729 VariableType2<Derived, 2, internal::CalculateOutputSubImageArguments >,
730 VariableType3<Derived, 3, internal::CalculateOutputSubImageArguments > >
735 #ifndef DOXYGEN_SHOULD_SKIP_THIS
738 template <
typename Derived,
int NumberOfInputImages,
739 template <
typename,
int,
typename>
class VariableType0,
740 template <
typename,
int,
typename>
class VariableType1,
741 template <
typename,
int,
typename>
class VariableType2>
744 public internal::VariableTypeDispatcher<Derived, internal::JumpTable3,
745 VariableType0<Derived, 0, internal::CalculateOutputSubImageArguments >,
746 VariableType1<Derived, 1, internal::CalculateOutputSubImageArguments >,
747 VariableType2<Derived, 2, internal::CalculateOutputSubImageArguments >,
748 internal::NoTypes<Derived, 3, internal::CalculateOutputSubImageArguments > >
753 template <
typename Derived,
int NumberOfInputImages,
754 template <
typename,
int,
typename>
class VariableType0,
755 template <
typename,
int,
typename>
class VariableType1>
756 class TypedProcessAllPagesHandler<Derived, NumberOfInputImages, VariableType0, VariableType1, internal::NoTypes, internal::NoTypes> :
757 public internal::TypedHandlerBase<ProcessAllPagesHandler, Derived, NumberOfInputImages>,
758 public internal::VariableTypeDispatcher<Derived, internal::JumpTable2,
759 VariableType0<Derived, 0, internal::CalculateOutputSubImageArguments >,
760 VariableType1<Derived, 1, internal::CalculateOutputSubImageArguments >,
761 internal::NoTypes<Derived, 2, internal::CalculateOutputSubImageArguments >,
762 internal::NoTypes<Derived, 3, internal::CalculateOutputSubImageArguments > >
767 template <
typename Derived,
int NumberOfInputImages,
768 template <
typename,
int,
typename>
class VariableType0>
769 class TypedProcessAllPagesHandler<Derived, NumberOfInputImages, VariableType0, internal::NoTypes, internal::NoTypes, internal::NoTypes> :
770 public internal::TypedHandlerBase<ProcessAllPagesHandler, Derived, NumberOfInputImages>,
771 public internal::VariableTypeDispatcher<Derived, internal::JumpTable1,
772 VariableType0<Derived, 0, internal::CalculateOutputSubImageArguments >,
773 internal::NoTypes<Derived, 1, internal::CalculateOutputSubImageArguments >,
774 internal::NoTypes<Derived, 2, internal::CalculateOutputSubImageArguments >,
775 internal::NoTypes<Derived, 3, internal::CalculateOutputSubImageArguments > >
780 template <
typename Derived,
int NumberOfInputImages>
781 class TypedProcessAllPagesHandler<Derived, NumberOfInputImages, internal::NoTypes, internal::NoTypes, internal::NoTypes, internal::NoTypes> :
782 public internal::TypedHandlerBase<ProcessAllPagesHandler, Derived, NumberOfInputImages>,
783 public internal::EmptyVariableTypeDispatcher<Derived>
938 template <
typename Derived,
int NumberOfInputImages,
939 template <
typename,
int,
typename>
class VariableType0 = internal::NoTypes,
940 template <
typename,
int,
typename>
class VariableType1 = internal::NoTypes,
941 template <
typename,
int,
typename>
class VariableType2 = internal::NoTypes,
942 template <
typename,
int,
typename>
class VariableType3 = internal::NoTypes >
944 public internal::VariableTypeDispatcher<Derived, internal::JumpTable4,
945 VariableType0<Derived, 0, internal::CalculateOutputSubImageArguments >,
946 VariableType1<Derived, 1, internal::CalculateOutputSubImageArguments >,
947 VariableType2<Derived, 2, internal::CalculateOutputSubImageArguments >,
948 VariableType3<Derived, 3, internal::CalculateOutputSubImageArguments > >
952 #ifndef DOXYGEN_SHOULD_SKIP_THIS
955 template <
typename Derived,
int NumberOfInputImages,
956 template <
typename,
int,
typename>
class VariableType0,
957 template <
typename,
int,
typename>
class VariableType1,
958 template <
typename,
int,
typename>
class VariableType2>
961 public internal::VariableTypeDispatcher<Derived, internal::JumpTable3,
962 VariableType0<Derived, 0, internal::CalculateOutputSubImageArguments >,
963 VariableType1<Derived, 1, internal::CalculateOutputSubImageArguments >,
964 VariableType2<Derived, 2, internal::CalculateOutputSubImageArguments >,
965 internal::NoTypes<Derived, 3, internal::CalculateOutputSubImageArguments > >
970 template <
typename Derived,
int NumberOfInputImages,
971 template <
typename,
int,
typename>
class VariableType0,
972 template <
typename,
int,
typename>
class VariableType1>
973 class TypedCalculateOutputImageHandler<Derived, NumberOfInputImages, VariableType0, VariableType1, internal::NoTypes, internal::NoTypes> :
974 public internal::TypedHandlerBase<CalculateOutputImageHandler, Derived, NumberOfInputImages>,
975 public internal::VariableTypeDispatcher<Derived, internal::JumpTable2,
976 VariableType0<Derived, 0, internal::CalculateOutputSubImageArguments >,
977 VariableType1<Derived, 1, internal::CalculateOutputSubImageArguments >,
978 internal::NoTypes<Derived, 2, internal::CalculateOutputSubImageArguments >,
979 internal::NoTypes<Derived, 3, internal::CalculateOutputSubImageArguments > >
984 template <
typename Derived,
int NumberOfInputImages,
985 template <
typename,
int,
typename>
class VariableType0>
986 class TypedCalculateOutputImageHandler<Derived, NumberOfInputImages, VariableType0, internal::NoTypes, internal::NoTypes, internal::NoTypes> :
987 public internal::TypedHandlerBase<CalculateOutputImageHandler, Derived, NumberOfInputImages>,
988 public internal::VariableTypeDispatcher<Derived, internal::JumpTable1,
989 VariableType0<Derived, 0, internal::CalculateOutputSubImageArguments >,
990 internal::NoTypes<Derived, 1, internal::CalculateOutputSubImageArguments >,
991 internal::NoTypes<Derived, 2, internal::CalculateOutputSubImageArguments >,
992 internal::NoTypes<Derived, 3, internal::CalculateOutputSubImageArguments > >
997 template <
typename Derived,
int NumberOfInputImages>
998 class TypedCalculateOutputImageHandler<Derived, NumberOfInputImages, internal::NoTypes, internal::NoTypes, internal::NoTypes, internal::NoTypes> :
999 public internal::TypedHandlerBase<CalculateOutputImageHandler, Derived, NumberOfInputImages>,
1000 public internal::EmptyVariableTypeDispatcher<Derived>
1030 #define ML_IMPLEMENT_VARIABLE_TYPE_BEGIN(NAME) \
1031 template<class Derived, int Step, class Args = ML_NAMESPACE::internal::CalculateOutputSubImageArguments> \
1032 class NAME : public VariableType { \
1034 enum { IsEmpty = false }; \
1036 static const char* name() { return #NAME; } \
1038 template<typename PrevTypes, typename TargetLabelType> \
1039 bool doSwitchingCode(int switchCode, const Args& args, bool printError = true) { \
1040 static const char* switcherName = #NAME; \
1041 bool result = true; \
1042 switch (switchCode) {
1046 #define ML_IMPLEMENT_VARIABLE_TYPE_END \
1051 sprintf(buf, "No switch case for physical data type %d.", switchCode); \
1052 ML_PRINT_FATAL_ERROR(switcherName, ML_BAD_DATA_TYPE, buf); } \
1062 #define ML_IMPLEMENT_VARIABLE_TYPE_CASE(TYPE) \
1063 case TypeTraits<TYPE>::dataType: \
1064 static_cast<Derived*>(this)->template doSwitchingWithLabel<typename ML_NAMESPACE::internal::TypeTuple4Insert<Step, TYPE, PrevTypes>::Type>(args, static_cast<TargetLabelType*>(0)); \
1067 #define ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(DATATYPE, TYPE) \
1069 static_cast<Derived*>(this)->template doSwitchingWithLabel<typename ML_NAMESPACE::internal::TypeTuple4Insert<Step, TYPE, PrevTypes>::Type>(args, static_cast<TargetLabelType*>(0)); \
1074 #define ML_IMPLEMENT_VARIABLE_TYPE_CASES_FLOAT \
1075 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLfloat) \
1076 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLdouble)
1080 #define ML_IMPLEMENT_VARIABLE_TYPE_CASES_INTEGER \
1081 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLuint8) \
1082 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLint8) \
1083 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLuint16) \
1084 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLint16) \
1085 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLuint32) \
1086 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLint32) \
1087 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLuint64) \
1088 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLint64)
1090 #define ML_IMPLEMENT_VARIABLE_TYPE_CASES_COMPLEX \
1091 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLComplexfType, std::complex<MLfloat>) \
1092 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLComplexdType, std::complex<MLdouble>)
1094 #define ML_IMPLEMENT_VARIABLE_TYPE_CASES_DEFAULT_EXTENDED \
1095 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLComplexfType, std::complex<MLfloat>) \
1096 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLComplexdType, std::complex<MLdouble>) \
1097 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLVector2fType, Vector2f) \
1098 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLVector2dType, Vector2d) \
1099 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLVector3fType, Vector3f) \
1100 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLVector3dType, Vector3d) \
1101 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLVector6fType, Vector6f) \
1102 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLVector6dType, Vector6d) \
1103 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLMatrix2fType, Matrix2f) \
1104 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLMatrix2dType, Matrix2d) \
1105 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLMatrix3fType, Matrix3f) \
1106 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLMatrix3dType, Matrix3d)
Defines a variable type for the complex data types (float and double) to be used with a TypedProcessA...
Defines a variable type for the default extended data types to be used with a TypedProcessAllPagesHan...
Defines a variable type for all scalar and the default extended data types to be used with a TypedPro...
Defines a variable type for all built-in floating point data types to be used with a TypedProcessAllP...
Defines a variable type for all built-in integer data types to be used with a TypedProcessAllPagesHan...
Class which represents an image, which manages properties of an image and image data which is located...
virtual MLEXPORT void setStateInfo(const std::string &info, MLErrorCode errorCode)
Sets the state information for this PagedImage to the string info and the MLErrorCode errorCode.
bool isValid() const
Returns whether image properties are valid and up-to-date.
void setInvalid()
Sets image properties invalid, i.e., isValid() returns false afterwards.
Defines a variable type for the complex data types (float and double) to be used with a TypedProcessA...
Defines a variable type for all built-in data types to be used with a TypedProcessAllPagesHandler/Typ...
This class manages/represents a rectangular 6d image region which is organized linearly in memory.
This template class manages/represents a rectangular 6d image region in memory which is organized lin...
TypedCalculateOutputImageHandler can be used as a base class for an own CalculateOutputImageHandler a...
TypedProcessAllPagesHandler can be used as a base class for an own ProcessAllPages handler and suppor...
Base class for thread local data that is passed to CalculateOutputImageHandler::calculateOutputSubIma...
Base class for all variable types, mainly for doxygen documentation purpose.
The base class for TypedCalculateOutputImageHandler and TypedProcessAllPagesHandler.
static void setupKnownProperties(PagedImage *outImg)
Setup the properties of the outImg and its input sub images according to the settings of OutputSubIma...
void calculateOutputSubImage(SubImage *outImg, SubImage *inImgs, UserThreadData *userThreadData) override
Overrides the calculateOutputSubImage of CalculateOutputImageHandler.
static bool verifyProperties(PagedImage *outImg)
Verify the properties of the outImg (its datatype and the datatypes of the input sub images compared ...
#define ML_IMPLEMENT_VARIABLE_TYPE_CASES_INTEGER
Defines a variable type case block for all integer types.
#define ML_IMPLEMENT_VARIABLE_TYPE_CASES_FLOAT
Defines a variable type case block for all float types.
#define ML_IMPLEMENT_VARIABLE_TYPE_CASES_COMPLEX
#define ML_IMPLEMENT_VARIABLE_TYPE_CASES_DEFAULT_EXTENDED
#define ML_IMPLEMENT_VARIABLE_TYPE_BEGIN(NAME)
Macro to declare a variable type, needs to be followed by 0-N ML_IMPLEMENT_VARIABLE_TYPE_CASE macros ...
#define ML_IMPLEMENT_VARIABLE_TYPE_END
Macro to end declaration of a variable type.
MLEXPORT const char * MLNameFromDataType(MLDataType dataType)
Function which returns the null-terminated string name for data type dataType or "" in case of error ...
MLint32 MLDataType
MLDataType.
#define ML_BAD_DATA_TYPE
A wrong or unexpected data type has been passed to an algorithm which often is a programming error; t...
#define MLEXPORT
To export symbols from a dll/shared object, we need to mark them with the MLEXPORT symbol.
#define _ML_COLLECT_ENUMS
#define _ML_OUTPUTINDEX
Defines special index that means to use the output image.
#define ML_N_INPUTS
Special value that can be passed as number of inputs to the typed handlers.
#define _ML_SWITCH_SELECT_OFFSET
Defines offset for switch types (internal)
const int MLGenericType
Defines special index to use a generic type.
const int MLVariableType2
Defines to use the result type of variable type 2.
const int MLVariableType3
Defines to use the result type of variable type 3.
const int MLVariableType0
Defines to use the result type of variable type 0.
const int MLVariableType1
Defines to use the result type of variable type 1.
Helper template so select a data type from its type id.