On Thu, 22 Dec 2011, Anders Wallin wrote:
Hi all,
For traversing the faces of a planar BGL graph I store 'next' pointers in a bundled property for each edge. I can go round a face of the graph like this: BGLGraph g; edge_descriptor current,start; // initialize these! do { // do something with current current=g[current].next; } while(current!=start);
Now I was thinking that a lot of 'boilerplate' code would be eliminated if I could do these loops with BOOST_FOREACH. Following the tutorial for iterator_facade I am trying something like this: https://github.com/aewallin/sandbox/blob/master/bgl_iterator/main.cpp
However as commented in the code it doesn't quite work. I get either no iterations, one iteration, or all but one edge.
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.
Also, holding a pointer to an edge_descriptor in the iterator class doesn't strike me as very elegant, could I store an edge_descriptor directly?
Yes, as long as it isn't invalidated by any of the graph modifications you do. -- Jeremiah Willcock