[Insight-developers] concept checking macros

Joshua Cates cates@sci.utah.edu
Mon, 13 Jan 2003 16:12:28 -0700 (MST)


Oops, in the previous email, for 2) replace

>       typename T1::IsFloating a;

with 

typename itk::NumericTraits<T1>::IsFloating a;


Josh.


On Mon, 13 Jan 2003, Joshua Cates wrote:

> Hello,
> 
> I'm trying to use the itk concept checking macro to restrict some filter
> output image type to floating point.  I have two ideas for doing this and
> would like some input on what people think looks better--or other ideas.  
> Perhaps there is even a way to do this with Concepts which have already
> defined?
> 
> 
> 
> 1) Add to itkConceptChecking.h
> 
> /** Concept requiring T1 to be a floating point type. */
> template <typename T1>
> struct IsFloating
> {
>   struct Constraints
>   {
>     void constraints()
>     {
>       a = std::_Is_integer<T1>();
>       Detail::IgnoreUnusedVariable(a);
>     }
>     std::__false_type a;
>   };
>   itkConceptConstraintsMacro();
> };
> 
> 
> 2) Add a typedef void IsFloating to numeric traits classes for float, 
> double, long double.
> 
> Then add to itkConceptChecking.h
> 
> template <typename T1>
> struct IsFloating
> {
>   struct Constraints
>   {
>     void constraints()
>     {
>       typename T1::IsFloating a;
>       Detail::IgnoreUnusedVariable(a);
>     } 
>   };
>   itkConceptConstraintsMacro();
> };
> 
> 
> Here is my test program:
> 
> -----------------------------------------------------------------
> #include "itkImageToImageFilter.h"
> #include "itkImage.h"
> 
> namespace itk {
> 
> template <class TInputImage, class TOutputImage>
> class ConceptChecker : public ImageToImageFilter<TInputImage, 
> TOutputImage>
> {
> public:
>   /** Standard "Self" & Superclass typedef. */
>   typedef ConceptChecker Self;
>   typedef ImageToImageFilter< TInputImage, TOutputImage > Superclass;
>   typedef       SmartPointer<Self> Pointer;
>   typedef SmartPointer<const Self> ConstPointer;
> 
>   /** Method for creation through the object factory. */
>   itkNewMacro(Self);
> 
>   /** Run-time type information (and related methods). */
>   itkTypeMacro(ConceptChecker, ImageToImageFilter);
> 
>   /** Extract some information from the image types.  Dimensionality
>    * of the two images is assumed to be the same. */
>   itkStaticConstMacro(ImageDimension, unsigned int,
>                       TOutputImage::ImageDimension);
> 
>   typedef typename TOutputImage::PixelType OutputPixelType;
>   
>   /** Concept checking.  Ensure that the output pixel type is a floating  point type. */
>   itkConceptMacro(PixelTypeIsFloating, (Concept::IsFloating<OutputPixelType>));
> 
> };
> 
> }// end namespace itk
> 
> 
> struct bad_pixel_type
> {    int i; };
> 
> int main()
> {
>   
>   typedef itk::Image<float, 2> FloatImageType;
>   typedef itk::Image<bad_pixel_type, 2> BadImageType;
> 
>   itk::ConceptChecker<FloatImageType, BadImageType>::Pointer c
>     = itk::ConceptChecker<FloatImageType, BadImageType>::New();
>   
>   return 0;
> }
> -----------------------------------------------------------------------------------------
> 
> Option 1 gives output which I think folks will find confusing:
> 
> /home/cates/Insight/Code/Common/itkConceptChecking.h: In method `void
> itk::Concept::IsFloating<T1>::Constraints::constraints () [with T1 = 
> bad_pixel_type]':
> /home/cates/Insight/Code/Common/itkConceptChecking.h:354:   instantiated 
> from `itk::Concept::IsFloating<bad_pixel_type>'
> /home/cates/SampleProject/concept.cxx:48:   instantiated from 
> `itk::ConceptChecker<main ()::FloatImageType, main ()::BadImageType>'
> /home/cates/SampleProject/concept.cxx:48:   instantiated from here
> /home/cates/Insight/Code/Common/itkConceptChecking.h:349: no match for 
> `__false_type & =
> _Is_integer<bad_pixel_type>'
> /usr/include/g++-3/type_traits.h:59: candidates are: __false_type
> &__false_type::operator= (const __false_type &)
> 
> Also I do not know if <type_traits.h> is standard on all platforms.
> 
> 
> Option 2 gives output which is maybe only slightly less confusing:
> 
> /home/cates/Insight/Code/Common/itkConceptChecking.h: In method `void
> itk::Concept::IsFloating<T1>::Constraints::constraints () [with T1 = 
> bad_pixel_type]':
> /home/cates/Insight/Code/Common/itkConceptChecking.h:368:   instantiated 
> from `itk::Concept::IsFloating<bad_pixel_type>'
> /home/cates/SampleProject/concept.cxx:48:   instantiated from 
> `itk::ConceptChecker<main ()::FloatImageType, main ()::BadImageType>'
> /home/cates/SampleProject/concept.cxx:48:   instantiated from here
> /home/cates/Insight/Code/Common/itkConceptChecking.h:364: no type named 
> `IsFloating' in `struct
> bad_pixel_type'
> /home/cates/Insight/Code/Common/itkConceptChecking.h:365: `a' undeclared 
> (first use this function)
> /home/cates/Insight/Code/Common/itkConceptChecking.h:365: (Each undeclared 
> identifier is reported only
> 
> 
> ______________________________
>  Josh Cates			
>  School of Computer Science	
>  University of Utah
>  Email: cates@sci.utah.edu
>  Phone: (801) 587-7697
>  URL:   http://www.sci.utah.edu/~cates
> 
> 
> _______________________________________________
> Insight-developers mailing list
> Insight-developers@public.kitware.com
> http://public.kitware.com/mailman/listinfo/insight-developers
>