Boost logo

Boost Users :

Subject: Re: [Boost-users] BGL defining my own iterator?
From: Jeremiah Willcock (jewillco_at_[hidden])
Date: 2012-01-24 16:17:14

On Tue, 27 Dec 2011, Anders Wallin wrote:

>> In your second test, begin and end have the same edge, so they compare equal
>> using your iterator's == operator, breaking the loop immediately. Does the
>> do loop you use in your first test case work with iterators?  If so, you
>> will need some special-case way to create an end iterator; I know
>> Boost.Intrusive has a circular linked list class (slist), so checking that
>> code might show how to set up the iterators.
> I now got both a do-while and a BOOST_FOREACH loop working, but only
> when building in debug mode.
> When built in release mode (NDEBUG and -O3) I the iterator gives
> incorrect results in both cases.
> Output along with a compilation warning is here:
> updated code is here:
> what causes this difference in behaviour with NDEBUG and -O3 ?

Sorry about not responding to this earlier. The code you posted will not
work for an empty iterator range (due to the check for m_inc) and it seems
like comparisons of arbitrary edge_iterators (rather than just a
comparison to the end) are not supported. I looked at how
boost::intrusive::slist does their iterators, and they have a dummy node
in the circular list that is used to represent the end. It looks like
CGAL doesn't try to provide the iterator-pair interface to their circular
lists at all. Maybe you could store a pointer to the last element of the
list (or the first) in each iterator, and special-case incrementing onto
that element to act like a non-circular list would (using an invalid list
element). Would that make sense for you? Are you going to be changing
these edge cycles often?

-- Jeremiah Willcock

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at