2 #ifndef HUGO_GRAPH_WRAPPER_H
3 #define HUGO_GRAPH_WRAPPER_H
9 template<typename Graph>
10 class TrivGraphWrapper {
15 // typedef Graph BaseGraph;
16 typedef Graph ParentGraph;
18 // TrivGraphWrapper() : graph(0) { }
19 TrivGraphWrapper(Graph& _graph) : graph(&_graph) { }
20 // void setGraph(Graph& _graph) { graph = &_graph; }
21 // Graph& getGraph() const { return *graph; }
23 typedef typename Graph::Node Node;
24 class NodeIt : public Graph::NodeIt {
27 NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
28 // NodeIt(const typename BaseGraph::NodeIt& n) : Graph::NodeIt(n) { }
29 NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
30 NodeIt(const TrivGraphWrapper<Graph>& _G) :
31 Graph::NodeIt(*(_G.graph)) { }
32 // operator typename BaseGraph::NodeIt() {
33 // return typename BaseGraph::NodeIt(this->Graph::NodeIt);
36 typedef typename Graph::Edge Edge;
37 class OutEdgeIt : public Graph::OutEdgeIt {
40 OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
41 OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
42 OutEdgeIt(const TrivGraphWrapper<Graph>& _G, const Node& n) :
43 Graph::OutEdgeIt(*(_G.graph), n) { }
45 class InEdgeIt : public Graph::InEdgeIt {
48 InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
49 InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
50 InEdgeIt(const TrivGraphWrapper<Graph>& _G, const Node& n) :
51 Graph::InEdgeIt(*(_G.graph), n) { }
53 //typedef typename Graph::SymEdgeIt SymEdgeIt;
54 class EdgeIt : public Graph::EdgeIt {
57 EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
58 EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
59 EdgeIt(const TrivGraphWrapper<Graph>& _G) :
60 Graph::EdgeIt(*(_G.graph)) { }
63 NodeIt& first(NodeIt& i) const {
67 // template<typename I> I& first(I& i) const {
71 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
72 i=OutEdgeIt(*this, p);
75 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
79 EdgeIt& first(EdgeIt& i) const {
83 // template<typename I, typename P> I& first(I& i, const P& p) const {
88 // template<typename I> I getNext(const I& i) const {
89 // return graph->getNext(i); }
90 // template<typename I> I& next(I &i) const { graph->next(i); return i; }
91 NodeIt& next(NodeIt& i) const { graph->next(i); return i; }
92 OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i); return i; }
93 InEdgeIt& next(InEdgeIt& i) const { graph->next(i); return i; }
94 EdgeIt& next(EdgeIt& i) const { graph->next(i); return i; }
96 template< typename It > It first() const {
97 It e; this->first(e); return e; }
99 template< typename It > It first(const Node& v) const {
100 It e; this->first(e, v); return e; }
102 Node head(const Edge& e) const { return graph->head(e); }
103 Node tail(const Edge& e) const { return graph->tail(e); }
105 template<typename I> bool valid(const I& i) const {
106 return graph->valid(i); }
108 //template<typename I> void setInvalid(const I &i);
109 //{ return graph->setInvalid(i); }
111 int nodeNum() const { return graph->nodeNum(); }
112 int edgeNum() const { return graph->edgeNum(); }
114 template<typename I> Node aNode(const I& e) const {
115 return graph->aNode(e); }
116 template<typename I> Node bNode(const I& e) const {
117 return graph->bNode(e); }
119 Node addNode() const { return graph->addNode(); }
120 Edge addEdge(const Node& tail, const Node& head) const {
121 return graph->addEdge(tail, head); }
123 template<typename I> void erase(const I& i) const { graph->erase(i); }
125 void clear() const { graph->clear(); }
127 template<typename T> class NodeMap : public Graph::NodeMap<T> {
129 NodeMap(const TrivGraphWrapper<Graph>& _G) :
130 Graph::NodeMap<T>(*(_G.graph)) { }
131 NodeMap(const TrivGraphWrapper<Graph>& _G, T a) :
132 Graph::NodeMap<T>(*(_G.graph), a) { }
135 template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
137 EdgeMap(const TrivGraphWrapper<Graph>& _G) :
138 Graph::EdgeMap<T>(*(_G.graph)) { }
139 EdgeMap(const TrivGraphWrapper<Graph>& _G, T a) :
140 Graph::EdgeMap<T>(*(_G.graph), a) { }
143 // template<typename Map, typename T> class NodeMapWrapper {
147 // NodeMapWrapper(Map& _map) : map(&_map) { }
148 // void set(Node n, T a) { map->set(n, a); }
149 // T get(Node n) const { return map->get(n); }
152 // template<typename Map, typename T> class EdgeMapWrapper {
156 // EdgeMapWrapper(Map& _map) : map(&_map) { }
157 // void set(Edge n, T a) { map->set(n, a); }
158 // T get(Edge n) const { return map->get(n); }
163 template<typename Graph>
169 typedef Graph BaseGraph;
170 typedef Graph ParentGraph;
172 // GraphWrapper() : graph(0) { }
173 GraphWrapper(Graph& _graph) : graph(&_graph) { }
174 // void setGraph(Graph& _graph) { graph=&_graph; }
175 // Graph& getGraph() const { return *graph; }
177 typedef typename Graph::Node Node;
178 class NodeIt : public Graph::NodeIt {
181 NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
182 NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
183 NodeIt(const GraphWrapper<Graph>& _G) :
184 Graph::NodeIt(*(_G.graph)) { }
186 typedef typename Graph::Edge Edge;
187 class OutEdgeIt : public Graph::OutEdgeIt {
190 OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
191 OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
192 OutEdgeIt(const GraphWrapper<Graph>& _G, const Node& n) :
193 Graph::OutEdgeIt(*(_G.graph), n) { }
195 class InEdgeIt : public Graph::InEdgeIt {
198 InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
199 InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
200 InEdgeIt(const GraphWrapper<Graph>& _G, const Node& n) :
201 Graph::InEdgeIt(*(_G.graph), n) { }
203 //typedef typename Graph::SymEdgeIt SymEdgeIt;
204 class EdgeIt : public Graph::EdgeIt {
207 EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
208 EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
209 EdgeIt(const GraphWrapper<Graph>& _G) :
210 Graph::EdgeIt(*(_G.graph)) { }
213 NodeIt& first(NodeIt& i) const {
217 // template<typename I> I& first(I& i) const {
221 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
222 i=OutEdgeIt(*this, p);
225 InEdgeIt& first(InEdgeIt& i, const Node& p) const {
226 i=InEdgeIt(*this, p);
229 EdgeIt& first(EdgeIt& i) const {
233 // template<typename I, typename P> I& first(I& i, const P& p) const {
238 // template<typename I> I getNext(const I& i) const {
239 // return gw.getNext(i); }
240 // template<typename I> I& next(I &i) const { graph->next(i); return i; }
241 NodeIt& next(NodeIt& i) const { graph->next(i); return i; }
242 OutEdgeIt& next(OutEdgeIt& i) const { graph->next(i); return i; }
243 InEdgeIt& next(InEdgeIt& i) const { graph->next(i); return i; }
244 EdgeIt& next(EdgeIt& i) const { graph->next(i); return i; }
246 template< typename It > It first() const {
247 It e; this->first(e); return e; }
249 template< typename It > It first(const Node& v) const {
250 It e; this->first(e, v); return e; }
252 Node head(const Edge& e) const { return graph->head(e); }
253 Node tail(const Edge& e) const { return graph->tail(e); }
255 template<typename I> bool valid(const I& i) const {
256 return graph->valid(i); }
258 //template<typename I> void setInvalid(const I &i);
259 //{ return graph->setInvalid(i); }
261 int nodeNum() const { return graph->nodeNum(); }
262 int edgeNum() const { return graph->edgeNum(); }
264 template<typename I> Node aNode(const I& e) const {
265 return graph->aNode(e); }
266 template<typename I> Node bNode(const I& e) const {
267 return graph->bNode(e); }
269 Node addNode() const { return graph->addNode(); }
270 Edge addEdge(const Node& tail, const Node& head) const {
271 return graph->addEdge(tail, head); }
273 template<typename I> void erase(const I& i) const { graph->erase(i); }
275 void clear() const { graph->clear(); }
277 template<typename T> class NodeMap : public Graph::NodeMap<T> {
279 NodeMap(const GraphWrapper<Graph>& _G) :
280 Graph::NodeMap<T>(*(_G.graph)) { }
281 NodeMap(const GraphWrapper<Graph>& _G, T a) :
282 Graph::NodeMap<T>(*(_G.graph), a) { }
285 template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
287 EdgeMap(const GraphWrapper<Graph>& _G) :
288 Graph::EdgeMap<T>(*(_G.graph)) { }
289 EdgeMap(const GraphWrapper<Graph>& _G, T a) :
290 Graph::EdgeMap<T>(*(_G.graph), a) { }
295 // template<typename Graph>
296 // class RevGraphWrapper
302 // typedef Graph ParentGraph;
304 // typedef typename Graph::Node Node;
305 // typedef typename Graph::NodeIt NodeIt;
307 // typedef typename Graph::Edge Edge;
308 // typedef typename Graph::OutEdgeIt InEdgeIt;
309 // typedef typename Graph::InEdgeIt OutEdgeIt;
310 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
311 // typedef typename Graph::EdgeIt EdgeIt;
313 // //RevGraphWrapper() : graph(0) { }
314 // RevGraphWrapper(Graph& _graph) : graph(&_graph) { }
316 // void setGraph(Graph& _graph) { graph = &_graph; }
317 // Graph& getGraph() const { return (*graph); }
319 // template<typename I> I& first(I& i) const { return graph->first(i); }
320 // template<typename I, typename P> I& first(I& i, const P& p) const {
321 // return graph->first(i, p); }
323 // template<typename I> I getNext(const I& i) const {
324 // return graph->getNext(i); }
325 // template<typename I> I& next(I &i) const { return graph->next(i); }
327 // template< typename It > It first() const {
328 // It e; first(e); return e; }
330 // template< typename It > It first(const Node& v) const {
331 // It e; first(e, v); return e; }
333 // Node head(const Edge& e) const { return graph->tail(e); }
334 // Node tail(const Edge& e) const { return graph->head(e); }
336 // template<typename I> bool valid(const I& i) const
337 // { return graph->valid(i); }
339 // //template<typename I> void setInvalid(const I &i);
340 // //{ return graph->setInvalid(i); }
342 // template<typename I> Node aNode(const I& e) const {
343 // return graph->aNode(e); }
344 // template<typename I> Node bNode(const I& e) const {
345 // return graph->bNode(e); }
347 // Node addNode() const { return graph->addNode(); }
348 // Edge addEdge(const Node& tail, const Node& head) const {
349 // return graph->addEdge(tail, head); }
351 // int nodeNum() const { return graph->nodeNum(); }
352 // int edgeNum() const { return graph->edgeNum(); }
354 // template<typename I> void erase(const I& i) const { graph->erase(i); }
356 // void clear() const { graph->clear(); }
358 // template<typename T> class NodeMap : public Graph::NodeMap<T> {
360 // NodeMap(const RevGraphWrapper<Graph>& _G) :
361 // Graph::NodeMap<T>(_G.getGraph()) { }
362 // NodeMap(const RevGraphWrapper<Graph>& _G, T a) :
363 // Graph::NodeMap<T>(_G.getGraph(), a) { }
366 // template<typename T> class EdgeMap : public Graph::EdgeMap<T> {
368 // EdgeMap(const RevGraphWrapper<Graph>& _G) :
369 // Graph::EdgeMap<T>(_G.getGraph()) { }
370 // EdgeMap(const RevGraphWrapper<Graph>& _G, T a) :
371 // Graph::EdgeMap<T>(_G.getGraph(), a) { }
376 template<typename Graph>
377 class RevGraphWrapper : public GraphWrapper<Graph> {
379 typedef typename GraphWrapper<Graph>::Node Node;
380 typedef typename GraphWrapper<Graph>::Edge Edge;
382 //If Graph::OutEdgeIt is not defined
383 //and we do not want to use RevGraphWrapper::InEdgeIt,
384 //this won't work, because of typedef
386 //graphs have to define their non-existing iterators to void
387 //Unfortunately all the typedefs are instantiated in templates,
389 typedef typename GraphWrapper<Graph>::OutEdgeIt InEdgeIt;
390 typedef typename GraphWrapper<Graph>::InEdgeIt OutEdgeIt;
392 // RevGraphWrapper() : GraphWrapper<Graph>() { }
393 RevGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
395 Node head(const Edge& e) const
396 { return GraphWrapper<Graph>::tail(e); }
397 Node tail(const Edge& e) const
398 { return GraphWrapper<Graph>::head(e); }
401 //Subgraph on the same node-set and partial edge-set
402 template<typename Graph, typename NodeFilterMap,
403 typename EdgeFilterMap>
404 class SubGraphWrapper : public GraphWrapper<Graph> {
406 NodeFilterMap* node_filter_map;
407 EdgeFilterMap* edge_filter_map;
409 // SubGraphWrapper() : GraphWrapper<Graph>(), filter_map(0) { }
410 SubGraphWrapper(Graph& _graph, NodeFilterMap& _node_filter_map,
411 EdgeFilterMap& _edge_filter_map) :
412 GraphWrapper<Graph>(_graph), node_filter_map(&_node_filter_map),
413 edge_filter_map(&_edge_filter_map) { }
416 typedef typename Graph::Node Node;
417 class NodeIt : public Graph::NodeIt {
418 // typedef typename Graph::NodeIt GraphNodeIt;
421 NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
422 NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
423 NodeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
424 Graph::NodeIt(*(_G.graph)) {
425 while (_G.graph->valid((*this)/*.GraphNodeIt*/) &&
426 !(*(_G.node_filter_map))[(*this)/*.GraphNodeIt*/])
427 _G.graph->next((*this)/*.GraphNodeIt*/);
430 typedef typename Graph::Edge Edge;
431 class OutEdgeIt : public Graph::OutEdgeIt {
432 // typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
435 OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
436 OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
437 OutEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>&
439 Graph::OutEdgeIt(*(_G.graph), n) {
440 while (_G.graph->valid((*this)/*.GraphOutEdgeIt*/) &&
441 !(*(_G.edge_filter_map))[(*this)/*.GraphOutEdgeIt*/])
442 _G.graph->next((*this)/*.GraphOutEdgeIt*/);
445 class InEdgeIt : public Graph::InEdgeIt {
446 // typedef typename Graph::InEdgeIt GraphInEdgeIt;
449 InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
450 InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
451 InEdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G,
453 Graph::InEdgeIt(*(_G.graph), n) {
454 while (_G.graph->valid((*this)/*.GraphInEdgeIt*/) &&
455 !(*(_G.edge_filter_map))[(*this)/*.GraphInEdgeIt*/])
456 _G.graph->next((*this)/*.GraphInEdgeIt*/);
459 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
460 class EdgeIt : public Graph::EdgeIt {
461 // typedef typename Graph::EdgeIt GraphEdgeIt;
464 EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
465 EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
466 EdgeIt(const SubGraphWrapper<Graph, NodeFilterMap, EdgeFilterMap>& _G) :
467 Graph::EdgeIt(*(_G.graph)) {
468 while (_G.graph->valid((*this)/*.GraphEdgeIt*/) &&
469 !(*(_G.edge_filter_map))[(*this)/*.GraphEdgeIt*/])
470 _G.graph->next((*this)/*.GraphEdgeIt*/);
474 NodeIt& first(NodeIt& i) const {
478 OutEdgeIt& first(OutEdgeIt& i, const Node& n) const {
479 i=OutEdgeIt(*this, n);
482 InEdgeIt& first(InEdgeIt& i, const Node& n) const {
483 i=InEdgeIt(*this, n);
486 EdgeIt& first(EdgeIt& i) const {
491 // template<typename I> I& first(I& i) const {
493 // //while (graph->valid(i) && !filter_map->get(i)) { graph->next(i); }
494 // while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
497 // template<typename I, typename P> I& first(I& i, const P& p) const {
498 // graph->first(i, p);
499 // // while (graph->valid(i) && !filter_map->get(i)) { graph->next(i); }
500 // while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
504 NodeIt& next(NodeIt& i) const {
506 while (graph->valid(i) && !(*node_filter_map)[i]) { graph->next(i); }
509 OutEdgeIt& next(OutEdgeIt& i) const {
511 while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
514 InEdgeIt& next(InEdgeIt& i) const {
516 while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
519 EdgeIt& next(EdgeIt& i) const {
521 while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
525 //template<typename I> I getNext(const I& i) const {
526 // return gw.getNext(i);
528 // template<typename I> I& next(I &i) const {
530 // // while (graph->valid(i) && !filter_map-get(i)) { graph->next(i); }
531 // while (graph->valid(i) && !(*edge_filter_map)[i]) { graph->next(i); }
535 template< typename It > It first() const {
536 It e; this->first(e); return e; }
538 template< typename It > It first(const Node& v) const {
539 It e; this->first(e, v); return e; }
542 // template<typename GraphWrapper>
543 // class UndirGraphWrapper {
549 // typedef GraphWrapper ParentGraph;
551 // typedef typename GraphWrapper::Node Node;
552 // typedef typename GraphWrapper::NodeIt NodeIt;
554 // //typedef typename Graph::Edge Edge;
555 // //typedef typename Graph::OutEdgeIt OutEdgeIt;
556 // //typedef typename Graph::InEdgeIt InEdgeIt;
557 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
558 // //typedef typename Graph::EdgeIt EdgeIt;
561 // typedef typename GraphWrapper::Edge GraphEdge;
562 // typedef typename GraphWrapper::OutEdgeIt GraphOutEdgeIt;
563 // typedef typename GraphWrapper::InEdgeIt GraphInEdgeIt;
566 // //UndirGraphWrapper() : graph(0) { }
567 // UndirGraphWrapper(GraphWrapper _gw) : gw(_gw) { }
569 // //void setGraph(Graph& _graph) { graph = &_graph; }
570 // //Graph& getGraph() const { return (*graph); }
573 // friend class UndirGraphWrapper<GraphWrapper>;
574 // bool out_or_in; //true iff out
575 // GraphOutEdgeIt out;
578 // Edge() : out_or_in(), out(), in() { }
579 // Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
580 // operator GraphEdge() const {
581 // if (out_or_in) return(out); else return(in);
583 // friend bool operator==(const Edge& u, const Edge& v) {
585 // return (u.out_or_in && u.out==v.out);
587 // return (!u.out_or_in && u.in==v.in);
589 // friend bool operator!=(const Edge& u, const Edge& v) {
591 // return (!u.out_or_in || u.out!=v.out);
593 // return (u.out_or_in || u.in!=v.in);
597 // class OutEdgeIt : public Edge {
598 // friend class UndirGraphWrapper<GraphWrapper>;
600 // OutEdgeIt() : Edge() { }
601 // OutEdgeIt(const Invalid& i) : Edge(i) { }
602 // OutEdgeIt(const UndirGraphWrapper<GraphWrapper>& _G, const Node& n)
605 // _G.gw.first(out, n);
606 // if (!(_G.gw.valid(out))) {
608 // _G.gw.first(in, n);
613 // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
615 // gw.first(e.out, n);
616 // if (!(gw.valid(e.out))) {
617 // e.out_or_in=false;
618 // gw.first(e.in, n);
623 // OutEdgeIt& next(OutEdgeIt& e) const {
624 // if (e.out_or_in) {
625 // Node n=gw.tail(e.out);
627 // if (!gw.valid(e.out)) {
628 // e.out_or_in=false;
629 // gw.first(e.in, n);
637 // Node aNode(const OutEdgeIt& e) const {
638 // if (e.out_or_in) return gw.tail(e); else return gw.head(e); }
639 // Node bNode(const OutEdgeIt& e) const {
640 // if (e.out_or_in) return gw.head(e); else return gw.tail(e); }
642 // typedef OutEdgeIt InEdgeIt;
644 // template<typename I> I& first(I& i) const { return gw.first(i); }
645 // // template<typename I, typename P> I& first(I& i, const P& p) const {
646 // // return graph->first(i, p); }
648 // template<typename I> I getNext(const I& i) const {
649 // return gw.getNext(i); }
650 // template<typename I> I& next(I &i) const { return gw.next(i); }
652 // template< typename It > It first() const {
653 // It e; first(e); return e; }
655 // template< typename It > It first(const Node& v) const {
656 // It e; first(e, v); return e; }
658 // Node head(const Edge& e) const { return gw.head(e); }
659 // Node tail(const Edge& e) const { return gw.tail(e); }
661 // template<typename I> bool valid(const I& i) const
662 // { return gw.valid(i); }
664 // //template<typename I> void setInvalid(const I &i);
665 // //{ return graph->setInvalid(i); }
667 // int nodeNum() const { return gw.nodeNum(); }
668 // int edgeNum() const { return gw.edgeNum(); }
670 // // template<typename I> Node aNode(const I& e) const {
671 // // return graph->aNode(e); }
672 // // template<typename I> Node bNode(const I& e) const {
673 // // return graph->bNode(e); }
675 // Node addNode() const { return gw.addNode(); }
676 // // FIXME: ez igy nem jo, mert nem
677 // // Edge addEdge(const Node& tail, const Node& head) const {
678 // // return graph->addEdge(tail, head); }
680 // template<typename I> void erase(const I& i) const { gw.erase(i); }
682 // void clear() const { gw.clear(); }
684 // template<typename T> class NodeMap : public GraphWrapper::NodeMap<T> {
686 // NodeMap(const UndirGraphWrapper<GraphWrapper>& _G) :
687 // GraphWrapper::NodeMap<T>(_G.gw) { }
688 // NodeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) :
689 // GraphWrapper::NodeMap<T>(_G.gw, a) { }
692 // template<typename T> class EdgeMap : public GraphWrapper::EdgeMap<T> {
694 // EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G) :
695 // GraphWrapper::EdgeMap<T>(_G.gw) { }
696 // EdgeMap(const UndirGraphWrapper<GraphWrapper>& _G, T a) :
697 // GraphWrapper::EdgeMap<T>(_G.gw, a) { }
702 template<typename Graph>
703 class UndirGraphWrapper : public GraphWrapper<Graph> {
705 typedef typename Graph::Edge GraphEdge;
706 typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
707 typedef typename Graph::InEdgeIt GraphInEdgeIt;
709 typedef typename GraphWrapper<Graph>::Node Node;
710 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
712 // UndirGraphWrapper() : GraphWrapper<Graph>() { }
713 UndirGraphWrapper(Graph& _graph) : GraphWrapper<Graph>(_graph) { }
716 friend class UndirGraphWrapper<Graph>;
718 bool out_or_in; //true iff out
722 Edge() : out_or_in(), out(), in() { }
723 Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
724 operator GraphEdge() const {
725 if (out_or_in) return(out); else return(in);
728 //2 edges are equal if they "refer" to the same physical edge
730 friend bool operator==(const Edge& u, const Edge& v) {
732 if (u.out_or_in) return (u.out==v.out); else return (u.out==v.in);
733 //return (u.out_or_in && u.out==v.out);
735 if (u.out_or_in) return (u.out==v.in); else return (u.in==v.in);
736 //return (!u.out_or_in && u.in==v.in);
738 friend bool operator!=(const Edge& u, const Edge& v) {
740 if (u.out_or_in) return (u.out!=v.out); else return (u.out!=v.in);
741 //return (!u.out_or_in || u.out!=v.out);
743 if (u.out_or_in) return (u.out!=v.in); else return (u.in!=v.in);
744 //return (u.out_or_in || u.in!=v.in);
748 class OutEdgeIt : public Edge {
749 friend class UndirGraphWrapper<Graph>;
751 OutEdgeIt() : Edge() { }
752 OutEdgeIt(const Invalid& i) : Edge(i) { }
753 OutEdgeIt(const UndirGraphWrapper<Graph>& _G, const Node& n)
755 out_or_in=true; _G.graph->first(out, n);
756 if (!(_G.graph->valid(out))) { out_or_in=false; _G.graph->first(in, n); }
760 typedef OutEdgeIt InEdgeIt;
762 class EdgeIt : public Edge {
763 friend class UndirGraphWrapper<Graph>;
767 EdgeIt() : Edge() { }
768 EdgeIt(const Invalid& i) : Edge(i) { }
769 EdgeIt(const UndirGraphWrapper<Graph>& _G)
774 if (_G.valid(v)) _G.graph->first(out); else out=INVALID;
775 while (_G.valid(v) && !_G.graph->valid(out)) {
777 if (_G.valid(v)) _G.graph->first(out);
782 OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
783 e.out_or_in=true; graph->first(e.out, n);
784 if (!(graph->valid(e.out))) { e.out_or_in=false; graph->first(e.in, n); }
788 EdgeIt& first(EdgeIt& e) const {
792 if (valid(e.v)) graph->first(e.out, e.v); else e.out=INVALID;
793 while (valid(e.v) && !graph->valid(e.out)) {
795 if (valid(e.v)) graph->first(e.out, e.v);
800 template<typename I> I& first(I& i) const { graph->first(i); return i; }
801 template<typename I, typename P> I& first(I& i, const P& p) const {
802 graph->first(i, p); return i; }
804 OutEdgeIt& next(OutEdgeIt& e) const {
806 Node n=graph->tail(e.out);
808 if (!graph->valid(e.out)) { e.out_or_in=false; graph->first(e.in, n); }
815 EdgeIt& next(EdgeIt& e) const {
818 while (valid(e.v) && !graph->valid(e.out)) {
820 if (valid(e.v)) graph->first(e.out, e.v);
825 template<typename I> I& next(I &i) const { graph->next(i); return i; }
826 // template<typename I> I getNext(const I& i) const { return gw.getNext(i); }
828 template< typename It > It first() const {
829 It e; this->first(e); return e; }
831 template< typename It > It first(const Node& v) const {
832 It e; this->first(e, v); return e; }
834 // Node head(const Edge& e) const { return gw.head(e); }
835 // Node tail(const Edge& e) const { return gw.tail(e); }
837 // template<typename I> bool valid(const I& i) const
838 // { return gw.valid(i); }
840 // int nodeNum() const { return gw.nodeNum(); }
841 // int edgeNum() const { return gw.edgeNum(); }
843 // template<typename I> Node aNode(const I& e) const {
844 // return graph->aNode(e); }
845 // template<typename I> Node bNode(const I& e) const {
846 // return graph->bNode(e); }
848 Node aNode(const OutEdgeIt& e) const {
849 if (e.out_or_in) return graph->tail(e); else return graph->head(e); }
850 Node bNode(const OutEdgeIt& e) const {
851 if (e.out_or_in) return graph->head(e); else return graph->tail(e); }
853 // Node addNode() const { return gw.addNode(); }
855 // FIXME: ez igy nem jo, mert nem
856 // Edge addEdge(const Node& tail, const Node& head) const {
857 // return graph->addEdge(tail, head); }
859 // template<typename I> void erase(const I& i) const { gw.erase(i); }
861 // void clear() const { gw.clear(); }
863 // template<typename T> class NodeMap : public Graph::NodeMap<T> {
865 // NodeMap(const UndirGraphWrapper<Graph>& _G) :
866 // Graph::NodeMap<T>(_G.gw) { }
867 // NodeMap(const UndirGraphWrapper<Graph>& _G, T a) :
868 // Graph::NodeMap<T>(_G.gw, a) { }
871 // template<typename T> class EdgeMap :
872 // public GraphWrapperSkeleton<Graph>::EdgeMap<T> {
874 // EdgeMap(const UndirGraphWrapper<Graph>& _G) :
875 // GraphWrapperSkeleton<Graph>::EdgeMap<T>(_G.gw) { }
876 // EdgeMap(const UndirGraphWrapper<Graph>& _G, T a) :
877 // Graph::EdgeMap<T>(_G.gw, a) { }
885 // template<typename Graph>
886 // class SymGraphWrapper
891 // typedef Graph ParentGraph;
893 // typedef typename Graph::Node Node;
894 // typedef typename Graph::Edge Edge;
896 // typedef typename Graph::NodeIt NodeIt;
898 // //FIXME tag-ekkel megcsinalni, hogy abbol csinaljon
899 // //iranyitatlant, ami van
900 // //mert csak 1 dolgot lehet be typedef-elni
901 // typedef typename Graph::OutEdgeIt SymEdgeIt;
902 // //typedef typename Graph::InEdgeIt SymEdgeIt;
903 // //typedef typename Graph::SymEdgeIt SymEdgeIt;
904 // typedef typename Graph::EdgeIt EdgeIt;
906 // int nodeNum() const { return graph->nodeNum(); }
907 // int edgeNum() const { return graph->edgeNum(); }
909 // template<typename I> I& first(I& i) const { return graph->first(i); }
910 // template<typename I, typename P> I& first(I& i, const P& p) const {
911 // return graph->first(i, p); }
912 // //template<typename I> I next(const I i); { return graph->goNext(i); }
913 // //template<typename I> I &goNext(I &i); { return graph->goNext(i); }
915 // template< typename It > It first() const {
916 // It e; first(e); return e; }
918 // template< typename It > It first(Node v) const {
919 // It e; first(e, v); return e; }
921 // Node head(const Edge& e) const { return graph->head(e); }
922 // Node tail(const Edge& e) const { return graph->tail(e); }
924 // template<typename I> Node aNode(const I& e) const {
925 // return graph->aNode(e); }
926 // template<typename I> Node bNode(const I& e) const {
927 // return graph->bNode(e); }
929 // //template<typename I> bool valid(const I i);
930 // //{ return graph->valid(i); }
932 // //template<typename I> void setInvalid(const I &i);
933 // //{ return graph->setInvalid(i); }
935 // Node addNode() { return graph->addNode(); }
936 // Edge addEdge(const Node& tail, const Node& head) {
937 // return graph->addEdge(tail, head); }
939 // template<typename I> void erase(const I& i) { graph->erase(i); }
941 // void clear() { graph->clear(); }
943 // template<typename T> class NodeMap : public Graph::NodeMap<T> { };
944 // template<typename T> class EdgeMap : public Graph::EdgeMap<T> { };
946 // void setGraph(Graph& _graph) { graph = &_graph; }
947 // Graph& getGraph() { return (*graph); }
949 // //SymGraphWrapper() : graph(0) { }
950 // SymGraphWrapper(Graph& _graph) : graph(&_graph) { }
954 template<typename Graph, typename Number, typename FlowMap, typename CapacityMap>
955 class ResGraphWrapper : public GraphWrapper<Graph> {
957 typedef typename Graph::OutEdgeIt GraphOutEdgeIt;
958 typedef typename Graph::InEdgeIt GraphInEdgeIt;
959 typedef typename Graph::Edge GraphEdge;
961 const CapacityMap* capacity;
964 ResGraphWrapper(Graph& _graph, FlowMap& _flow,
965 const CapacityMap& _capacity) :
966 GraphWrapper<Graph>(_graph), flow(&_flow), capacity(&_capacity) { }
971 friend class OutEdgeIt;
973 typedef typename GraphWrapper<Graph>::Node Node;
974 typedef typename GraphWrapper<Graph>::NodeIt NodeIt;
976 friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
978 bool out_or_in; //true, iff out
982 Edge() : out_or_in(true) { }
983 Edge(const Invalid& i) : out_or_in(false), out(), in(i) { }
984 // bool valid() const {
985 // return out_or_in && out.valid() || in.valid(); }
986 friend bool operator==(const Edge& u, const Edge& v) {
988 return (u.out_or_in && u.out==v.out);
990 return (!u.out_or_in && u.in==v.in);
992 friend bool operator!=(const Edge& u, const Edge& v) {
994 return (!u.out_or_in || u.out!=v.out);
996 return (u.out_or_in || u.in!=v.in);
998 operator GraphEdge() const {
999 if (out_or_in) return(out); else return(in);
1002 class OutEdgeIt : public Edge {
1003 friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
1007 OutEdgeIt(const Edge& e) : Edge(e) { }
1008 OutEdgeIt(const Invalid& i) : Edge(i) { }
1009 OutEdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG, Node v) : Edge() {
1010 resG.graph->first(out, v);
1011 while( resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
1012 if (!resG.graph->valid(out)) {
1014 resG.graph->first(in, v);
1015 while( resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
1019 // OutEdgeIt& operator++() {
1021 // Node v=/*resG->*/G->aNode(out);
1023 // while( out.valid() && !(Edge::resCap()>0) ) { ++out; }
1024 // if (!out.valid()) {
1027 // while( in.valid() && !(Edge::resCap()>0) ) { ++in; }
1031 // while( in.valid() && !(Edge::resCap()>0) ) { ++in; }
1037 //FIXME This is just for having InEdgeIt
1038 // class InEdgeIt : public Edge { };
1040 class EdgeIt : public Edge {
1041 friend class ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>;
1045 //EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { }
1046 EdgeIt(const Invalid& i) : Edge(i) { }
1047 EdgeIt(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& resG) : Edge() {
1048 resG.graph->first(v);
1049 if (resG.graph->valid(v)) resG.graph->first(out, v); else out=INVALID;
1050 while (resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
1051 while (resG.graph->valid(v) && !resG.graph->valid(out)) {
1052 resG.graph->next(v);
1053 if (resG.graph->valid(v)) resG.graph->first(out, v);
1054 while (resG.graph->valid(out) && !(resG.resCap(out)>0) ) { resG.graph->next(out); }
1056 if (!resG.graph->valid(out)) {
1058 resG.graph->first(v);
1059 if (resG.graph->valid(v)) resG.graph->first(in, v); else in=INVALID;
1060 while (resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
1061 while (resG.graph->valid(v) && !resG.graph->valid(in)) {
1062 resG.graph->next(v);
1063 if (resG.graph->valid(v)) resG.graph->first(in, v);
1064 while (resG.graph->valid(in) && !(resG.resCap(in)>0) ) { resG.graph->next(in); }
1068 // EdgeIt& operator++() {
1071 // while (out.valid() && !(Edge::resCap()>0) ) { ++out; }
1072 // while (v.valid() && !out.valid()) {
1074 // if (v.valid()) G->first(out, v);
1075 // while (out.valid() && !(Edge::resCap()>0) ) { ++out; }
1077 // if (!out.valid()) {
1080 // if (v.valid()) G->first(in, v); else in=GraphInEdgeIt();
1081 // while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
1082 // while (v.valid() && !in.valid()) {
1084 // if (v.valid()) G->first(in, v);
1085 // while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
1090 // while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
1091 // while (v.valid() && !in.valid()) {
1093 // if (v.valid()) G->first(in, v);
1094 // while (in.valid() && !(Edge::resCap()>0) ) { ++in; }
1101 NodeIt& first(NodeIt& i) const {
1105 OutEdgeIt& first(OutEdgeIt& i, const Node& p) const {
1106 i=OutEdgeIt(*this, p);
1109 //FIXME Not yet implemented
1110 //InEdgeIt& first(InEdgeIt& i, const Node& p) const {
1111 //i=InEdgeIt(*this, p);
1114 EdgeIt& first(EdgeIt& e) const {
1119 NodeIt& next(NodeIt& n) const { graph->next(n); return n; }
1120 OutEdgeIt& next(OutEdgeIt& e) const {
1122 Node v=graph->aNode(e.out);
1124 while( graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
1125 if (!graph->valid(e.out)) {
1127 graph->first(e.in, v);
1128 while( graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
1132 while( graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
1136 //FIXME Not yet implemented
1137 //InEdgeIt& next(InEdgeIt& e) const {
1140 EdgeIt& next(EdgeIt& e) const {
1143 while (graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
1144 while (graph->valid(e.v) && !graph->valid(e.out)) {
1146 if (graph->valid(e.v)) graph->first(e.out, e.v);
1147 while (graph->valid(e.out) && !(resCap(e.out)>0) ) { graph->next(e.out); }
1149 if (!graph->valid(e.out)) {
1152 if (graph->valid(e.v)) graph->first(e.in, e.v); else e.in=INVALID;
1153 while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
1154 while (graph->valid(e.v) && !graph->valid(e.in)) {
1156 if (graph->valid(e.v)) graph->first(e.in, e.v);
1157 while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
1162 while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
1163 while (graph->valid(e.v) && !graph->valid(e.in)) {
1165 if (graph->valid(e.v)) graph->first(e.in, e.v);
1166 while (graph->valid(e.in) && !(resCap(e.in)>0) ) { graph->next(e.in); }
1173 template< typename It >
1180 template< typename It >
1181 It first(Node v) const {
1187 Node tail(Edge e) const {
1188 return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); }
1189 Node head(Edge e) const {
1190 return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); }
1192 Node aNode(OutEdgeIt e) const {
1193 return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); }
1194 Node bNode(OutEdgeIt e) const {
1195 return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); }
1197 int nodeNum() const { return graph->nodeNum(); }
1199 //int edgeNum() const { return graph->edgeNum(); }
1202 int id(Node v) const { return graph->id(v); }
1204 bool valid(Node n) const { return graph->valid(n); }
1205 bool valid(Edge e) const {
1206 return e.out_or_in ? graph->valid(e.out) : graph->valid(e.in); }
1208 void augment(const Edge& e, Number a) const {
1210 // flow->set(e.out, flow->get(e.out)+a);
1211 flow->set(e.out, (*flow)[e.out]+a);
1213 // flow->set(e.in, flow->get(e.in)-a);
1214 flow->set(e.in, (*flow)[e.in]-a);
1217 Number resCap(const Edge& e) const {
1219 // return (capacity->get(e.out)-flow->get(e.out));
1220 return ((*capacity)[e.out]-(*flow)[e.out]);
1222 // return (flow->get(e.in));
1223 return ((*flow)[e.in]);
1226 Number resCap(GraphOutEdgeIt out) const {
1227 // return (capacity->get(out)-flow->get(out));
1228 return ((*capacity)[out]-(*flow)[out]);
1231 Number resCap(GraphInEdgeIt in) const {
1232 // return (flow->get(in));
1233 return ((*flow)[in]);
1236 // template<typename T> class NodeMap : public Graph::NodeMap<T> {
1238 // NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G)
1239 // : Graph::NodeMap<T>(_G.gw) { }
1240 // NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G,
1241 // T a) : Graph::NodeMap<T>(_G.gw, a) { }
1244 // template <typename T>
1246 // typename Graph::NodeMap<T> node_map;
1248 // NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : node_map(*(_G.graph)) { }
1249 // NodeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : node_map(*(_G.graph), a) { }
1250 // void set(Node nit, T a) { node_map.set(nit, a); }
1251 // T get(Node nit) const { return node_map.get(nit); }
1254 template <typename T>
1256 typename Graph::EdgeMap<T> forward_map, backward_map;
1258 EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G) : forward_map(*(_G.graph)), backward_map(*(_G.graph)) { }
1259 EdgeMap(const ResGraphWrapper<Graph, Number, FlowMap, CapacityMap>& _G, T a) : forward_map(*(_G.graph), a), backward_map(*(_G.graph), a) { }
1260 void set(Edge e, T a) {
1262 forward_map.set(e.out, a);
1264 backward_map.set(e.in, a);
1266 T operator[](Edge e) const {
1268 return forward_map[e.out];
1270 return backward_map[e.in];
1272 // T get(Edge e) const {
1274 // return forward_map.get(e.out);
1276 // return backward_map.get(e.in);
1281 //ErasingFirstGraphWrapper for blocking flows
1282 template<typename Graph, typename FirstOutEdgesMap>
1283 class ErasingFirstGraphWrapper : public GraphWrapper<Graph> {
1285 FirstOutEdgesMap* first_out_edges;
1287 ErasingFirstGraphWrapper(Graph& _graph,
1288 FirstOutEdgesMap& _first_out_edges) :
1289 GraphWrapper<Graph>(_graph), first_out_edges(&_first_out_edges) { }
1291 typedef typename Graph::Node Node;
1292 class NodeIt : public Graph::NodeIt {
1295 NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { }
1296 NodeIt(const Invalid& i) : Graph::NodeIt(i) { }
1297 NodeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
1298 Graph::NodeIt(*(_G.graph)) { }
1300 typedef typename Graph::Edge Edge;
1301 class OutEdgeIt : public Graph::OutEdgeIt {
1304 OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { }
1305 OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { }
1306 OutEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
1308 Graph::OutEdgeIt((*_G.first_out_edges)[n]) { }
1310 class InEdgeIt : public Graph::InEdgeIt {
1313 InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { }
1314 InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { }
1315 InEdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G,
1317 Graph::InEdgeIt(*(_G.graph), n) { }
1319 //typedef typename Graph::SymEdgeIt SymEdgeIt;
1320 class EdgeIt : public Graph::EdgeIt {
1323 EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { }
1324 EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { }
1325 EdgeIt(const ErasingFirstGraphWrapper<Graph, FirstOutEdgesMap>& _G) :
1326 Graph::EdgeIt(*(_G.graph)) { }
1329 NodeIt& first(NodeIt& i) const {
1333 OutEdgeIt& first(OutEdgeIt& i, const Node& n) const {
1334 i=OutEdgeIt(*this, n);
1335 // i=(*first_out_edges)[n];
1338 InEdgeIt& first(InEdgeIt& i, const Node& n) const {
1339 i=InEdgeIt(*this, n);
1342 EdgeIt& first(EdgeIt& i) const {
1347 // template<typename I> I& first(I& i) const {
1351 // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const {
1352 // // e=first_out_edges->get(n);
1353 // e=(*first_out_edges)[n];
1356 // template<typename I, typename P> I& first(I& i, const P& p) const {
1357 // graph->first(i, p);
1361 //template<typename I> I getNext(const I& i) const {
1362 // return gw.getNext(i);
1366 NodeIt& next(NodeIt& i) const {
1370 OutEdgeIt& next(OutEdgeIt& i) const {
1374 InEdgeIt& next(InEdgeIt& i) const {
1378 EdgeIt& next(EdgeIt& i) const {
1383 // template<typename I> I& next(I &i) const {
1388 template< typename It > It first() const {
1389 It e; this->first(e); return e; }
1391 template< typename It > It first(const Node& v) const {
1392 It e; this->first(e, v); return e; }
1394 void erase(const OutEdgeIt& e) const {
1397 first_out_edges->set(this->tail(e), f);
1401 // // FIXME: comparison should be made better!!!
1402 // template<typename Graph, typename T, typename LowerMap, typename FlowMap, typename UpperMap>
1403 // class ResGraphWrapper
1408 // typedef Graph ParentGraph;
1410 // typedef typename Graph::Node Node;
1411 // typedef typename Graph::Edge Edge;
1413 // typedef typename Graph::NodeIt NodeIt;
1415 // class OutEdgeIt {
1419 // typename Graph::OutEdgeIt o;
1420 // typename Graph::InEdgeIt i;
1426 // typename Graph::OutEdgeIt o;
1427 // typename Graph::InEdgeIt i;
1429 // typedef typename Graph::SymEdgeIt SymEdgeIt;
1430 // typedef typename Graph::EdgeIt EdgeIt;
1432 // int nodeNum() const { return gw.nodeNum(); }
1433 // int edgeNum() const { return gw.edgeNum(); }
1435 // Node& first(Node& n) const { return gw.first(n); }
1437 // // Edge and SymEdge is missing!!!!
1438 // // Edge <-> In/OutEdgeIt conversion is missing!!!!
1441 // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const
1445 // while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
1447 // if(!gw.valid(e.o)) {
1449 // while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
1455 // OutEdgeIt &goNext(OutEdgeIt &e)
1457 // if(gw.valid(e.o)) {
1458 // while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o))
1460 // if(gw.valid(e.o)) return e;
1461 // else gw.first(e.i,e.n);
1464 // while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i))
1469 // OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);}
1471 // //bool valid(const OutEdgeIt e) { return gw.valid(e.o)||gw.valid(e.i);}
1474 // InEdgeIt& first(InEdgeIt& e, const Node& n) const
1478 // while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
1480 // if(!gw.valid(e.i)) {
1482 // while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
1488 // InEdgeIt &goNext(InEdgeIt &e)
1490 // if(gw.valid(e.i)) {
1491 // while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i))
1493 // if(gw.valid(e.i)) return e;
1494 // else gw.first(e.o,e.n);
1497 // while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o))
1502 // InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);}
1504 // //bool valid(const InEdgeIt e) { return gw.valid(e.i)||gw.valid(e.o);}
1506 // //template<typename I> I &goNext(I &i); { return gw.goNext(i); }
1507 // //template<typename I> I next(const I i); { return gw.goNext(i); }
1509 // template< typename It > It first() const {
1510 // It e; first(e); return e; }
1512 // template< typename It > It first(Node v) const {
1513 // It e; first(e, v); return e; }
1515 // Node head(const Edge& e) const { return gw.head(e); }
1516 // Node tail(const Edge& e) const { return gw.tail(e); }
1518 // template<typename I> Node aNode(const I& e) const {
1519 // return gw.aNode(e); }
1520 // template<typename I> Node bNode(const I& e) const {
1521 // return gw.bNode(e); }
1523 // //template<typename I> bool valid(const I i);
1524 // //{ return gw.valid(i); }
1526 // //template<typename I> void setInvalid(const I &i);
1527 // //{ return gw.setInvalid(i); }
1529 // Node addNode() { return gw.addNode(); }
1530 // Edge addEdge(const Node& tail, const Node& head) {
1531 // return gw.addEdge(tail, head); }
1533 // template<typename I> void erase(const I& i) { gw.erase(i); }
1535 // void clear() { gw.clear(); }
1537 // template<typename S> class NodeMap : public Graph::NodeMap<S> { };
1538 // template<typename S> class EdgeMap : public Graph::EdgeMap<S> { };
1540 // void setGraph(Graph& _graph) { graph = &_graph; }
1541 // Graph& getGraph() { return (*graph); }
1543 // //ResGraphWrapper() : graph(0) { }
1544 // ResGraphWrapper(Graph& _graph) : graph(&_graph) { }
1549 #endif //HUGO_GRAPH_WRAPPER_H