From 8bd422e50c3a687eab0ed95456f635c7c9d3cf55 Mon Sep 17 00:00:00 2001
From: Cyrille Valladeau <cyrille.valladeau@c-s.fr>
Date: Mon, 17 Oct 2011 15:07:49 +0200
Subject: [PATCH] ENH: code factorization

---
 .../otbWrapperInputImageParameter.cxx         | 1403 +----------------
 1 file changed, 56 insertions(+), 1347 deletions(-)

diff --git a/Code/ApplicationEngine/otbWrapperInputImageParameter.cxx b/Code/ApplicationEngine/otbWrapperInputImageParameter.cxx
index db38925881..fe53083a81 100644
--- a/Code/ApplicationEngine/otbWrapperInputImageParameter.cxx
+++ b/Code/ApplicationEngine/otbWrapperInputImageParameter.cxx
@@ -288,1372 +288,81 @@ InputImageParameter::CastVectorImageFromImage()
   return caster->GetOutput();
 }
 
-/*********************************************************************
-********************** Image -> Image
-**********************************************************************/
-/////////// Int8ImageType->...
-template <> Int8ImageType *
-InputImageParameter::CastImage<Int8ImageType, Int8ImageType>(){
-  return this->SimpleCastImage<Int8ImageType, Int8ImageType>();
-}
-
-template <> UInt8ImageType *
-InputImageParameter::CastImage<Int8ImageType, UInt8ImageType>(){
-  return this->SimpleCastImage<Int8ImageType, UInt8ImageType>();
-}
-
-template <>  Int16ImageType*
-InputImageParameter::CastImage<Int8ImageType, Int16ImageType>(){
-  return this->SimpleCastImage<Int8ImageType, Int16ImageType>();
-}
-
-template <> UInt16ImageType*
-InputImageParameter::CastImage<Int8ImageType, UInt16ImageType>(){
-  return this->SimpleCastImage<Int8ImageType, UInt16ImageType>();
-}
-
-template <>  Int32ImageType*
-InputImageParameter::CastImage<Int8ImageType, Int32ImageType>(){
-  return this->SimpleCastImage<Int8ImageType, Int32ImageType>();
-}
-
-
-template <>  UInt32ImageType*
-InputImageParameter::CastImage<Int8ImageType, UInt32ImageType>(){
-  return this->SimpleCastImage<Int8ImageType, UInt32ImageType>();
-}
-
-template <> FloatImageType *
-InputImageParameter::CastImage<Int8ImageType, FloatImageType>(){
-  return this->SimpleCastImage<Int8ImageType, FloatImageType>();
-}
-
-template <> DoubleImageType *
-InputImageParameter::CastImage<Int8ImageType, DoubleImageType>(){
-  return this->SimpleCastImage<Int8ImageType, DoubleImageType>();
-}
-
-
-/////////// UInt8ImageType->...
-template <> Int8ImageType *
-InputImageParameter::CastImage<UInt8ImageType, Int8ImageType>(){
-  return this->SimpleCastImage<UInt8ImageType, Int8ImageType>();
-}
-
-template <> UInt8ImageType *
-InputImageParameter::CastImage<UInt8ImageType, UInt8ImageType>(){
-  return this->SimpleCastImage<UInt8ImageType, UInt8ImageType>();
-}
-
-template <>  Int16ImageType*
-InputImageParameter::CastImage<UInt8ImageType, Int16ImageType>(){
-  return this->SimpleCastImage<UInt8ImageType, Int16ImageType>();
-}
-
-template <> UInt16ImageType*
-InputImageParameter::CastImage<UInt8ImageType, UInt16ImageType>(){
-  return this->SimpleCastImage<UInt8ImageType, UInt16ImageType>();
-}
-
-template <>  Int32ImageType*
-InputImageParameter::CastImage<UInt8ImageType, Int32ImageType>(){
-  return this->SimpleCastImage<UInt8ImageType, Int32ImageType>();
-}
-
-
-template <>  UInt32ImageType*
-InputImageParameter::CastImage<UInt8ImageType, UInt32ImageType>(){
-  return this->SimpleCastImage<UInt8ImageType, UInt32ImageType>();
-}
-
-template <> FloatImageType *
-InputImageParameter::CastImage<UInt8ImageType, FloatImageType>(){
-  return this->SimpleCastImage<UInt8ImageType, FloatImageType>();
-}
-
-template <> DoubleImageType *
-InputImageParameter::CastImage<UInt8ImageType, DoubleImageType>(){
-  return this->SimpleCastImage<UInt8ImageType, DoubleImageType>();
-}
-
-/////////// Int16ImageType->...
-template <> Int8ImageType *
-InputImageParameter::CastImage<Int16ImageType, Int8ImageType>(){
-  return this->SimpleCastImage<Int16ImageType, Int8ImageType>();
-}
-
-template <> UInt8ImageType *
-InputImageParameter::CastImage<Int16ImageType, UInt8ImageType>(){
-  return this->SimpleCastImage<Int16ImageType, UInt8ImageType>();
-}
-
-template <>  Int16ImageType*
-InputImageParameter::CastImage<Int16ImageType, Int16ImageType>(){
-  return this->SimpleCastImage<Int16ImageType, Int16ImageType>();
-}
-
-template <> UInt16ImageType*
-InputImageParameter::CastImage<Int16ImageType, UInt16ImageType>(){
-  return this->SimpleCastImage<Int16ImageType, UInt16ImageType>();
-}
-
-template <>  Int32ImageType*
-InputImageParameter::CastImage<Int16ImageType, Int32ImageType>(){
-  return this->SimpleCastImage<Int16ImageType, Int32ImageType>();
-}
-
-
-template <>  UInt32ImageType*
-InputImageParameter::CastImage<Int16ImageType, UInt32ImageType>(){
-  return this->SimpleCastImage<Int16ImageType, UInt32ImageType>();
-}
-
-template <> FloatImageType *
-InputImageParameter::CastImage<Int16ImageType, FloatImageType>(){
-  return this->SimpleCastImage<Int16ImageType, FloatImageType>();
-}
-
-template <> DoubleImageType *
-InputImageParameter::CastImage<Int16ImageType, DoubleImageType>(){
-  return this->SimpleCastImage<Int16ImageType, DoubleImageType>();
-}
-
-/////////// UInt16ImageType->...
-template <> Int8ImageType *
-InputImageParameter::CastImage<UInt16ImageType, Int8ImageType>(){
-  return this->SimpleCastImage<UInt16ImageType, Int8ImageType>();
-}
-
-template <> UInt8ImageType *
-InputImageParameter::CastImage<UInt16ImageType, UInt8ImageType>(){
-  return this->SimpleCastImage<UInt16ImageType, UInt8ImageType>();
-}
-
-template <>  Int16ImageType*
-InputImageParameter::CastImage<UInt16ImageType, Int16ImageType>(){
-  return this->SimpleCastImage<UInt16ImageType, Int16ImageType>();
-}
-
-template <> UInt16ImageType*
-InputImageParameter::CastImage<UInt16ImageType, UInt16ImageType>(){
-  return this->SimpleCastImage<UInt16ImageType, UInt16ImageType>();
-}
-
-template <>  Int32ImageType*
-InputImageParameter::CastImage<UInt16ImageType, Int32ImageType>(){
-  return this->SimpleCastImage<UInt16ImageType, Int32ImageType>();
-}
-
-
-template <>  UInt32ImageType*
-InputImageParameter::CastImage<UInt16ImageType, UInt32ImageType>(){
-  return this->SimpleCastImage<UInt16ImageType, UInt32ImageType>();
-}
-
-template <> FloatImageType *
-InputImageParameter::CastImage<UInt16ImageType, FloatImageType>(){
-  return this->SimpleCastImage<UInt16ImageType, FloatImageType>();
-}
-
-template <> DoubleImageType *
-InputImageParameter::CastImage<UInt16ImageType, DoubleImageType>(){
-  return this->SimpleCastImage<UInt16ImageType, DoubleImageType>();
-}
-
-/////////// Int32ImageType->...
-template <> Int8ImageType *
-InputImageParameter::CastImage<Int32ImageType, Int8ImageType>(){
-  return this->SimpleCastImage<Int32ImageType, Int8ImageType>();
-}
-
-template <> UInt8ImageType *
-InputImageParameter::CastImage<Int32ImageType, UInt8ImageType>(){
-  return this->SimpleCastImage<Int32ImageType, UInt8ImageType>();
-}
-
-template <>  Int16ImageType*
-InputImageParameter::CastImage<Int32ImageType, Int16ImageType>(){
-  return this->SimpleCastImage<Int32ImageType, Int16ImageType>();
-}
-
-template <> UInt16ImageType*
-InputImageParameter::CastImage<Int32ImageType, UInt16ImageType>(){
-  return this->SimpleCastImage<Int32ImageType, UInt16ImageType>();
-}
-
-template <>  Int32ImageType*
-InputImageParameter::CastImage<Int32ImageType, Int32ImageType>(){
-  return this->SimpleCastImage<Int32ImageType, Int32ImageType>();
-}
-
-
-template <>  UInt32ImageType*
-InputImageParameter::CastImage<Int32ImageType, UInt32ImageType>(){
-  return this->SimpleCastImage<Int32ImageType, UInt32ImageType>();
-}
-
-template <> FloatImageType *
-InputImageParameter::CastImage<Int32ImageType, FloatImageType>(){
-  return this->SimpleCastImage<Int32ImageType, FloatImageType>();
-}
-
-template <> DoubleImageType *
-InputImageParameter::CastImage<Int32ImageType, DoubleImageType>(){
-  return this->SimpleCastImage<Int32ImageType, DoubleImageType>();
-}
-
-
-/////////// UInt32ImageType->...
-template <> Int8ImageType *
-InputImageParameter::CastImage<UInt32ImageType, Int8ImageType>(){
-  return this->SimpleCastImage<UInt32ImageType, Int8ImageType>();
-}
-
-template <> UInt8ImageType *
-InputImageParameter::CastImage<UInt32ImageType, UInt8ImageType>(){
-  return this->SimpleCastImage<UInt32ImageType, UInt8ImageType>();
-}
-
-template <>  Int16ImageType*
-InputImageParameter::CastImage<UInt32ImageType, Int16ImageType>(){
-  return this->SimpleCastImage<UInt32ImageType, Int16ImageType>();
-}
-
-template <> UInt16ImageType*
-InputImageParameter::CastImage<UInt32ImageType, UInt16ImageType>(){
-  return this->SimpleCastImage<UInt32ImageType, UInt16ImageType>();
-}
-
-template <>  Int32ImageType*
-InputImageParameter::CastImage<UInt32ImageType, Int32ImageType>(){
-  return this->SimpleCastImage<UInt32ImageType, Int32ImageType>();
-}
-
-
-template <>  UInt32ImageType*
-InputImageParameter::CastImage<UInt32ImageType, UInt32ImageType>(){
-  return this->SimpleCastImage<UInt32ImageType, UInt32ImageType>();
-}
-
-template <> FloatImageType *
-InputImageParameter::CastImage<UInt32ImageType, FloatImageType>(){
-  return this->SimpleCastImage<UInt32ImageType, FloatImageType>();
-}
-
-template <> DoubleImageType *
-InputImageParameter::CastImage<UInt32ImageType, DoubleImageType>(){
-  return this->SimpleCastImage<UInt32ImageType, DoubleImageType>();
-}
-
-/////////// FloatImageType->...
-template <> Int8ImageType *
-InputImageParameter::CastImage<FloatImageType, Int8ImageType>(){
-  return this->SimpleCastImage<FloatImageType, Int8ImageType>();
-}
-
-template <> UInt8ImageType *
-InputImageParameter::CastImage<FloatImageType, UInt8ImageType>(){
-  return this->SimpleCastImage<FloatImageType, UInt8ImageType>();
-}
-
-template <>  Int16ImageType*
-InputImageParameter::CastImage<FloatImageType, Int16ImageType>(){
-  return this->SimpleCastImage<FloatImageType, Int16ImageType>();
-}
-
-template <> UInt16ImageType*
-InputImageParameter::CastImage<FloatImageType, UInt16ImageType>(){
-  return this->SimpleCastImage<FloatImageType, UInt16ImageType>();
-}
-
-template <>  Int32ImageType*
-InputImageParameter::CastImage<FloatImageType, Int32ImageType>(){
-  return this->SimpleCastImage<FloatImageType, Int32ImageType>();
-}
-
-
-template <>  UInt32ImageType*
-InputImageParameter::CastImage<FloatImageType, UInt32ImageType>(){
-  return this->SimpleCastImage<FloatImageType, UInt32ImageType>();
-}
-
-template <> FloatImageType *
-InputImageParameter::CastImage<FloatImageType, FloatImageType>(){
-  return this->SimpleCastImage<FloatImageType, FloatImageType>();
-}
-
-template <> DoubleImageType *
-InputImageParameter::CastImage<FloatImageType, DoubleImageType>(){
-  return this->SimpleCastImage<FloatImageType, DoubleImageType>();
-}
-
-/////////// DoubleImageType->...
-template <> Int8ImageType *
-InputImageParameter::CastImage<DoubleImageType, Int8ImageType>(){
-  return this->SimpleCastImage<DoubleImageType, Int8ImageType>();
-}
-
-template <> UInt8ImageType *
-InputImageParameter::CastImage<DoubleImageType, UInt8ImageType>(){
-  return this->SimpleCastImage<DoubleImageType, UInt8ImageType>();
-}
-
-template <>  Int16ImageType*
-InputImageParameter::CastImage<DoubleImageType, Int16ImageType>(){
-  return this->SimpleCastImage<DoubleImageType, Int16ImageType>();
-}
-
-template <> UInt16ImageType*
-InputImageParameter::CastImage<DoubleImageType, UInt16ImageType>(){
-  return this->SimpleCastImage<DoubleImageType, UInt16ImageType>();
-}
-
-template <>  Int32ImageType*
-InputImageParameter::CastImage<DoubleImageType, Int32ImageType>(){
-  return this->SimpleCastImage<DoubleImageType, Int32ImageType>();
-}
-
-
-template <>  UInt32ImageType*
-InputImageParameter::CastImage<DoubleImageType, UInt32ImageType>(){
-  return this->SimpleCastImage<DoubleImageType, UInt32ImageType>();
-}
-
-template <> FloatImageType *
-InputImageParameter::CastImage<DoubleImageType, FloatImageType>(){
-  return this->SimpleCastImage<DoubleImageType, FloatImageType>();
-}
-
-template <> DoubleImageType *
-InputImageParameter::CastImage<DoubleImageType, DoubleImageType>(){
-  return this->SimpleCastImage<DoubleImageType, DoubleImageType>();
-}
-
-
-/*********************************************************************
-********************** VectorImage -> VectorImage
-**********************************************************************/
-/////////// Int8VectorImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<Int8VectorImageType, Int8VectorImageType>(){
-  return this->SimpleCastImage<Int8VectorImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<Int8VectorImageType, UInt8VectorImageType>(){
-  return this->SimpleCastImage<Int8VectorImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<Int8VectorImageType, Int16VectorImageType>(){
-  return this->SimpleCastImage<Int8VectorImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<Int8VectorImageType, UInt16VectorImageType>(){
-  return this->SimpleCastImage<Int8VectorImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<Int8VectorImageType, Int32VectorImageType>(){
-  return this->SimpleCastImage<Int8VectorImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<Int8VectorImageType, UInt32VectorImageType>(){
-  return this->SimpleCastImage<Int8VectorImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<Int8VectorImageType, FloatVectorImageType>(){
-  return this->SimpleCastImage<Int8VectorImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<Int8VectorImageType, DoubleVectorImageType>(){
-  return this->SimpleCastImage<Int8VectorImageType, DoubleVectorImageType>();
-}
-
-
-/////////// UInt8VectorImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<UInt8VectorImageType, Int8VectorImageType>(){
-  return this->SimpleCastImage<UInt8VectorImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<UInt8VectorImageType, UInt8VectorImageType>(){
-  return this->SimpleCastImage<UInt8VectorImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<UInt8VectorImageType, Int16VectorImageType>(){
-  return this->SimpleCastImage<UInt8VectorImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<UInt8VectorImageType, UInt16VectorImageType>(){
-  return this->SimpleCastImage<UInt8VectorImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<UInt8VectorImageType, Int32VectorImageType>(){
-  return this->SimpleCastImage<UInt8VectorImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<UInt8VectorImageType, UInt32VectorImageType>(){
-  return this->SimpleCastImage<UInt8VectorImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<UInt8VectorImageType, FloatVectorImageType>(){
-  return this->SimpleCastImage<UInt8VectorImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<UInt8VectorImageType, DoubleVectorImageType>(){
-  return this->SimpleCastImage<UInt8VectorImageType, DoubleVectorImageType>();
-}
-
-/////////// Int16VectorImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<Int16VectorImageType, Int8VectorImageType>(){
-  return this->SimpleCastImage<Int16VectorImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<Int16VectorImageType, UInt8VectorImageType>(){
-  return this->SimpleCastImage<Int16VectorImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<Int16VectorImageType, Int16VectorImageType>(){
-  return this->SimpleCastImage<Int16VectorImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<Int16VectorImageType, UInt16VectorImageType>(){
-  return this->SimpleCastImage<Int16VectorImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<Int16VectorImageType, Int32VectorImageType>(){
-  return this->SimpleCastImage<Int16VectorImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<Int16VectorImageType, UInt32VectorImageType>(){
-  return this->SimpleCastImage<Int16VectorImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<Int16VectorImageType, FloatVectorImageType>(){
-  return this->SimpleCastImage<Int16VectorImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<Int16VectorImageType, DoubleVectorImageType>(){
-  return this->SimpleCastImage<Int16VectorImageType, DoubleVectorImageType>();
-}
-
-/////////// UInt16VectorImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<UInt16VectorImageType, Int8VectorImageType>(){
-  return this->SimpleCastImage<UInt16VectorImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<UInt16VectorImageType, UInt8VectorImageType>(){
-  return this->SimpleCastImage<UInt16VectorImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<UInt16VectorImageType, Int16VectorImageType>(){
-  return this->SimpleCastImage<UInt16VectorImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<UInt16VectorImageType, UInt16VectorImageType>(){
-  return this->SimpleCastImage<UInt16VectorImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<UInt16VectorImageType, Int32VectorImageType>(){
-  return this->SimpleCastImage<UInt16VectorImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<UInt16VectorImageType, UInt32VectorImageType>(){
-  return this->SimpleCastImage<UInt16VectorImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<UInt16VectorImageType, FloatVectorImageType>(){
-  return this->SimpleCastImage<UInt16VectorImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<UInt16VectorImageType, DoubleVectorImageType>(){
-  return this->SimpleCastImage<UInt16VectorImageType, DoubleVectorImageType>();
-}
-
-/////////// Int32VectorImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<Int32VectorImageType, Int8VectorImageType>(){
-  return this->SimpleCastImage<Int32VectorImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<Int32VectorImageType, UInt8VectorImageType>(){
-  return this->SimpleCastImage<Int32VectorImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<Int32VectorImageType, Int16VectorImageType>(){
-  return this->SimpleCastImage<Int32VectorImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<Int32VectorImageType, UInt16VectorImageType>(){
-  return this->SimpleCastImage<Int32VectorImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<Int32VectorImageType, Int32VectorImageType>(){
-  return this->SimpleCastImage<Int32VectorImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<Int32VectorImageType, UInt32VectorImageType>(){
-  return this->SimpleCastImage<Int32VectorImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<Int32VectorImageType, FloatVectorImageType>(){
-  return this->SimpleCastImage<Int32VectorImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<Int32VectorImageType, DoubleVectorImageType>(){
-  return this->SimpleCastImage<Int32VectorImageType, DoubleVectorImageType>();
-}
-
-
-/////////// UInt32VectorImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<UInt32VectorImageType, Int8VectorImageType>(){
-  return this->SimpleCastImage<UInt32VectorImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<UInt32VectorImageType, UInt8VectorImageType>(){
-  return this->SimpleCastImage<UInt32VectorImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<UInt32VectorImageType, Int16VectorImageType>(){
-  return this->SimpleCastImage<UInt32VectorImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<UInt32VectorImageType, UInt16VectorImageType>(){
-  return this->SimpleCastImage<UInt32VectorImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<UInt32VectorImageType, Int32VectorImageType>(){
-  return this->SimpleCastImage<UInt32VectorImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<UInt32VectorImageType, UInt32VectorImageType>(){
-  return this->SimpleCastImage<UInt32VectorImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<UInt32VectorImageType, FloatVectorImageType>(){
-  return this->SimpleCastImage<UInt32VectorImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<UInt32VectorImageType, DoubleVectorImageType>(){
-  return this->SimpleCastImage<UInt32VectorImageType, DoubleVectorImageType>();
-}
-
-/////////// FloatVectorImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<FloatVectorImageType, Int8VectorImageType>(){
-  return this->SimpleCastImage<FloatVectorImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<FloatVectorImageType, UInt8VectorImageType>(){
-  return this->SimpleCastImage<FloatVectorImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<FloatVectorImageType, Int16VectorImageType>(){
-  return this->SimpleCastImage<FloatVectorImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<FloatVectorImageType, UInt16VectorImageType>(){
-  return this->SimpleCastImage<FloatVectorImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<FloatVectorImageType, Int32VectorImageType>(){
-  return this->SimpleCastImage<FloatVectorImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<FloatVectorImageType, UInt32VectorImageType>(){
-  return this->SimpleCastImage<FloatVectorImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<FloatVectorImageType, FloatVectorImageType>(){
-  return this->SimpleCastImage<FloatVectorImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<FloatVectorImageType, DoubleVectorImageType>(){
-  return this->SimpleCastImage<FloatVectorImageType, DoubleVectorImageType>();
-}
-
-/////////// DoubleVectorImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<DoubleVectorImageType, Int8VectorImageType>(){
-  return this->SimpleCastImage<DoubleVectorImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<DoubleVectorImageType, UInt8VectorImageType>(){
-  return this->SimpleCastImage<DoubleVectorImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<DoubleVectorImageType, Int16VectorImageType>(){
-  return this->SimpleCastImage<DoubleVectorImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<DoubleVectorImageType, UInt16VectorImageType>(){
-  return this->SimpleCastImage<DoubleVectorImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<DoubleVectorImageType, Int32VectorImageType>(){
-  return this->SimpleCastImage<DoubleVectorImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<DoubleVectorImageType, UInt32VectorImageType>(){
-  return this->SimpleCastImage<DoubleVectorImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<DoubleVectorImageType, FloatVectorImageType>(){
-  return this->SimpleCastImage<DoubleVectorImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<DoubleVectorImageType, DoubleVectorImageType>(){
-  return this->SimpleCastImage<DoubleVectorImageType, DoubleVectorImageType>();
-}
-
-
-/*********************************************************************
-********************** RGBAImage -> RGBAImage
-**********************************************************************/
-/////////// Int8RGBAImageType->...
-template <> Int8RGBAImageType *
-InputImageParameter::CastImage<Int8RGBAImageType, Int8RGBAImageType>(){
-  return this->SimpleCastImage<Int8RGBAImageType, Int8RGBAImageType>();
-}
-
-template <> UInt8RGBAImageType *
-InputImageParameter::CastImage<Int8RGBAImageType, UInt8RGBAImageType>(){
-  return this->SimpleCastImage<Int8RGBAImageType, UInt8RGBAImageType>();
-}
-
-template <>  Int16RGBAImageType*
-InputImageParameter::CastImage<Int8RGBAImageType, Int16RGBAImageType>(){
-  return this->SimpleCastImage<Int8RGBAImageType, Int16RGBAImageType>();
-}
-
-template <> UInt16RGBAImageType*
-InputImageParameter::CastImage<Int8RGBAImageType, UInt16RGBAImageType>(){
-  return this->SimpleCastImage<Int8RGBAImageType, UInt16RGBAImageType>();
-}
-
-template <>  Int32RGBAImageType*
-InputImageParameter::CastImage<Int8RGBAImageType, Int32RGBAImageType>(){
-  return this->SimpleCastImage<Int8RGBAImageType, Int32RGBAImageType>();
-}
-
-
-template <>  UInt32RGBAImageType*
-InputImageParameter::CastImage<Int8RGBAImageType, UInt32RGBAImageType>(){
-  return this->SimpleCastImage<Int8RGBAImageType, UInt32RGBAImageType>();
-}
-
-template <> FloatRGBAImageType *
-InputImageParameter::CastImage<Int8RGBAImageType, FloatRGBAImageType>(){
-  return this->SimpleCastImage<Int8RGBAImageType, FloatRGBAImageType>();
-}
-
-template <> DoubleRGBAImageType *
-InputImageParameter::CastImage<Int8RGBAImageType, DoubleRGBAImageType>(){
-  return this->SimpleCastImage<Int8RGBAImageType, DoubleRGBAImageType>();
-}
-
-
-/////////// UInt8RGBAImageType->...
-template <> Int8RGBAImageType *
-InputImageParameter::CastImage<UInt8RGBAImageType, Int8RGBAImageType>(){
-  return this->SimpleCastImage<UInt8RGBAImageType, Int8RGBAImageType>();
-}
-
-template <> UInt8RGBAImageType *
-InputImageParameter::CastImage<UInt8RGBAImageType, UInt8RGBAImageType>(){
-  return this->SimpleCastImage<UInt8RGBAImageType, UInt8RGBAImageType>();
-}
-
-template <>  Int16RGBAImageType*
-InputImageParameter::CastImage<UInt8RGBAImageType, Int16RGBAImageType>(){
-  return this->SimpleCastImage<UInt8RGBAImageType, Int16RGBAImageType>();
-}
-
-template <> UInt16RGBAImageType*
-InputImageParameter::CastImage<UInt8RGBAImageType, UInt16RGBAImageType>(){
-  return this->SimpleCastImage<UInt8RGBAImageType, UInt16RGBAImageType>();
-}
-
-template <>  Int32RGBAImageType*
-InputImageParameter::CastImage<UInt8RGBAImageType, Int32RGBAImageType>(){
-  return this->SimpleCastImage<UInt8RGBAImageType, Int32RGBAImageType>();
-}
-
-
-template <>  UInt32RGBAImageType*
-InputImageParameter::CastImage<UInt8RGBAImageType, UInt32RGBAImageType>(){
-  return this->SimpleCastImage<UInt8RGBAImageType, UInt32RGBAImageType>();
-}
-
-template <> FloatRGBAImageType *
-InputImageParameter::CastImage<UInt8RGBAImageType, FloatRGBAImageType>(){
-  return this->SimpleCastImage<UInt8RGBAImageType, FloatRGBAImageType>();
-}
-
-template <> DoubleRGBAImageType *
-InputImageParameter::CastImage<UInt8RGBAImageType, DoubleRGBAImageType>(){
-  return this->SimpleCastImage<UInt8RGBAImageType, DoubleRGBAImageType>();
-}
-
-/////////// Int16RGBAImageType->...
-template <> Int8RGBAImageType *
-InputImageParameter::CastImage<Int16RGBAImageType, Int8RGBAImageType>(){
-  return this->SimpleCastImage<Int16RGBAImageType, Int8RGBAImageType>();
-}
-
-template <> UInt8RGBAImageType *
-InputImageParameter::CastImage<Int16RGBAImageType, UInt8RGBAImageType>(){
-  return this->SimpleCastImage<Int16RGBAImageType, UInt8RGBAImageType>();
-}
-
-template <>  Int16RGBAImageType*
-InputImageParameter::CastImage<Int16RGBAImageType, Int16RGBAImageType>(){
-  return this->SimpleCastImage<Int16RGBAImageType, Int16RGBAImageType>();
-}
-
-template <> UInt16RGBAImageType*
-InputImageParameter::CastImage<Int16RGBAImageType, UInt16RGBAImageType>(){
-  return this->SimpleCastImage<Int16RGBAImageType, UInt16RGBAImageType>();
-}
-
-template <>  Int32RGBAImageType*
-InputImageParameter::CastImage<Int16RGBAImageType, Int32RGBAImageType>(){
-  return this->SimpleCastImage<Int16RGBAImageType, Int32RGBAImageType>();
-}
-
-
-template <>  UInt32RGBAImageType*
-InputImageParameter::CastImage<Int16RGBAImageType, UInt32RGBAImageType>(){
-  return this->SimpleCastImage<Int16RGBAImageType, UInt32RGBAImageType>();
-}
-
-template <> FloatRGBAImageType *
-InputImageParameter::CastImage<Int16RGBAImageType, FloatRGBAImageType>(){
-  return this->SimpleCastImage<Int16RGBAImageType, FloatRGBAImageType>();
-}
-
-template <> DoubleRGBAImageType *
-InputImageParameter::CastImage<Int16RGBAImageType, DoubleRGBAImageType>(){
-  return this->SimpleCastImage<Int16RGBAImageType, DoubleRGBAImageType>();
-}
-
-/////////// UInt16RGBAImageType->...
-template <> Int8RGBAImageType *
-InputImageParameter::CastImage<UInt16RGBAImageType, Int8RGBAImageType>(){
-  return this->SimpleCastImage<UInt16RGBAImageType, Int8RGBAImageType>();
-}
-
-template <> UInt8RGBAImageType *
-InputImageParameter::CastImage<UInt16RGBAImageType, UInt8RGBAImageType>(){
-  return this->SimpleCastImage<UInt16RGBAImageType, UInt8RGBAImageType>();
-}
-
-template <>  Int16RGBAImageType*
-InputImageParameter::CastImage<UInt16RGBAImageType, Int16RGBAImageType>(){
-  return this->SimpleCastImage<UInt16RGBAImageType, Int16RGBAImageType>();
-}
-
-template <> UInt16RGBAImageType*
-InputImageParameter::CastImage<UInt16RGBAImageType, UInt16RGBAImageType>(){
-  return this->SimpleCastImage<UInt16RGBAImageType, UInt16RGBAImageType>();
-}
-
-template <>  Int32RGBAImageType*
-InputImageParameter::CastImage<UInt16RGBAImageType, Int32RGBAImageType>(){
-  return this->SimpleCastImage<UInt16RGBAImageType, Int32RGBAImageType>();
-}
-
-
-template <>  UInt32RGBAImageType*
-InputImageParameter::CastImage<UInt16RGBAImageType, UInt32RGBAImageType>(){
-  return this->SimpleCastImage<UInt16RGBAImageType, UInt32RGBAImageType>();
-}
-
-template <> FloatRGBAImageType *
-InputImageParameter::CastImage<UInt16RGBAImageType, FloatRGBAImageType>(){
-  return this->SimpleCastImage<UInt16RGBAImageType, FloatRGBAImageType>();
-}
-
-template <> DoubleRGBAImageType *
-InputImageParameter::CastImage<UInt16RGBAImageType, DoubleRGBAImageType>(){
-  return this->SimpleCastImage<UInt16RGBAImageType, DoubleRGBAImageType>();
-}
-
-/////////// Int32RGBAImageType->...
-template <> Int8RGBAImageType *
-InputImageParameter::CastImage<Int32RGBAImageType, Int8RGBAImageType>(){
-  return this->SimpleCastImage<Int32RGBAImageType, Int8RGBAImageType>();
-}
-
-template <> UInt8RGBAImageType *
-InputImageParameter::CastImage<Int32RGBAImageType, UInt8RGBAImageType>(){
-  return this->SimpleCastImage<Int32RGBAImageType, UInt8RGBAImageType>();
-}
-
-template <>  Int16RGBAImageType*
-InputImageParameter::CastImage<Int32RGBAImageType, Int16RGBAImageType>(){
-  return this->SimpleCastImage<Int32RGBAImageType, Int16RGBAImageType>();
-}
-
-template <> UInt16RGBAImageType*
-InputImageParameter::CastImage<Int32RGBAImageType, UInt16RGBAImageType>(){
-  return this->SimpleCastImage<Int32RGBAImageType, UInt16RGBAImageType>();
-}
-
-template <>  Int32RGBAImageType*
-InputImageParameter::CastImage<Int32RGBAImageType, Int32RGBAImageType>(){
-  return this->SimpleCastImage<Int32RGBAImageType, Int32RGBAImageType>();
-}
 
 
-template <>  UInt32RGBAImageType*
-InputImageParameter::CastImage<Int32RGBAImageType, UInt32RGBAImageType>(){
-  return this->SimpleCastImage<Int32RGBAImageType, UInt32RGBAImageType>();
-}
-
-template <> FloatRGBAImageType *
-InputImageParameter::CastImage<Int32RGBAImageType, FloatRGBAImageType>(){
-  return this->SimpleCastImage<Int32RGBAImageType, FloatRGBAImageType>();
-}
-
-template <> DoubleRGBAImageType *
-InputImageParameter::CastImage<Int32RGBAImageType, DoubleRGBAImageType>(){
-  return this->SimpleCastImage<Int32RGBAImageType, DoubleRGBAImageType>();
-}
-
-
-/////////// UInt32RGBAImageType->...
-template <> Int8RGBAImageType *
-InputImageParameter::CastImage<UInt32RGBAImageType, Int8RGBAImageType>(){
-  return this->SimpleCastImage<UInt32RGBAImageType, Int8RGBAImageType>();
-}
-
-template <> UInt8RGBAImageType *
-InputImageParameter::CastImage<UInt32RGBAImageType, UInt8RGBAImageType>(){
-  return this->SimpleCastImage<UInt32RGBAImageType, UInt8RGBAImageType>();
-}
-
-template <>  Int16RGBAImageType*
-InputImageParameter::CastImage<UInt32RGBAImageType, Int16RGBAImageType>(){
-  return this->SimpleCastImage<UInt32RGBAImageType, Int16RGBAImageType>();
-}
-
-template <> UInt16RGBAImageType*
-InputImageParameter::CastImage<UInt32RGBAImageType, UInt16RGBAImageType>(){
-  return this->SimpleCastImage<UInt32RGBAImageType, UInt16RGBAImageType>();
-}
-
-template <>  Int32RGBAImageType*
-InputImageParameter::CastImage<UInt32RGBAImageType, Int32RGBAImageType>(){
-  return this->SimpleCastImage<UInt32RGBAImageType, Int32RGBAImageType>();
-}
-
-
-template <>  UInt32RGBAImageType*
-InputImageParameter::CastImage<UInt32RGBAImageType, UInt32RGBAImageType>(){
-  return this->SimpleCastImage<UInt32RGBAImageType, UInt32RGBAImageType>();
-}
-
-template <> FloatRGBAImageType *
-InputImageParameter::CastImage<UInt32RGBAImageType, FloatRGBAImageType>(){
-  return this->SimpleCastImage<UInt32RGBAImageType, FloatRGBAImageType>();
-}
-
-template <> DoubleRGBAImageType *
-InputImageParameter::CastImage<UInt32RGBAImageType, DoubleRGBAImageType>(){
-  return this->SimpleCastImage<UInt32RGBAImageType, DoubleRGBAImageType>();
-}
-
-/////////// FloatRGBAImageType->...
-template <> Int8RGBAImageType *
-InputImageParameter::CastImage<FloatRGBAImageType, Int8RGBAImageType>(){
-  return this->SimpleCastImage<FloatRGBAImageType, Int8RGBAImageType>();
-}
-
-template <> UInt8RGBAImageType *
-InputImageParameter::CastImage<FloatRGBAImageType, UInt8RGBAImageType>(){
-  return this->SimpleCastImage<FloatRGBAImageType, UInt8RGBAImageType>();
-}
-
-template <>  Int16RGBAImageType*
-InputImageParameter::CastImage<FloatRGBAImageType, Int16RGBAImageType>(){
-  return this->SimpleCastImage<FloatRGBAImageType, Int16RGBAImageType>();
-}
-
-template <> UInt16RGBAImageType*
-InputImageParameter::CastImage<FloatRGBAImageType, UInt16RGBAImageType>(){
-  return this->SimpleCastImage<FloatRGBAImageType, UInt16RGBAImageType>();
-}
-
-template <>  Int32RGBAImageType*
-InputImageParameter::CastImage<FloatRGBAImageType, Int32RGBAImageType>(){
-  return this->SimpleCastImage<FloatRGBAImageType, Int32RGBAImageType>();
-}
-
+#define otbCastImageMacro(InputImageType, OutputImageType, theMethod)   \
+  template<> OutputImageType *                                          \
+  InputImageParameter::CastImage<InputImageType , OutputImageType>()    \
+  {                                                                     \
+    return this->theMethod<InputImageType , OutputImageType>();         \
+  }
 
-template <>  UInt32RGBAImageType*
-InputImageParameter::CastImage<FloatRGBAImageType, UInt32RGBAImageType>(){
-  return this->SimpleCastImage<FloatRGBAImageType, UInt32RGBAImageType>();
-}
+#define otbGenericCastImageMacro(InputImageType, theMethod, prefix)     \
+  otbCastImageMacro(InputImageType, UInt8##prefix##ImageType, theMethod) \
+  otbCastImageMacro(InputImageType, Int8##prefix##ImageType, theMethod) \
+  otbCastImageMacro(InputImageType, UInt16##prefix##ImageType, theMethod) \
+  otbCastImageMacro(InputImageType, Int16##prefix##ImageType, theMethod) \
+  otbCastImageMacro(InputImageType, UInt32##prefix##ImageType, theMethod) \
+  otbCastImageMacro(InputImageType, Int32##prefix##ImageType, theMethod) \
+  otbCastImageMacro(InputImageType, Float##prefix##ImageType, theMethod) \
+  otbCastImageMacro(InputImageType, Double##prefix##ImageType, theMethod)              
 
-template <> FloatRGBAImageType *
-InputImageParameter::CastImage<FloatRGBAImageType, FloatRGBAImageType>(){
-  return this->SimpleCastImage<FloatRGBAImageType, FloatRGBAImageType>();
-}
 
-template <> DoubleRGBAImageType *
-InputImageParameter::CastImage<FloatRGBAImageType, DoubleRGBAImageType>(){
-  return this->SimpleCastImage<FloatRGBAImageType, DoubleRGBAImageType>();
-}
 
-/////////// DoubleRGBAImageType->...
-template <> Int8RGBAImageType *
-InputImageParameter::CastImage<DoubleRGBAImageType, Int8RGBAImageType>(){
-  return this->SimpleCastImage<DoubleRGBAImageType, Int8RGBAImageType>();
-}
+/*********************************************************************
+********************** Image -> Image
+**********************************************************************/
+otbCastImageMacro(Int8ImageType, Int8ImageType, SimpleCastImage )
 
-template <> UInt8RGBAImageType *
-InputImageParameter::CastImage<DoubleRGBAImageType, UInt8RGBAImageType>(){
-  return this->SimpleCastImage<DoubleRGBAImageType, UInt8RGBAImageType>();
-}
+otbGenericCastImageMacro(UInt8ImageType, SimpleCastImage, )
+otbGenericCastImageMacro(Int16ImageType, SimpleCastImage, )
+otbGenericCastImageMacro(UInt16ImageType, SimpleCastImage, )
+otbGenericCastImageMacro(Int32ImageType, SimpleCastImage, )
+otbGenericCastImageMacro(UInt32ImageType, SimpleCastImage, )
+otbGenericCastImageMacro(FloatImageType, SimpleCastImage, )
+otbGenericCastImageMacro(DoubleImageType, SimpleCastImage, )
 
-template <>  Int16RGBAImageType*
-InputImageParameter::CastImage<DoubleRGBAImageType, Int16RGBAImageType>(){
-  return this->SimpleCastImage<DoubleRGBAImageType, Int16RGBAImageType>();
-}
 
-template <> UInt16RGBAImageType*
-InputImageParameter::CastImage<DoubleRGBAImageType, UInt16RGBAImageType>(){
-  return this->SimpleCastImage<DoubleRGBAImageType, UInt16RGBAImageType>();
-}
 
-template <>  Int32RGBAImageType*
-InputImageParameter::CastImage<DoubleRGBAImageType, Int32RGBAImageType>(){
-  return this->SimpleCastImage<DoubleRGBAImageType, Int32RGBAImageType>();
-}
 
+/*********************************************************************
+********************** VectorImage -> VectorImage
+**********************************************************************/
+otbGenericCastImageMacro(Int8VectorImageType, SimpleCastImage, Vector)
+otbGenericCastImageMacro(UInt8VectorImageType, SimpleCastImage, Vector)
+otbGenericCastImageMacro(Int16VectorImageType, SimpleCastImage, Vector)
+otbGenericCastImageMacro(UInt16VectorImageType, SimpleCastImage, Vector)
+otbGenericCastImageMacro(Int32VectorImageType, SimpleCastImage, Vector)
+otbGenericCastImageMacro(UInt32VectorImageType, SimpleCastImage, Vector)
+otbGenericCastImageMacro(FloatVectorImageType, SimpleCastImage, Vector)
+otbGenericCastImageMacro(DoubleVectorImageType, SimpleCastImage, Vector)
 
-template <>  UInt32RGBAImageType*
-InputImageParameter::CastImage<DoubleRGBAImageType, UInt32RGBAImageType>(){
-  return this->SimpleCastImage<DoubleRGBAImageType, UInt32RGBAImageType>();
-}
 
-template <> FloatRGBAImageType *
-InputImageParameter::CastImage<DoubleRGBAImageType, FloatRGBAImageType>(){
-  return this->SimpleCastImage<DoubleRGBAImageType, FloatRGBAImageType>();
-}
 
-template <> DoubleRGBAImageType *
-InputImageParameter::CastImage<DoubleRGBAImageType, DoubleRGBAImageType>(){
-  return this->SimpleCastImage<DoubleRGBAImageType, DoubleRGBAImageType>();
-}
+/*********************************************************************
+********************** RGBAImage -> RGBAImage
+**********************************************************************/
+otbGenericCastImageMacro(Int8RGBAImageType, SimpleCastImage, RGBA)
+otbGenericCastImageMacro(UInt8RGBAImageType, SimpleCastImage, RGBA)
+otbGenericCastImageMacro(Int16RGBAImageType, SimpleCastImage, RGBA)
+otbGenericCastImageMacro(UInt16RGBAImageType, SimpleCastImage, RGBA)
+otbGenericCastImageMacro(Int32RGBAImageType, SimpleCastImage, RGBA)
+otbGenericCastImageMacro(UInt32RGBAImageType, SimpleCastImage, RGBA)
+otbGenericCastImageMacro(FloatRGBAImageType, SimpleCastImage, RGBA)
+otbGenericCastImageMacro(DoubleRGBAImageType, SimpleCastImage, RGBA)
 
 
 /*********************************************************************
 ********************** Image -> VectorImage
 **********************************************************************/
-/////////// Int8ImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<Int8ImageType, Int8VectorImageType>(){
-  return this->CastVectorImageFromImage<Int8ImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<Int8ImageType, UInt8VectorImageType>(){
-  return this->CastVectorImageFromImage<Int8ImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<Int8ImageType, Int16VectorImageType>(){
-  return this->CastVectorImageFromImage<Int8ImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<Int8ImageType, UInt16VectorImageType>(){
-  return this->CastVectorImageFromImage<Int8ImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<Int8ImageType, Int32VectorImageType>(){
-  return this->CastVectorImageFromImage<Int8ImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<Int8ImageType, UInt32VectorImageType>(){
-  return this->CastVectorImageFromImage<Int8ImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<Int8ImageType, FloatVectorImageType>(){
-  return this->CastVectorImageFromImage<Int8ImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<Int8ImageType, DoubleVectorImageType>(){
-  return this->CastVectorImageFromImage<Int8ImageType, DoubleVectorImageType>();
-}
-
-
-/////////// UInt8ImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<UInt8ImageType, Int8VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt8ImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<UInt8ImageType, UInt8VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt8ImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<UInt8ImageType, Int16VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt8ImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<UInt8ImageType, UInt16VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt8ImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<UInt8ImageType, Int32VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt8ImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<UInt8ImageType, UInt32VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt8ImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<UInt8ImageType, FloatVectorImageType>(){
-  return this->CastVectorImageFromImage<UInt8ImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<UInt8ImageType, DoubleVectorImageType>(){
-  return this->CastVectorImageFromImage<UInt8ImageType, DoubleVectorImageType>();
-}
-
-/////////// Int16ImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<Int16ImageType, Int8VectorImageType>(){
-  return this->CastVectorImageFromImage<Int16ImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<Int16ImageType, UInt8VectorImageType>(){
-  return this->CastVectorImageFromImage<Int16ImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<Int16ImageType, Int16VectorImageType>(){
-  return this->CastVectorImageFromImage<Int16ImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<Int16ImageType, UInt16VectorImageType>(){
-  return this->CastVectorImageFromImage<Int16ImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<Int16ImageType, Int32VectorImageType>(){
-  return this->CastVectorImageFromImage<Int16ImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<Int16ImageType, UInt32VectorImageType>(){
-  return this->CastVectorImageFromImage<Int16ImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<Int16ImageType, FloatVectorImageType>(){
-  return this->CastVectorImageFromImage<Int16ImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<Int16ImageType, DoubleVectorImageType>(){
-  return this->CastVectorImageFromImage<Int16ImageType, DoubleVectorImageType>();
-}
-
-/////////// UInt16VectorImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<UInt16ImageType, Int8VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt16ImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<UInt16ImageType, UInt8VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt16ImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<UInt16ImageType, Int16VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt16ImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<UInt16ImageType, UInt16VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt16ImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<UInt16ImageType, Int32VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt16ImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<UInt16ImageType, UInt32VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt16ImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<UInt16ImageType, FloatVectorImageType>(){
-  return this->CastVectorImageFromImage<UInt16ImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<UInt16ImageType, DoubleVectorImageType>(){
-  return this->CastVectorImageFromImage<UInt16ImageType, DoubleVectorImageType>();
-}
-
-/////////// Int32ImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<Int32ImageType, Int8VectorImageType>(){
-  return this->CastVectorImageFromImage<Int32ImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<Int32ImageType, UInt8VectorImageType>(){
-  return this->CastVectorImageFromImage<Int32ImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<Int32ImageType, Int16VectorImageType>(){
-  return this->CastVectorImageFromImage<Int32ImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<Int32ImageType, UInt16VectorImageType>(){
-  return this->CastVectorImageFromImage<Int32ImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<Int32ImageType, Int32VectorImageType>(){
-  return this->CastVectorImageFromImage<Int32ImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<Int32ImageType, UInt32VectorImageType>(){
-  return this->CastVectorImageFromImage<Int32ImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<Int32ImageType, FloatVectorImageType>(){
-  return this->CastVectorImageFromImage<Int32ImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<Int32ImageType, DoubleVectorImageType>(){
-  return this->CastVectorImageFromImage<Int32ImageType, DoubleVectorImageType>();
-}
-
-
-/////////// UInt32ImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<UInt32ImageType, Int8VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt32ImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<UInt32ImageType, UInt8VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt32ImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<UInt32ImageType, Int16VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt32ImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<UInt32ImageType, UInt16VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt32ImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<UInt32ImageType, Int32VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt32ImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<UInt32ImageType, UInt32VectorImageType>(){
-  return this->CastVectorImageFromImage<UInt32ImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<UInt32ImageType, FloatVectorImageType>(){
-  return this->CastVectorImageFromImage<UInt32ImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<UInt32ImageType, DoubleVectorImageType>(){
-  return this->CastVectorImageFromImage<UInt32ImageType, DoubleVectorImageType>();
-}
-
-/////////// FloatImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<FloatImageType, Int8VectorImageType>(){
-  return this->CastVectorImageFromImage<FloatImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<FloatImageType, UInt8VectorImageType>(){
-  return this->CastVectorImageFromImage<FloatImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<FloatImageType, Int16VectorImageType>(){
-  return this->CastVectorImageFromImage<FloatImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<FloatImageType, UInt16VectorImageType>(){
-  return this->CastVectorImageFromImage<FloatImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<FloatImageType, Int32VectorImageType>(){
-  return this->CastVectorImageFromImage<FloatImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<FloatImageType, UInt32VectorImageType>(){
-  return this->CastVectorImageFromImage<FloatImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<FloatImageType, FloatVectorImageType>(){
-  return this->CastVectorImageFromImage<FloatImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<FloatImageType, DoubleVectorImageType>(){
-  return this->CastVectorImageFromImage<FloatImageType, DoubleVectorImageType>();
-}
-
-/////////// DoubleImageType->...
-template <> Int8VectorImageType *
-InputImageParameter::CastImage<DoubleImageType, Int8VectorImageType>(){
-  return this->CastVectorImageFromImage<DoubleImageType, Int8VectorImageType>();
-}
-
-template <> UInt8VectorImageType *
-InputImageParameter::CastImage<DoubleImageType, UInt8VectorImageType>(){
-  return this->CastVectorImageFromImage<DoubleImageType, UInt8VectorImageType>();
-}
-
-template <>  Int16VectorImageType*
-InputImageParameter::CastImage<DoubleImageType, Int16VectorImageType>(){
-  return this->CastVectorImageFromImage<DoubleImageType, Int16VectorImageType>();
-}
-
-template <> UInt16VectorImageType*
-InputImageParameter::CastImage<DoubleImageType, UInt16VectorImageType>(){
-  return this->CastVectorImageFromImage<DoubleImageType, UInt16VectorImageType>();
-}
-
-template <>  Int32VectorImageType*
-InputImageParameter::CastImage<DoubleImageType, Int32VectorImageType>(){
-  return this->CastVectorImageFromImage<DoubleImageType, Int32VectorImageType>();
-}
-
-
-template <>  UInt32VectorImageType*
-InputImageParameter::CastImage<DoubleImageType, UInt32VectorImageType>(){
-  return this->CastVectorImageFromImage<DoubleImageType, UInt32VectorImageType>();
-}
-
-template <> FloatVectorImageType *
-InputImageParameter::CastImage<DoubleImageType, FloatVectorImageType>(){
-  return this->CastVectorImageFromImage<DoubleImageType, FloatVectorImageType>();
-}
-
-template <> DoubleVectorImageType *
-InputImageParameter::CastImage<DoubleImageType, DoubleVectorImageType>(){
-  return this->CastVectorImageFromImage<DoubleImageType, DoubleVectorImageType>();
-}
+otbGenericCastImageMacro(Int8ImageType, CastVectorImageFromImage, Vector)
+otbGenericCastImageMacro(UInt8ImageType, CastVectorImageFromImage, Vector)
+otbGenericCastImageMacro(Int16ImageType, CastVectorImageFromImage, Vector)
+otbGenericCastImageMacro(UInt16ImageType, CastVectorImageFromImage, Vector)
+otbGenericCastImageMacro(Int32ImageType, CastVectorImageFromImage, Vector)
+otbGenericCastImageMacro(UInt32ImageType, CastVectorImageFromImage, Vector)
+otbGenericCastImageMacro(FloatImageType, CastVectorImageFromImage, Vector)
+otbGenericCastImageMacro(DoubleImageType, CastVectorImageFromImage, Vector)
 
 
 void
-- 
GitLab