628 //     const ReachedMap& getReachedMap() const { return reached; } | 
   628 //     const ReachedMap& getReachedMap() const { return reached; } | 
   629 //     const std::queue<Node>& getBfsQueue() const { return bfs_queue; } | 
   629 //     const std::queue<Node>& getBfsQueue() const { return bfs_queue; } | 
   630 //  };    | 
   630 //  };    | 
   631   | 
   631   | 
   632   | 
   632   | 
   633   template <typename GraphWrapper, /*typename OutEdgeIt,*/   | 
   633   template <typename Graph, /*typename OutEdgeIt,*/   | 
   634 	    typename ReachedMap/*=typename GraphWrapper::NodeMap<bool>*/ >  | 
   634 	    typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >  | 
   635   class BfsIterator5 { | 
   635   class BfsIterator5 { | 
   636     typedef typename GraphWrapper::Node Node;  | 
   636   protected:  | 
   637     typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;  | 
   637     typedef typename Graph::Node Node;  | 
   638     const GraphWrapper* g;  | 
   638     typedef typename Graph::OutEdgeIt OutEdgeIt;  | 
         | 
   639     const Graph* graph;  | 
   639     std::queue<Node> bfs_queue;  | 
   640     std::queue<Node> bfs_queue;  | 
   640     ReachedMap& reached;  | 
   641     ReachedMap& reached;  | 
   641     bool b_node_newly_reached;  | 
   642     bool b_node_newly_reached;  | 
   642     OutEdgeIt actual_edge;  | 
   643     OutEdgeIt actual_edge;  | 
   643     bool own_reached_map;  | 
   644     bool own_reached_map;  | 
   644   public:  | 
   645   public:  | 
   645     BfsIterator5(const GraphWrapper& _g, ReachedMap& _reached) :   | 
   646     BfsIterator5(const Graph& _graph, ReachedMap& _reached) :   | 
   646       g(&_g), reached(_reached),   | 
   647       graph(&_graph), reached(_reached),   | 
   647       own_reached_map(false) { } | 
   648       own_reached_map(false) { } | 
   648     BfsIterator5(const GraphWrapper& _g) :   | 
   649     BfsIterator5(const Graph& _graph) :   | 
   649       g(&_g), reached(*(new ReachedMap(*g /*, false*/))),   | 
   650       graph(&_graph), reached(*(new ReachedMap(*graph /*, false*/))),   | 
   650       own_reached_map(true) { } | 
   651       own_reached_map(true) { } | 
   651 //     BfsIterator5(const typename GraphWrapper::BaseGraph& _G,   | 
         | 
   652 // 		 ReachedMap& _reached) :   | 
         | 
   653 //       G(_G), reached(_reached),   | 
         | 
   654 //       own_reached_map(false) { } | 
         | 
   655 //     BfsIterator5(const typename GraphWrapper::BaseGraph& _G) :   | 
         | 
   656 //       G(_G), reached(*(new ReachedMap(G /*, false*/))),   | 
         | 
   657 //       own_reached_map(true) { } | 
         | 
   658     ~BfsIterator5() { if (own_reached_map) delete &reached; } | 
   652     ~BfsIterator5() { if (own_reached_map) delete &reached; } | 
   659     void pushAndSetReached(Node s) {  | 
   653     void pushAndSetReached(Node s) {  | 
   660       reached.set(s, true);  | 
   654       reached.set(s, true);  | 
   661       if (bfs_queue.empty()) { | 
   655       if (bfs_queue.empty()) { | 
   662 	bfs_queue.push(s);  | 
   656 	bfs_queue.push(s);  | 
   663 	g->first(actual_edge, s);  | 
   657 	graph->first(actual_edge, s);  | 
   664 	if (g->valid(actual_edge)) {  | 
   658 	if (graph->valid(actual_edge)) {  | 
   665 	  Node w=g->bNode(actual_edge);  | 
   659 	  Node w=graph->bNode(actual_edge);  | 
   666 	  if (!reached.get(w)) { | 
   660 	  if (!reached.get(w)) { | 
   667 	    bfs_queue.push(w);  | 
   661 	    bfs_queue.push(w);  | 
   668 	    reached.set(w, true);  | 
   662 	    reached.set(w, true);  | 
   669 	    b_node_newly_reached=true;  | 
   663 	    b_node_newly_reached=true;  | 
   670 	  } else { | 
   664 	  } else { | 
   673 	}   | 
   667 	}   | 
   674       } else { | 
   668       } else { | 
   675 	bfs_queue.push(s);  | 
   669 	bfs_queue.push(s);  | 
   676       }  | 
   670       }  | 
   677     }  | 
   671     }  | 
   678     BfsIterator5<GraphWrapper, /*OutEdgeIt,*/ ReachedMap>&   | 
   672     BfsIterator5<Graph, /*OutEdgeIt,*/ ReachedMap>&   | 
   679     operator++() {  | 
   673     operator++() {  | 
   680       if (g->valid(actual_edge)) {  | 
   674       if (graph->valid(actual_edge)) {  | 
   681 	g->next(actual_edge);  | 
   675 	graph->next(actual_edge);  | 
   682 	if (g->valid(actual_edge)) { | 
   676 	if (graph->valid(actual_edge)) { | 
   683 	  Node w=g->bNode(actual_edge);  | 
   677 	  Node w=graph->bNode(actual_edge);  | 
   684 	  if (!reached.get(w)) { | 
   678 	  if (!reached.get(w)) { | 
   685 	    bfs_queue.push(w);  | 
   679 	    bfs_queue.push(w);  | 
   686 	    reached.set(w, true);  | 
   680 	    reached.set(w, true);  | 
   687 	    b_node_newly_reached=true;  | 
   681 	    b_node_newly_reached=true;  | 
   688 	  } else { | 
   682 	  } else { | 
   708       return *this;  | 
   702       return *this;  | 
   709     }  | 
   703     }  | 
   710     bool finished() const { return bfs_queue.empty(); } | 
   704     bool finished() const { return bfs_queue.empty(); } | 
   711     operator OutEdgeIt () const { return actual_edge; } | 
   705     operator OutEdgeIt () const { return actual_edge; } | 
   712     bool isBNodeNewlyReached() const { return b_node_newly_reached; } | 
   706     bool isBNodeNewlyReached() const { return b_node_newly_reached; } | 
   713     bool isANodeExamined() const { return !(g->valid(actual_edge)); } | 
   707     bool isANodeExamined() const { return !(graph->valid(actual_edge)); } | 
   714     Node aNode() const { return bfs_queue.front(); } | 
   708     Node aNode() const { return bfs_queue.front(); } | 
   715     Node bNode() const { return g->bNode(actual_edge); } | 
   709     Node bNode() const { return graph->bNode(actual_edge); } | 
   716     const ReachedMap& getReachedMap() const { return reached; } | 
   710     const ReachedMap& getReachedMap() const { return reached; } | 
   717     const std::queue<Node>& getBfsQueue() const { return bfs_queue; } | 
   711     const std::queue<Node>& getBfsQueue() const { return bfs_queue; } | 
   718   };    | 
   712   };    | 
   719   | 
   713   | 
   720 //   template <typename Graph, typename OutEdgeIt,   | 
   714 //   template <typename Graph, typename OutEdgeIt,   | 
   771 //     Node bNode() const { return G.bNode(actual_edge); } | 
   765 //     Node bNode() const { return G.bNode(actual_edge); } | 
   772 //     const ReachedMap& getReachedMap() const { return reached; } | 
   766 //     const ReachedMap& getReachedMap() const { return reached; } | 
   773 //     const std::stack<OutEdgeIt>& getDfsStack() const { return dfs_stack; } | 
   767 //     const std::stack<OutEdgeIt>& getDfsStack() const { return dfs_stack; } | 
   774 //   };  | 
   768 //   };  | 
   775   | 
   769   | 
   776   template <typename GraphWrapper, /*typename OutEdgeIt,*/   | 
   770   template <typename Graph, /*typename OutEdgeIt,*/   | 
   777 	    typename ReachedMap/*=typename GraphWrapper::NodeMap<bool>*/ >  | 
   771 	    typename ReachedMap/*=typename Graph::NodeMap<bool>*/ >  | 
   778   class DfsIterator5 { | 
   772   class DfsIterator5 { | 
   779     typedef typename GraphWrapper::Node Node;  | 
   773   protected:  | 
   780     typedef typename GraphWrapper::OutEdgeIt OutEdgeIt;  | 
   774     typedef typename Graph::Node Node;  | 
   781     const GraphWrapper* g;  | 
   775     typedef typename Graph::OutEdgeIt OutEdgeIt;  | 
         | 
   776     const Graph* graph;  | 
   782     std::stack<OutEdgeIt> dfs_stack;  | 
   777     std::stack<OutEdgeIt> dfs_stack;  | 
   783     bool b_node_newly_reached;  | 
   778     bool b_node_newly_reached;  | 
   784     OutEdgeIt actual_edge;  | 
   779     OutEdgeIt actual_edge;  | 
   785     Node actual_node;  | 
   780     Node actual_node;  | 
   786     ReachedMap& reached;  | 
   781     ReachedMap& reached;  | 
   787     bool own_reached_map;  | 
   782     bool own_reached_map;  | 
   788   public:  | 
   783   public:  | 
   789     DfsIterator5(const GraphWrapper& _g, ReachedMap& _reached) :   | 
   784     DfsIterator5(const Graph& _graph, ReachedMap& _reached) :   | 
   790       g(&_g), reached(_reached),   | 
   785       graph(&_graph), reached(_reached),   | 
   791       own_reached_map(false) { } | 
   786       own_reached_map(false) { } | 
   792     DfsIterator5(const GraphWrapper& _g) :   | 
   787     DfsIterator5(const Graph& _graph) :   | 
   793       g(&_g), reached(*(new ReachedMap(*g /*, false*/))),   | 
   788       graph(&_graph), reached(*(new ReachedMap(*graph /*, false*/))),   | 
   794       own_reached_map(true) { } | 
   789       own_reached_map(true) { } | 
   795     ~DfsIterator5() { if (own_reached_map) delete &reached; } | 
   790     ~DfsIterator5() { if (own_reached_map) delete &reached; } | 
   796     void pushAndSetReached(Node s) {  | 
   791     void pushAndSetReached(Node s) {  | 
   797       actual_node=s;  | 
   792       actual_node=s;  | 
   798       reached.set(s, true);  | 
   793       reached.set(s, true);  | 
   799       OutEdgeIt e;  | 
   794       OutEdgeIt e;  | 
   800       g->first(e, s);  | 
   795       graph->first(e, s);  | 
   801       dfs_stack.push(e);   | 
   796       dfs_stack.push(e);   | 
   802     }  | 
   797     }  | 
   803     DfsIterator5<GraphWrapper, /*OutEdgeIt,*/ ReachedMap>&   | 
   798     DfsIterator5<Graph, /*OutEdgeIt,*/ ReachedMap>&   | 
   804     operator++() {  | 
   799     operator++() {  | 
   805       actual_edge=dfs_stack.top();  | 
   800       actual_edge=dfs_stack.top();  | 
   806       //actual_node=G.aNode(actual_edge);  | 
   801       //actual_node=G.aNode(actual_edge);  | 
   807       if (g->valid(actual_edge)/*.valid()*/) {  | 
   802       if (graph->valid(actual_edge)/*.valid()*/) {  | 
   808 	Node w=g->bNode(actual_edge);  | 
   803 	Node w=graph->bNode(actual_edge);  | 
   809 	actual_node=w;  | 
   804 	actual_node=w;  | 
   810 	if (!reached.get(w)) { | 
   805 	if (!reached.get(w)) { | 
   811 	  OutEdgeIt e;  | 
   806 	  OutEdgeIt e;  | 
   812 	  g->first(e, w);  | 
   807 	  graph->first(e, w);  | 
   813 	  dfs_stack.push(e);  | 
   808 	  dfs_stack.push(e);  | 
   814 	  reached.set(w, true);  | 
   809 	  reached.set(w, true);  | 
   815 	  b_node_newly_reached=true;  | 
   810 	  b_node_newly_reached=true;  | 
   816 	} else { | 
   811 	} else { | 
   817 	  actual_node=g->aNode(actual_edge);  | 
   812 	  actual_node=graph->aNode(actual_edge);  | 
   818 	  g->next(dfs_stack.top());  | 
   813 	  graph->next(dfs_stack.top());  | 
   819 	  b_node_newly_reached=false;  | 
   814 	  b_node_newly_reached=false;  | 
   820 	}  | 
   815 	}  | 
   821       } else { | 
   816       } else { | 
   822 	//actual_node=G.aNode(dfs_stack.top());  | 
   817 	//actual_node=G.aNode(dfs_stack.top());  | 
   823 	dfs_stack.pop();  | 
   818 	dfs_stack.pop();  | 
   825       return *this;  | 
   820       return *this;  | 
   826     }  | 
   821     }  | 
   827     bool finished() const { return dfs_stack.empty(); } | 
   822     bool finished() const { return dfs_stack.empty(); } | 
   828     operator OutEdgeIt () const { return actual_edge; } | 
   823     operator OutEdgeIt () const { return actual_edge; } | 
   829     bool isBNodeNewlyReached() const { return b_node_newly_reached; } | 
   824     bool isBNodeNewlyReached() const { return b_node_newly_reached; } | 
   830     bool isANodeExamined() const { return !(g->valid(actual_edge)); } | 
   825     bool isANodeExamined() const { return !(graph->valid(actual_edge)); } | 
   831     Node aNode() const { return actual_node; /*FIXME*/} | 
   826     Node aNode() const { return actual_node; /*FIXME*/} | 
   832     Node bNode() const { return G.bNode(actual_edge); } | 
   827     Node bNode() const { return G.bNode(actual_edge); } | 
   833     const ReachedMap& getReachedMap() const { return reached; } | 
   828     const ReachedMap& getReachedMap() const { return reached; } | 
   834     const std::stack<OutEdgeIt>& getDfsStack() const { return dfs_stack; } | 
   829     const std::stack<OutEdgeIt>& getDfsStack() const { return dfs_stack; } | 
   835   };  | 
   830   };  |