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>*) {
333 typedef typename SwitchOrFixedTypeSelector<Derived::OutputSubImage_Type, Types>::Type OUTTYPE;
334 typedef typename SwitchOrFixedTypeSelector<Derived::InputSubImage0_Type, Types>::Type INTYPE0;
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);
354 typename ConstTypeSelector<Derived::InputSubImage0_ReadOnly, INIMAGETYPE0>::Type inTSubImg0(args.inImgs[0]);
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);
364 typename ConstTypeSelector<Derived::InputSubImage0_ReadOnly, INIMAGETYPE0>::Type inTSubImg0(args.inImgs[0]);
365 typename ConstTypeSelector<Derived::InputSubImage1_ReadOnly, INIMAGETYPE1>::Type inTSubImg1(args.inImgs[1]);
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);
376 typename ConstTypeSelector<Derived::InputSubImage0_ReadOnly, INIMAGETYPE0>::Type inTSubImg0(args.inImgs[0]);
377 typename ConstTypeSelector<Derived::InputSubImage1_ReadOnly, INIMAGETYPE1>::Type inTSubImg1(args.inImgs[1]);
378 typename ConstTypeSelector<Derived::InputSubImage2_ReadOnly, INIMAGETYPE2>::Type inTSubImg2(args.inImgs[2]);
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);
390 typename ConstTypeSelector<Derived::InputSubImage0_ReadOnly, INIMAGETYPE0>::Type inTSubImg0(args.inImgs[0]);
391 typename ConstTypeSelector<Derived::InputSubImage1_ReadOnly, INIMAGETYPE1>::Type inTSubImg1(args.inImgs[1]);
392 typename ConstTypeSelector<Derived::InputSubImage2_ReadOnly, INIMAGETYPE2>::Type inTSubImg2(args.inImgs[2]);
393 typename ConstTypeSelector<Derived::InputSubImage3_ReadOnly, INIMAGETYPE3>::Type inTSubImg3(args.inImgs[3]);
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);
406 typename ConstTypeSelector<Derived::InputSubImage0_ReadOnly, INIMAGETYPE0>::Type inTSubImg0(args.inImgs[0]);
407 typename ConstTypeSelector<Derived::InputSubImage1_ReadOnly, INIMAGETYPE1>::Type inTSubImg1(args.inImgs[1]);
408 typename ConstTypeSelector<Derived::InputSubImage2_ReadOnly, INIMAGETYPE2>::Type inTSubImg2(args.inImgs[2]);
409 typename ConstTypeSelector<Derived::InputSubImage3_ReadOnly, INIMAGETYPE3>::Type inTSubImg3(args.inImgs[3]);
410 typename ConstTypeSelector<Derived::InputSubImage4_ReadOnly, INIMAGETYPE4>::Type inTSubImg4(args.inImgs[4]);
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);
424 typename ConstTypeSelector<Derived::InputSubImage0_ReadOnly, INIMAGETYPE0>::Type inTSubImg0(args.inImgs[0]);
425 typename ConstTypeSelector<Derived::InputSubImage1_ReadOnly, INIMAGETYPE1>::Type inTSubImg1(args.inImgs[1]);
426 typename ConstTypeSelector<Derived::InputSubImage2_ReadOnly, INIMAGETYPE2>::Type inTSubImg2(args.inImgs[2]);
427 typename ConstTypeSelector<Derived::InputSubImage3_ReadOnly, INIMAGETYPE3>::Type inTSubImg3(args.inImgs[3]);
428 typename ConstTypeSelector<Derived::InputSubImage4_ReadOnly, INIMAGETYPE4>::Type inTSubImg4(args.inImgs[4]);
429 typename ConstTypeSelector<Derived::InputSubImage5_ReadOnly, INIMAGETYPE5>::Type inTSubImg5(args.inImgs[5]);
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);
444 typename ConstTypeSelector<Derived::InputSubImage0_ReadOnly, INIMAGETYPE0>::Type inTSubImg0(args.inImgs[0]);
445 typename ConstTypeSelector<Derived::InputSubImage1_ReadOnly, INIMAGETYPE1>::Type inTSubImg1(args.inImgs[1]);
446 typename ConstTypeSelector<Derived::InputSubImage2_ReadOnly, INIMAGETYPE2>::Type inTSubImg2(args.inImgs[2]);
447 typename ConstTypeSelector<Derived::InputSubImage3_ReadOnly, INIMAGETYPE3>::Type inTSubImg3(args.inImgs[3]);
448 typename ConstTypeSelector<Derived::InputSubImage4_ReadOnly, INIMAGETYPE4>::Type inTSubImg4(args.inImgs[4]);
449 typename ConstTypeSelector<Derived::InputSubImage5_ReadOnly, INIMAGETYPE5>::Type inTSubImg5(args.inImgs[5]);
450 typename ConstTypeSelector<Derived::InputSubImage6_ReadOnly, INIMAGETYPE6>::Type inTSubImg6(args.inImgs[6]);
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);
466 typename ConstTypeSelector<Derived::InputSubImage0_ReadOnly, INIMAGETYPE0>::Type inTSubImg0(args.inImgs[0]);
467 typename ConstTypeSelector<Derived::InputSubImage1_ReadOnly, INIMAGETYPE1>::Type inTSubImg1(args.inImgs[1]);
468 typename ConstTypeSelector<Derived::InputSubImage2_ReadOnly, INIMAGETYPE2>::Type inTSubImg2(args.inImgs[2]);
469 typename ConstTypeSelector<Derived::InputSubImage3_ReadOnly, INIMAGETYPE3>::Type inTSubImg3(args.inImgs[3]);
470 typename ConstTypeSelector<Derived::InputSubImage4_ReadOnly, INIMAGETYPE4>::Type inTSubImg4(args.inImgs[4]);
471 typename ConstTypeSelector<Derived::InputSubImage5_ReadOnly, INIMAGETYPE5>::Type inTSubImg5(args.inImgs[5]);
472 typename ConstTypeSelector<Derived::InputSubImage6_ReadOnly, INIMAGETYPE6>::Type inTSubImg6(args.inImgs[6]);
473 typename ConstTypeSelector<Derived::InputSubImage7_ReadOnly, INIMAGETYPE7>::Type inTSubImg7(args.inImgs[7]);
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);
490 typename ConstTypeSelector<Derived::InputSubImage0_ReadOnly, INIMAGETYPE0>::Type inTSubImg0(args.inImgs[0]);
491 typename ConstTypeSelector<Derived::InputSubImage1_ReadOnly, INIMAGETYPE1>::Type inTSubImg1(args.inImgs[1]);
492 typename ConstTypeSelector<Derived::InputSubImage2_ReadOnly, INIMAGETYPE2>::Type inTSubImg2(args.inImgs[2]);
493 typename ConstTypeSelector<Derived::InputSubImage3_ReadOnly, INIMAGETYPE3>::Type inTSubImg3(args.inImgs[3]);
494 typename ConstTypeSelector<Derived::InputSubImage4_ReadOnly, INIMAGETYPE4>::Type inTSubImg4(args.inImgs[4]);
495 typename ConstTypeSelector<Derived::InputSubImage5_ReadOnly, INIMAGETYPE5>::Type inTSubImg5(args.inImgs[5]);
496 typename ConstTypeSelector<Derived::InputSubImage6_ReadOnly, INIMAGETYPE6>::Type inTSubImg6(args.inImgs[6]);
497 typename ConstTypeSelector<Derived::InputSubImage7_ReadOnly, INIMAGETYPE7>::Type inTSubImg7(args.inImgs[7]);
498 typename ConstTypeSelector<Derived::InputSubImage8_ReadOnly, INIMAGETYPE8>::Type inTSubImg8(args.inImgs[8]);
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);
516 typename ConstTypeSelector<Derived::InputSubImage0_ReadOnly, INIMAGETYPE0>::Type inTSubImg0(args.inImgs[0]);
517 typename ConstTypeSelector<Derived::InputSubImage1_ReadOnly, INIMAGETYPE1>::Type inTSubImg1(args.inImgs[1]);
518 typename ConstTypeSelector<Derived::InputSubImage2_ReadOnly, INIMAGETYPE2>::Type inTSubImg2(args.inImgs[2]);
519 typename ConstTypeSelector<Derived::InputSubImage3_ReadOnly, INIMAGETYPE3>::Type inTSubImg3(args.inImgs[3]);
520 typename ConstTypeSelector<Derived::InputSubImage4_ReadOnly, INIMAGETYPE4>::Type inTSubImg4(args.inImgs[4]);
521 typename ConstTypeSelector<Derived::InputSubImage5_ReadOnly, INIMAGETYPE5>::Type inTSubImg5(args.inImgs[5]);
522 typename ConstTypeSelector<Derived::InputSubImage6_ReadOnly, INIMAGETYPE6>::Type inTSubImg6(args.inImgs[6]);
523 typename ConstTypeSelector<Derived::InputSubImage7_ReadOnly, INIMAGETYPE7>::Type inTSubImg7(args.inImgs[7]);
524 typename ConstTypeSelector<Derived::InputSubImage8_ReadOnly, INIMAGETYPE8>::Type inTSubImg8(args.inImgs[8]);
525 typename ConstTypeSelector<Derived::InputSubImage9_ReadOnly, INIMAGETYPE9>::Type inTSubImg9(args.inImgs[9]);
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 data type '" <<
MLNameFromDataType(resultDataTypes[i]) <<
"' at input" << variableTypes[i] <<
" using variable type " << Derived::variableTypeName(i) << std::endl;
565 errorMessages <<
"Unsupported data type '" <<
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>
937 template <
typename Derived,
int NumberOfInputImages,
938 template <
typename,
int,
typename>
class VariableType0 = internal::NoTypes,
939 template <
typename,
int,
typename>
class VariableType1 = internal::NoTypes,
940 template <
typename,
int,
typename>
class VariableType2 = internal::NoTypes,
941 template <
typename,
int,
typename>
class VariableType3 = internal::NoTypes >
943 public internal::VariableTypeDispatcher<Derived, internal::JumpTable4,
944 VariableType0<Derived, 0, internal::CalculateOutputSubImageArguments >,
945 VariableType1<Derived, 1, internal::CalculateOutputSubImageArguments >,
946 VariableType2<Derived, 2, internal::CalculateOutputSubImageArguments >,
947 VariableType3<Derived, 3, internal::CalculateOutputSubImageArguments > >
951 #ifndef DOXYGEN_SHOULD_SKIP_THIS
954 template <
typename Derived,
int NumberOfInputImages,
955 template <
typename,
int,
typename>
class VariableType0,
956 template <
typename,
int,
typename>
class VariableType1,
957 template <
typename,
int,
typename>
class VariableType2>
960 public internal::VariableTypeDispatcher<Derived, internal::JumpTable3,
961 VariableType0<Derived, 0, internal::CalculateOutputSubImageArguments >,
962 VariableType1<Derived, 1, internal::CalculateOutputSubImageArguments >,
963 VariableType2<Derived, 2, internal::CalculateOutputSubImageArguments >,
964 internal::NoTypes<Derived, 3, internal::CalculateOutputSubImageArguments > >
969 template <
typename Derived,
int NumberOfInputImages,
970 template <
typename,
int,
typename>
class VariableType0,
971 template <
typename,
int,
typename>
class VariableType1>
972 class TypedCalculateOutputImageHandler<Derived, NumberOfInputImages, VariableType0, VariableType1, internal::NoTypes, internal::NoTypes> :
973 public internal::TypedHandlerBase<CalculateOutputImageHandler, Derived, NumberOfInputImages>,
974 public internal::VariableTypeDispatcher<Derived, internal::JumpTable2,
975 VariableType0<Derived, 0, internal::CalculateOutputSubImageArguments >,
976 VariableType1<Derived, 1, internal::CalculateOutputSubImageArguments >,
977 internal::NoTypes<Derived, 2, internal::CalculateOutputSubImageArguments >,
978 internal::NoTypes<Derived, 3, internal::CalculateOutputSubImageArguments > >
983 template <
typename Derived,
int NumberOfInputImages,
984 template <
typename,
int,
typename>
class VariableType0>
985 class TypedCalculateOutputImageHandler<Derived, NumberOfInputImages, VariableType0, internal::NoTypes, internal::NoTypes, internal::NoTypes> :
986 public internal::TypedHandlerBase<CalculateOutputImageHandler, Derived, NumberOfInputImages>,
987 public internal::VariableTypeDispatcher<Derived, internal::JumpTable1,
988 VariableType0<Derived, 0, internal::CalculateOutputSubImageArguments >,
989 internal::NoTypes<Derived, 1, internal::CalculateOutputSubImageArguments >,
990 internal::NoTypes<Derived, 2, internal::CalculateOutputSubImageArguments >,
991 internal::NoTypes<Derived, 3, internal::CalculateOutputSubImageArguments > >
996 template <
typename Derived,
int NumberOfInputImages>
997 class TypedCalculateOutputImageHandler<Derived, NumberOfInputImages, internal::NoTypes, internal::NoTypes, internal::NoTypes, internal::NoTypes> :
998 public internal::TypedHandlerBase<CalculateOutputImageHandler, Derived, NumberOfInputImages>,
999 public internal::EmptyVariableTypeDispatcher<Derived>
1029 #define ML_IMPLEMENT_VARIABLE_TYPE_BEGIN(NAME) \
1030 template<class Derived, int Step, class Args = ML_NAMESPACE::internal::CalculateOutputSubImageArguments> \
1031 class NAME : public VariableType { \
1033 enum { IsEmpty = false }; \
1035 static const char* name() { return #NAME; } \
1037 template<typename PrevTypes, typename TargetLabelType> \
1038 bool doSwitchingCode(int switchCode, const Args& args, bool printError = true) { \
1039 static const char* switcherName = #NAME; \
1040 bool result = true; \
1041 switch (switchCode) {
1045 #define ML_IMPLEMENT_VARIABLE_TYPE_END \
1050 sprintf(buf, "No switch case for physical data type %d.", switchCode); \
1051 ML_PRINT_FATAL_ERROR(switcherName, ML_BAD_DATA_TYPE, buf); } \
1061 #define ML_IMPLEMENT_VARIABLE_TYPE_CASE(TYPE) \
1062 case TypeTraits<TYPE>::dataType: \
1063 static_cast<Derived*>(this)->template doSwitchingWithLabel<typename ML_NAMESPACE::internal::TypeTuple4Insert<Step, TYPE, PrevTypes>::Type>(args, static_cast<TargetLabelType*>(0)); \
1066 #define ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(DATATYPE, TYPE) \
1068 static_cast<Derived*>(this)->template doSwitchingWithLabel<typename ML_NAMESPACE::internal::TypeTuple4Insert<Step, TYPE, PrevTypes>::Type>(args, static_cast<TargetLabelType*>(0)); \
1073 #define ML_IMPLEMENT_VARIABLE_TYPE_CASES_FLOAT \
1074 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLfloat) \
1075 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLdouble)
1079 #define ML_IMPLEMENT_VARIABLE_TYPE_CASES_INTEGER \
1080 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLuint8) \
1081 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLint8) \
1082 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLuint16) \
1083 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLint16) \
1084 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLuint32) \
1085 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLint32) \
1086 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLuint64) \
1087 ML_IMPLEMENT_VARIABLE_TYPE_CASE(MLint64)
1089 #define ML_IMPLEMENT_VARIABLE_TYPE_CASES_COMPLEX \
1090 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLComplexfType, std::complex<MLfloat>) \
1091 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLComplexdType, std::complex<MLdouble>)
1093 #define ML_IMPLEMENT_VARIABLE_TYPE_CASES_DEFAULT_EXTENDED \
1094 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLComplexfType, std::complex<MLfloat>) \
1095 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLComplexdType, std::complex<MLdouble>) \
1096 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLVector2fType, Vector2f) \
1097 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLVector2dType, Vector2d) \
1098 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLVector3fType, Vector3f) \
1099 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLVector3dType, Vector3d) \
1100 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLVector6fType, Vector6f) \
1101 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLVector6dType, Vector6d) \
1102 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLMatrix2fType, Matrix2f) \
1103 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLMatrix2dType, Matrix2d) \
1104 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLMatrix3fType, Matrix3f) \
1105 ML_IMPLEMENT_VARIABLE_EXTENDED_TYPE_CASE(MLMatrix3dType, Matrix3d)
Defines a variable type for the complex datatypes (float and double) to be used with a TypedProcessAl...
Defines a variable type for the default extended datatypes to be used with a TypedProcessAllPagesHand...
Defines a variable type for all scalar and the default extended datatypes to be used with a TypedProc...
Defines a variable type for all built-in floating point datatypes to be used with a TypedProcessAllPa...
Defines a variable type for all built-in integer datatypes to be used with a TypedProcessAllPagesHand...
The class PagedImage, representing a fragmented image that manages properties and data of an image lo...
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 datatypes (float and double) to be used with a TypedProcessAl...
Defines a variable type for all built-in datatypes to be used with a TypedProcessAllPagesHandler/Type...
This class manages/represents a rectangular 6D image region that is organized linearly in memory.
This template class manages/represents a rectangular 6D image region in memory that is organized line...
TypedCalculateOutputImageHandler can be used as a base class for a custom CalculateOutputImageHandler...
TypedProcessAllPagesHandler can be used as a base class for a custom ProcessAllPages handler and supp...
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)
Sets up the properties of the outImg and its input subimages according to the settings of OutputSubIm...
void calculateOutputSubImage(SubImage *outImg, SubImage *inImgs, UserThreadData *userThreadData) override
Overrides the calculateOutputSubImage of CalculateOutputImageHandler.
static bool verifyProperties(PagedImage *outImg)
Verifies the properties of outImg (its data type and the datatypes of the input subimages,...
#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 that returns the NULL-terminated string name for data type dataType or "" in case of error o...
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.
#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 a 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 an 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.