[Insight-developers] question about preprocessor condition in itk::QuadEdgeMesh<>::AddFace method

Alexandre GOUAILLARD agouaillard at gmail.com
Tue Apr 17 11:51:44 EDT 2012


Dear arnaud,

that happen to all of us at least once :)

I kind of remember that ITK was defining that flag. I guess we can
safely assumed that the flag is always present when building in
release mode, and then my code should do what I expect it to do,
across platform.

alex.

alex.


On Tue, Apr 17, 2012 at 5:09 PM, Arnaud Gelas <arnaudgelas at gmail.com> wrote:
> 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