IterableMap with template ValueType. IterableBoolMap as a specialization.
Range checking warnings...
     2 #ifndef HUGO_BFS_ITERATOR_H
 
     3 #define HUGO_BFS_ITERATOR_H
 
    11   template <typename Graph, /*typename OutEdgeIt,*/ 
 
    12 	    typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
 
    15     typedef typename Graph::Node Node;
 
    16     typedef typename Graph::OutEdgeIt OutEdgeIt;
 
    18     std::queue<Node> bfs_queue;
 
    20     bool b_node_newly_reached;
 
    21     OutEdgeIt actual_edge;
 
    24     BfsIterator(const Graph& _graph, ReachedMap& _reached) : 
 
    25       graph(&_graph), reached(_reached), 
 
    26       own_reached_map(false) { }
 
    27     BfsIterator(const Graph& _graph) : 
 
    28       graph(&_graph), reached(*(new ReachedMap(*graph /*, false*/))), 
 
    29       own_reached_map(true) { }
 
    30     ~BfsIterator() { if (own_reached_map) delete &reached; }
 
    31     void pushAndSetReached(Node s) { 
 
    33       if (bfs_queue.empty()) {
 
    35 	graph->first(actual_edge, s);
 
    36 	if (graph->valid(actual_edge)) { 
 
    37 	  Node w=graph->bNode(actual_edge);
 
    41 	    b_node_newly_reached=true;
 
    43 	    b_node_newly_reached=false;
 
    50     BfsIterator<Graph, /*OutEdgeIt,*/ ReachedMap>& 
 
    52       if (graph->valid(actual_edge)) { 
 
    53 	graph->next(actual_edge);
 
    54 	if (graph->valid(actual_edge)) {
 
    55 	  Node w=graph->bNode(actual_edge);
 
    59 	    b_node_newly_reached=true;
 
    61 	    b_node_newly_reached=false;
 
    66 	if (!bfs_queue.empty()) {
 
    67 	  graph->first(actual_edge, bfs_queue.front());
 
    68 	  if (graph->valid(actual_edge)) {
 
    69 	    Node w=graph->bNode(actual_edge);
 
    73 	      b_node_newly_reached=true;
 
    75 	      b_node_newly_reached=false;
 
    82     bool finished() const { return bfs_queue.empty(); }
 
    83     operator OutEdgeIt () const { return actual_edge; }
 
    84     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
 
    85     bool isANodeExamined() const { return !(graph->valid(actual_edge)); }
 
    86     Node aNode() const { return bfs_queue.front(); }
 
    87     Node bNode() const { return graph->bNode(actual_edge); }
 
    88     const ReachedMap& getReachedMap() const { return reached; }
 
    89     const std::queue<Node>& getBfsQueue() const { return bfs_queue; }
 
    92   template <typename Graph, /*typename OutEdgeIt,*/ 
 
    93 	    typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >
 
    96     typedef typename Graph::Node Node;
 
    97     typedef typename Graph::OutEdgeIt OutEdgeIt;
 
    99     std::stack<OutEdgeIt> dfs_stack;
 
   100     bool b_node_newly_reached;
 
   101     OutEdgeIt actual_edge;
 
   104     bool own_reached_map;
 
   106     DfsIterator(const Graph& _graph, ReachedMap& _reached) : 
 
   107       graph(&_graph), reached(_reached), 
 
   108       own_reached_map(false) { }
 
   109     DfsIterator(const Graph& _graph) : 
 
   110       graph(&_graph), reached(*(new ReachedMap(*graph /*, false*/))), 
 
   111       own_reached_map(true) { }
 
   112     ~DfsIterator() { if (own_reached_map) delete &reached; }
 
   113     void pushAndSetReached(Node s) { 
 
   115       reached.set(s, true);
 
   120     DfsIterator<Graph, /*OutEdgeIt,*/ ReachedMap>& 
 
   122       actual_edge=dfs_stack.top();
 
   123       //actual_node=G.aNode(actual_edge);
 
   124       if (graph->valid(actual_edge)/*.valid()*/) { 
 
   125 	Node w=graph->bNode(actual_edge);
 
   131 	  reached.set(w, true);
 
   132 	  b_node_newly_reached=true;
 
   134 	  actual_node=graph->aNode(actual_edge);
 
   135 	  graph->next(dfs_stack.top());
 
   136 	  b_node_newly_reached=false;
 
   139 	//actual_node=G.aNode(dfs_stack.top());
 
   144     bool finished() const { return dfs_stack.empty(); }
 
   145     operator OutEdgeIt () const { return actual_edge; }
 
   146     bool isBNodeNewlyReached() const { return b_node_newly_reached; }
 
   147     bool isANodeExamined() const { return !(graph->valid(actual_edge)); }
 
   148     Node aNode() const { return actual_node; /*FIXME*/}
 
   149     Node bNode() const { return G.bNode(actual_edge); }
 
   150     const ReachedMap& getReachedMap() const { return reached; }
 
   151     const std::stack<OutEdgeIt>& getDfsStack() const { return dfs_stack; }
 
   156 #endif //HUGO_BFS_ITERATOR_H