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: https://github.com/aewallin/sandbox/blob/master/bgl_iterator/main.cpp
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