[Insight-developers] question about preprocessor condition in itk::QuadEdgeMesh<>::AddFace method
Arnaud Gelas
arnaudgelas at gmail.com
Tue Apr 17 05:09:51 EDT 2012
Alex,
Thanks for the quick reply! You made me realized that I was looking at
the code in Release with deb info :)
Here are the default value for CMAKE (at least on my machine)
CMAKE_CXX_FLAGS_DEBUG -g
CMAKE_CXX_FLAGS_MINSIZEREL -Os -DNDEBUG
CMAKE_CXX_FLAGS_RELEASE -O3 -DNDEBUG
CMAKE_CXX_FLAGS_RELWITHDEBINFO -O2 -g
CMAKE_C_FLAGS_DEBUG -g
CMAKE_C_FLAGS_MINSIZEREL -Os -DNDEBUG
CMAKE_C_FLAGS_RELEASE -O3 -DNDEBUG
CMAKE_C_FLAGS_RELWITHDEBINFO -O2 -g
As you can see NDEBUG is defined in Release and I guess it should be the
same on all platform (?)
Thanks,
Arnaud
On 04/17/2012 10:51 AM, Alexandre GOUAILLARD wrote:
> Dear arnaud,
>
> The QuadEdgeMesh classes are checking for half the world out there
> (and their moms) which is great in term of robustness, but bad in term
> of speed. Especially, it was great when writing those classes, and
> when creating a QEMesh, but it is disastrous in term of performance in
> a pipeline, when the input is already a QEMesh.
>
> Using NDEBUG was an attempt during one of the SLC project week at
> speed up QE filters by:
> 1 - checking things only in debug mode.
> 2 - Know when the mesh is already "secure" and bypass the tests during
> copy for example
> Note that 1 is a very crude attempt, as NDEBUG is not standard, and I
> m open to suggestions on how to make it better / more standard / cross
> platform.
>
> For this specific code, the idea would be to go ahead with the test
> only in debug mode, i.e. only when NDEBUG is *NOT* defined (MSVC
> defines NDEBUG for you in release mode, as well as _DEBUG. NDEBUG is
> specifically for asserts, _DEBUG is supposed to be used for CRT.)
>
> HTH.
>
> regards,
>
> alex.
> PS: enjoy european food for us ;-)
>
> On Tue, Apr 17, 2012 at 3:59 PM, Arnaud Gelas<arnaudgelas at gmail.com> wrote:
>> Hi Alex,
>>
>> In the AddFace method of itk::QuadEdgeMesh, there is a preprocessor
>> condition (#ifndef NDEBUG, see code below).
>> Is it correct to make these tests only when NDEBUG is undefined? Is it the
>> other way around? or should it be tested all the time?
>>
>> Thanks,
>> Arnaud
>>
>> ---
>>
>> template< typename TPixel, unsigned int VDimension, typename TTraits>
>> typename QuadEdgeMesh< TPixel, VDimension, TTraits>::QEPrimal *
>> QuadEdgeMesh< TPixel, VDimension, TTraits>
>> ::AddFace(const PointIdList& points)
>> {
>> #ifndef NDEBUG
>> // Check that there are no duplicate points
>> for ( size_t i = 0; i< points.size(); i++ )
>> {
>> typename PointIdList::const_iterator itr = points.begin();
>> typename PointIdList::const_iterator end = points.end();
>> PointIdentifier count = NumericTraits< PointIdentifier>::Zero;
>> const PointIdentifier pointId = points[i];
>> while ( itr != end )
>> {
>> if ( *itr == pointId )
>> {
>> ++count;
>> }
>> ++itr;
>> }
>> if ( count != 1 )
>> {
>> itkDebugMacro("Point "<< i<< " is duplicated");
>> return ( (QEPrimal *)NULL );
>> }
>> }
>>
>> // Check that all points exist
>> for ( size_t i = 0; i< points.size(); i++ )
>> {
>> if ( !this->GetPoints()->IndexExists(points[i]) )
>> {
>> itkDebugMacro("Point "<< i<< " is missing in the mesh");
>> return (QEPrimal *)NULL;
>> }
>> }
>> #endif
>>
>> // Check if existing edges have no face on the left.
>> for ( size_t i = 0; i< points.size(); i++ )
>> {
>> PointIdentifier pid0 = points[i];
>> PointIdentifier pid1 = points[( i + 1 ) % points.size()];
>>
>> QEPrimal *edge = this->FindEdge(pid0, pid1);
>>
>> if ( edge )
>> {
>> if ( edge->IsLeftSet() )
>> {
>> itkDebugMacro("Edge ["<< i<< " "<< ( ( i + 1 ) % points.size() )
>> << " has a left face.");
>> return (QEPrimal *)NULL;
>> }
>> }
>> }
>>
>> return AddFaceWithSecurePointList(points);
>> }
More information about the Insight-developers
mailing list