Kent,
I think I am leaning towards recommending that dynamic_cast be use.
1) Compared to the other overhead in the GetInput methods will be a very small
fraction.
2) The ImageSource::GetOutput and the ImageToImage::GetInput, already have a
dynamic_cast in it.
3) I have encountered at least 5 filters which were using incorrect types with
the GetInput/Output methods... They work until the point something changed in
ITK and they stopped.
As I am not a fan of macro, and try to use the so much more easy to read an
understand template functions :) Please consider using a template function as
opposed to a macro.
Please also see the recently updated GetOutput method, which includes a couple
cases recommended by Jim.
template< class TOutputImage >
typename ImageSource< TOutputImage >::OutputImageType *
ImageSource< TOutputImage >
::GetOutput(unsigned int idx)
{
TOutputImage *out = dynamic_cast< TOutputImage * >
( this->ProcessObject::GetOutput(idx) );
if ( out == NULL && this->ProcessObject::GetOutput(idx) != NULL )
{
itkWarningMacro (<< "Unable to convert output number " << idx << " to type
" << typeid( OutputImageType ).name () );
}
return out;
}
On Jul 24, 2012, at 10:23 AM, Williams, Norman K wrote:
> I'm not %100 sold on going to dynamic cast for GetInput, myself. I will
> say that if we key off the build type, the performance hit would be
> limited to Debug builds.
>
> But a real world scenario that this would help with: I recently did some
> work on a filter that was written with ITK3 that didn't work on ITK4. The
> problem was that whoever wrote the filter assigned an optional input to
> input 0 of the filter. ITK4 checks for a missing input 0, meaning the
> filter threw an exception before actually doing any work.
>
> So I went through the filter and re-assigned the inputs such that the
> required input was input 0, and the other inputs were re-numbered. In the
> course of that, I missed one place where I should have changed indices,
> and Hans ended up having to spend time debugging the problem. As it
> happened, inputs 1 and 2 have different image types, but since static_cast
> was used to return them, it was silently using swapped inputs and
> producing nonsense.
>
> That's the case that dynamic_cast would address -- fumblefingers
> programmers (e.g. me) putting the wrong objects in the wrong input slots.
>
> On the other hand, the replacement for static_cast would require
> considerably more work, for example:
>
> template< class TInputSpatialObject, class TOutputImage >
> const typename SpatialObjectToImageFilter< TInputSpatialObject,
> TOutputImage >::InputSpatialObjectType *
> SpatialObjectToImageFilter< TInputSpatialObject, TOutputImage >
> ::GetInput(unsigned int idx)
> {
> #if BUILD_TYPE_RELEASE // actually all this would go in a macro
> return static_cast< const TInputSpatialObject * >
> ( this->ProcessObject::GetInput(idx) );
> #else
> DataObject *rval = this->ProcessObject::GetInput(idx);
> if(rval == 0) // unassigned
> {
> return 0;
> }
> const TInputSpatialObject *rval2 =
> dynamic_cast<const TInputSpatialObject *>(rval);
> if(rval2 == 0)
> {
> itkExceptionMacro(<< "Cast failed, wrong object type "
> << rval->GetNameOfClass());
> }
> return rval;
> #endif
> }
>
> Another point in favor of using dynamic_cast: the performance penalty of
> using it only matters if you call it a lot. I just spent a week getting
> rid of code that did this.
>
>
>
> ________________________________
> Notice: This UI Health Care e-mail (including attachments) is covered by the
> Electronic Communications Privacy Act, 18 U.S.C. 2510-2521, is confidential
> and may be legally privileged. If you are not the intended recipient, you
> are hereby notified that any retention, dissemination, distribution, or
> copying of this communication is strictly prohibited. Please reply to the
> sender that you have received the message in error, then delete it. Thank
> you.
> ________________________________
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://kitware.com/products/protraining.php
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-developers
========================================================
Bradley Lowekamp
Medical Science and Computing for
Office of High Performance Computing and Communications
National Library of Medicine
[email protected]
_______________________________________________
Powered by www.kitware.com
Visit other Kitware open-source projects at
http://www.kitware.com/opensource/opensource.html
Kitware offers ITK Training Courses, for more information visit:
http://kitware.com/products/protraining.php
Please keep messages on-topic and check the ITK FAQ at:
http://www.itk.org/Wiki/ITK_FAQ
Follow this link to subscribe/unsubscribe:
http://www.itk.org/mailman/listinfo/insight-developers