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: http://pastebin.ca/2096568
> 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 hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net