<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Kent,<div><br></div><div>I think I am leaning towards recommending that dynamic_cast be use.&nbsp;</div><div><br></div><div>1) Compared to the other overhead in the GetInput methods will be a very small fraction.</div><div><br></div><div>2) &nbsp;The ImageSource::GetOutput and the ImageToImage::GetInput, already have a dynamic_cast in it.</div><div><br></div><div>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.</div><div><br></div><div>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.</div><div><br></div><div>Please also see the recently updated GetOutput method, which includes a couple cases recommended by Jim.</div><div><br></div><div><div>template&lt; class TOutputImage &gt;</div><div>typename ImageSource&lt; TOutputImage &gt;::OutputImageType *</div><div>ImageSource&lt; TOutputImage &gt;</div><div>::GetOutput(unsigned int idx)</div><div>{</div><div>&nbsp; TOutputImage *out = dynamic_cast&lt; TOutputImage * &gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ( this-&gt;ProcessObject::GetOutput(idx) );</div><div><br></div><div>&nbsp; if ( out == NULL &amp;&amp; this-&gt;ProcessObject::GetOutput(idx) != NULL )</div><div>&nbsp; &nbsp; {</div><div>&nbsp; &nbsp; itkWarningMacro (&lt;&lt; "Unable to convert output number " &lt;&lt; idx &lt;&lt; " to type " &lt;&lt; &nbsp;typeid( OutputImageType ).name () );</div><div>&nbsp; &nbsp; }</div><div>&nbsp; return out;</div><div>}</div></div><div><br></div><div><br></div><div><br><div><div>On Jul 24, 2012, at 10:23 AM, Williams, Norman K wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div>I'm not %100 sold on going to dynamic cast for GetInput, myself. &nbsp;I will<br>say that if we key off the build type, the performance hit would be<br>limited to Debug builds.<br><br>But a real world scenario that this would help with: I recently did some<br>work on a filter that was written with ITK3 that didn't work on ITK4. &nbsp;The<br>problem was that whoever wrote the filter assigned an optional input to<br>input 0 of the filter. ITK4 checks for a missing input 0, meaning the<br>filter threw an exception before actually doing any work.<br><br>So I went through the filter and re-assigned the inputs such that the<br>required input was input 0, and the other inputs were re-numbered. &nbsp;In the<br>course of that, I missed one place where I should have changed indices,<br>and Hans ended up having to spend time debugging the problem. &nbsp;As it<br>happened, inputs 1 and 2 have different image types, but since static_cast<br>was used to return them, it was silently using swapped inputs and<br>producing nonsense.<br><br>That's the case that dynamic_cast would address -- fumblefingers<br>programmers (e.g. me) putting the wrong objects in the wrong input slots.<br><br>On the other hand, the replacement for static_cast would require<br>considerably more work, for example:<br><br>template&lt; class TInputSpatialObject, class TOutputImage &gt;<br>const typename SpatialObjectToImageFilter&lt; TInputSpatialObject,<br>TOutputImage &gt;::InputSpatialObjectType *<br>SpatialObjectToImageFilter&lt; TInputSpatialObject, TOutputImage &gt;<br>::GetInput(unsigned int idx)<br>{<br>#if BUILD_TYPE_RELEASE // actually all this would go in a macro<br> &nbsp;return static_cast&lt; const TInputSpatialObject * &gt;<br> &nbsp;&nbsp;&nbsp;( this-&gt;ProcessObject::GetInput(idx) );<br>#else<br> &nbsp;DataObject *rval = this-&gt;ProcessObject::GetInput(idx);<br> &nbsp;if(rval == 0) // unassigned<br> &nbsp;&nbsp;&nbsp;{<br> &nbsp;&nbsp;&nbsp;return 0;<br> &nbsp;&nbsp;&nbsp;}<br> &nbsp;const TInputSpatialObject *rval2 =<br> &nbsp;&nbsp;&nbsp;dynamic_cast&lt;const TInputSpatialObject *&gt;(rval);<br> &nbsp;if(rval2 == 0)<br> &nbsp;&nbsp;{<br> &nbsp;&nbsp;itkExceptionMacro(&lt;&lt; "Cast failed, wrong object type "<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;&lt; rval-&gt;GetNameOfClass());<br> &nbsp;&nbsp;}<br> &nbsp;return rval;<br>#endif<br>}<br><br>Another point in favor of using dynamic_cast: the performance penalty of<br>using it only matters if you call it a lot. &nbsp;I just spent a week getting<br>rid of code that did this.<br><br><br><br>________________________________<br>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. &nbsp;If you are not the intended recipient, you are hereby notified that any retention, dissemination, distribution, or copying of this communication is strictly prohibited. &nbsp;Please reply to the sender that you have received the message in error, then delete it. &nbsp;Thank you.<br>________________________________<br>_______________________________________________<br>Powered by <a href="http://www.kitware.com">www.kitware.com</a><br><br>Visit other Kitware open-source projects at<br><a href="http://www.kitware.com/opensource/opensource.html">http://www.kitware.com/opensource/opensource.html</a><br><br>Kitware offers ITK Training Courses, for more information visit:<br>http://kitware.com/products/protraining.php<br><br>Please keep messages on-topic and check the ITK FAQ at:<br>http://www.itk.org/Wiki/ITK_FAQ<br><br>Follow this link to subscribe/unsubscribe:<br>http://www.itk.org/mailman/listinfo/insight-developers<br></div></blockquote></div><br><div>
<span class="Apple-style-span" style="font-size: 12px; "><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; -webkit-text-decorations-in-effect: none; text-indent: 0px; -webkit-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: normal normal normal 12px/normal Helvetica; ">========================================================</font></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: normal normal normal 12px/normal Helvetica; ">Bradley Lowekamp<span class="Apple-converted-space">&nbsp;</span><span class="Apple-converted-space">&nbsp;</span></font></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: normal normal normal 12px/normal Helvetica; ">Medical Science and Computing for</font></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: normal normal normal 12px/normal Helvetica; ">Office of High Performance Computing and Communications</font></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: normal normal normal 12px/normal Helvetica; ">National Library of Medicine<span class="Apple-converted-space">&nbsp;</span></font></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><font face="Helvetica" size="3" style="font: normal normal normal 12px/normal Helvetica; "><a href="mailto:blowekamp@mail.nih.gov">blowekamp@mail.nih.gov</a></font></p><br class="Apple-interchange-newline"></span></div></span><br class="Apple-interchange-newline">
</div>
<br></div></body></html>