Boost logo

Boost Users :

Subject: Re: [Boost-users] BGL defining my own iterator?
From: Jeremiah Willcock (jewillco_at_[hidden])
Date: 2011-12-23 09:49:41


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


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