Main Page   Groups   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members   Concepts

itkImageToImageFilterDetail.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Insight Segmentation & Registration Toolkit
00004   Module:    $RCSfile: itkImageToImageFilterDetail.h,v $
00005   Language:  C++
00006   Date:      $Date: 2005/05/13 19:44:21 $
00007   Version:   $Revision: 1.8 $
00008 
00009   Copyright (c) Insight Software Consortium. All rights reserved.
00010   See ITKCopyright.txt or http://www.itk.org/HTML/Copyright.htm for details.
00011 
00012   Portions of this code are covered under the VTK copyright.
00013   See VTKCopyright.txt or http://www.kitware.com/VTKCopyright.htm for details.
00014 
00015      This software is distributed WITHOUT ANY WARRANTY; without even 
00016      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00017      PURPOSE.  See the above copyright notices for more information.
00018 
00019 =========================================================================*/
00020 #ifndef __itkImageToImageFilterDetail_h
00021 #define __itkImageToImageFilterDetail_h
00022 
00023 #include "itkImageRegion.h"
00024 #include "itkSmartPointer.h"
00025 
00026 namespace itk
00027 {
00028 
00037 namespace ImageToImageFilterDetail
00038 {
00047   struct DispatchBase {};
00048 
00056   template <bool>
00057   struct BooleanDispatch {};
00058 
00067   template <int>
00068   struct IntDispatch : public DispatchBase {};
00069   
00084   template <unsigned int>
00085   struct UnsignedIntDispatch : public DispatchBase {};
00086 
00094   template <bool B1, bool B2>
00095   struct BinaryBooleanDispatch
00096   {
00099     typedef BooleanDispatch<B1> FirstType;
00100     typedef BooleanDispatch<B2> SecondType;
00101   };
00102 
00109   template <int D1, int D2>
00110   struct BinaryIntDispatch
00111   {
00114     typedef IntDispatch<D1> FirstType;
00115     typedef IntDispatch<D2> SecondType;
00116   };
00117   
00129   template <unsigned int D1, unsigned int D2>
00130   struct BinaryUnsignedIntDispatch : public DispatchBase
00131   {
00134     typedef UnsignedIntDispatch<D1> FirstType;
00135     typedef UnsignedIntDispatch<D2> SecondType;
00136     
00152     typedef IntDispatch<(D1 > D2) - (D1 < D2)> ComparisonType;
00153     typedef IntDispatch<0>  FirstEqualsSecondType;  
00154     typedef IntDispatch<1>  FirstGreaterThanSecondType;  
00155     typedef IntDispatch<-1> FirstLessThanSecondType;  
00156   };
00157 
00174   template <unsigned int D1, unsigned int D2>
00175   void ImageToImageFilterDefaultCopyRegion(const typename
00176                   BinaryUnsignedIntDispatch<D1, D2>::FirstEqualsSecondType &,
00177                   ImageRegion<D1> &destRegion,
00178                   const ImageRegion<D2> &srcRegion)
00179   {
00180     destRegion = srcRegion;
00181   }
00182 
00199   template <unsigned int D1, unsigned int D2>
00200   void ImageToImageFilterDefaultCopyRegion(const typename
00201                   BinaryUnsignedIntDispatch<D1, D2>::FirstLessThanSecondType &,
00202                   ImageRegion<D1> &destRegion,
00203                   const ImageRegion<D2> &srcRegion)
00204   {
00205     // Source dimension is greater than the destination dimension, copy the
00206     // first part of the source into the destination
00207     unsigned int dim;
00208     Index<D1> destIndex;
00209     Size<D1>  destSize;
00210     const Index<D2> &srcIndex = srcRegion.GetIndex();
00211     const Size<D2> &srcSize = srcRegion.GetSize();
00212     
00213     // copy what we can
00214     for (dim=0; dim < D1; ++dim)
00215       {
00216       destIndex[dim] = srcIndex[dim];
00217       destSize[dim] = srcSize[dim];
00218       }
00219     
00220     destRegion.SetIndex(destIndex);
00221     destRegion.SetSize(destSize);
00222   }
00223   
00240   template <unsigned int D1, unsigned int D2>
00241   void ImageToImageFilterDefaultCopyRegion(const typename
00242                BinaryUnsignedIntDispatch<D1, D2>::FirstGreaterThanSecondType &,
00243                ImageRegion<D1> &destRegion,
00244                const ImageRegion<D2> &srcRegion)
00245   {
00246     // Source dimension is less than the destination dimension, copy source
00247     // into the first part of the destination and set zeros elsewhere.
00248     unsigned int dim;
00249     Index<D1> destIndex;
00250     Size<D1>  destSize;
00251     const Index<D2> &srcIndex = srcRegion.GetIndex();
00252     const Size<D2> &srcSize = srcRegion.GetSize();
00253     
00254     // copy what we can
00255     for (dim=0; dim < D2; ++dim)
00256       {
00257       destIndex[dim] = srcIndex[dim];
00258       destSize[dim] = srcSize[dim];
00259       }
00260     // fill in the rest of the dimensions with zero/one
00261     for (; dim < D1; ++dim)
00262       {
00263       destIndex[dim] = 0;
00264       destSize[dim] = 1;
00265       }
00266     
00267     destRegion.SetIndex(destIndex);
00268     destRegion.SetSize(destSize);
00269   }
00270 
00271 
00308   template <unsigned int D1, unsigned int D2>
00309     class ITK_EXPORT ImageRegionCopier 
00310   {
00311   public:
00312     virtual void operator() (ImageRegion<D1> &destRegion,
00313                             const ImageRegion<D2> &srcRegion) const
00314     {
00315       typedef typename BinaryUnsignedIntDispatch<D1, D2>::ComparisonType ComparisonType;
00316       ImageToImageFilterDefaultCopyRegion<D1, D2>(
00317                       ComparisonType(),
00318                       destRegion, srcRegion);
00319     }
00320     virtual ~ImageRegionCopier() {}
00321   };
00322 
00323 
00326   template<unsigned int D1, unsigned int D2>
00327   std::ostream & operator<<(std::ostream &os, const ImageRegionCopier<D1, D2> &
00328                             copier)
00329   {
00330     os << "ImageRegionCopier: "
00331        << typeid(ImageRegionCopier<D1, D2>).name() << std::endl;
00332     return os;
00333   }
00334 
00336   template<unsigned int D1, unsigned int D2>
00337   bool operator!=(const ImageRegionCopier<D1, D2> &c1,
00338                   const ImageRegionCopier<D1, D2> &c2)
00339   {
00340     return &c1 != &c2;
00341   }
00342   
00343 } // end of namespace ImageToImageFilterDetail
00344     
00345 } // end namespace itk
00346 
00347 //#ifndef ITK_MANUAL_INSTANTIATION
00348 //#include "itkImageToImageFilterDetail.txx"
00349 //#endif
00350 
00351 #endif

Generated at Wed May 24 23:27:02 2006 for ITK by doxygen 1.3.5 written by Dimitri van Heesch, © 1997-2000