diff -r 19f3943521ab -r 3fefabfd00b7 src/work/marci/experiment/graph_wrapper_1.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/work/marci/experiment/graph_wrapper_1.h Sat Apr 03 17:26:46 2004 +0000 @@ -0,0 +1,1832 @@ +// -*- c++ -*- +#ifndef HUGO_GRAPH_WRAPPER_H +#define HUGO_GRAPH_WRAPPER_H + +#include + +namespace hugo { + + template + class TrivGraphWrapper { + protected: + Graph* graph; + + public: + typedef Graph BaseGraph; + + typedef typename Graph::Node Node; + class NodeIt : public Graph::NodeIt { + public: + NodeIt() { } + NodeIt(const typename Graph::NodeIt& n) : Graph::NodeIt(n) { } + NodeIt(const Invalid& i) : Graph::NodeIt(i) { } + NodeIt(const TrivGraphWrapper& _G) : + Graph::NodeIt(*(_G.graph)) { } + }; + typedef typename Graph::Edge Edge; + //typedef typename Graph::OutEdgeIt OutEdgeIt; + class OutEdgeIt : public Graph::OutEdgeIt { + public: + OutEdgeIt() { } + OutEdgeIt(const typename Graph::OutEdgeIt& e) : Graph::OutEdgeIt(e) { } + OutEdgeIt(const Invalid& i) : Graph::OutEdgeIt(i) { } + OutEdgeIt(const TrivGraphWrapper& _G, const Node& n) : + Graph::OutEdgeIt(*(_G.graph), n) { } + }; + //typedef typename Graph::InEdgeIt InEdgeIt; + class InEdgeIt : public Graph::InEdgeIt { + public: + InEdgeIt() { } + InEdgeIt(const typename Graph::InEdgeIt& e) : Graph::InEdgeIt(e) { } + InEdgeIt(const Invalid& i) : Graph::InEdgeIt(i) { } + InEdgeIt(const TrivGraphWrapper& _G, const Node& n) : + Graph::InEdgeIt(*(_G.graph), n) { } + }; + //typedef typename Graph::SymEdgeIt SymEdgeIt; + //typedef typename Graph::EdgeIt EdgeIt; + class EdgeIt : public Graph::EdgeIt { + public: + EdgeIt() { } + EdgeIt(const typename Graph::EdgeIt& e) : Graph::EdgeIt(e) { } + EdgeIt(const Invalid& i) : Graph::EdgeIt(i) { } + EdgeIt(const TrivGraphWrapper& _G) : + Graph::EdgeIt(*(_G.graph)) { } + }; + + //TrivGraphWrapper() : graph(0) { } + TrivGraphWrapper(Graph& _graph) : graph(&_graph) { } + +// void setGraph(Graph& _graph) { graph = &_graph; } +// Graph& getGraph() const { return (*graph); } + + NodeIt& first(NodeIt& i) const { + i=NodeIt(*this); + return i; + } + EdgeIt& first(EdgeIt& i) const { + i=EdgeIt(*this); + return i; + } +// template I& first(I& i) const { +// //return graph->first(i); +// i=I(*this); +// return i; +// } + OutEdgeIt& first(OutEdgeIt& i, const Node& p) const { + i=OutEdgeIt(*this, p); + return i; + } + InEdgeIt& first(InEdgeIt& i, const Node& p) const { + i=InEdgeIt(*this, p); + return i; + } +// template I& first(I& i, const P& p) const { +// //return graph->first(i, p); +// i=I(*this, p); +// return i; +// } + +// template I getNext(const I& i) const { +// return graph->getNext(i); } + template I& next(I &i) const { graph->next(i); return i; } + + template< typename It > It first() const { + It e; first(e); return e; } + + template< typename It > It first(const Node& v) const { + It e; first(e, v); return e; } + + Node head(const Edge& e) const { return graph->head(e); } + Node tail(const Edge& e) const { return graph->tail(e); } + + template bool valid(const I& i) const + { return graph->valid(i); } + + //template void setInvalid(const I &i); + //{ return graph->setInvalid(i); } + + int nodeNum() const { return graph->nodeNum(); } + int edgeNum() const { return graph->edgeNum(); } + + template Node aNode(const I& e) const { + return graph->aNode(e); } + template Node bNode(const I& e) const { + return graph->bNode(e); } + + Node addNode() const { return graph->addNode(); } + Edge addEdge(const Node& tail, const Node& head) const { + return graph->addEdge(tail, head); } + + template void erase(const I& i) const { graph->erase(i); } + + void clear() const { graph->clear(); } + + template class NodeMap : public Graph::NodeMap { + public: + NodeMap(const TrivGraphWrapper& _G) : + Graph::NodeMap(*(_G.graph)) { } + NodeMap(const TrivGraphWrapper& _G, T a) : + Graph::NodeMap(*(_G.graph), a) { } + }; + + template class EdgeMap : public Graph::EdgeMap { + public: + EdgeMap(const TrivGraphWrapper& _G) : + Graph::EdgeMap(*(_G.graph)) { } + EdgeMap(const TrivGraphWrapper& _G, T a) : + Graph::EdgeMap(*(_G.graph), a) { } + }; + + template class NodeMapWrapper { + protected: + Map* map; + public: + NodeMapWrapper(Map& _map) : map(&_map) { } + //template + void set(Node n, T a) { map->set(n, a); } + //template + T get(Node n) const { return map->get(n); } + }; + + template class EdgeMapWrapper { + protected: + Map* map; + public: + EdgeMapWrapper(Map& _map) : map(&_map) { } + //template + void set(Edge n, T a) { map->set(n, a); } + //template + T get(Edge n) const { return map->get(n); } + }; + }; + + template + class GraphWrapperSkeleton { + protected: + GraphWrapper gw; + + public: + //typedef typename GraphWrapper::BaseGraph BaseGraph; + +// typedef typename GraphWrapper::Node Node; +// typedef typename GraphWrapper::NodeIt NodeIt; + +// typedef typename GraphWrapper::Edge Edge; +// typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; +// typedef typename GraphWrapper::InEdgeIt InEdgeIt; +// //typedef typename GraphWrapper::SymEdgeIt SymEdgeIt; +// typedef typename GraphWrapper::EdgeIt EdgeIt; + + typedef typename GraphWrapper::Node Node; + class NodeIt : public GraphWrapper::NodeIt { + public: + NodeIt() { } + NodeIt(const typename GraphWrapper::NodeIt& n) : + GraphWrapper::NodeIt(n) { } + NodeIt(const Invalid& i) : GraphWrapper::NodeIt(i) { } + NodeIt(const GraphWrapperSkeleton& _G) : + GraphWrapper::NodeIt(_G.gw) { } + }; + typedef typename GraphWrapper::Edge Edge; + //typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; + class OutEdgeIt : public GraphWrapper::OutEdgeIt { + public: + OutEdgeIt() { } + OutEdgeIt(const typename GraphWrapper::OutEdgeIt& e) : + GraphWrapper::OutEdgeIt(e) { } + OutEdgeIt(const Invalid& i) : GraphWrapper::OutEdgeIt(i) { } + OutEdgeIt(const GraphWrapperSkeleton& _G, const Node& n) : + GraphWrapper::OutEdgeIt(_G.gw, n) { } + }; + //typedef typename GraphWrapper::InEdgeIt InEdgeIt; + class InEdgeIt : public GraphWrapper::InEdgeIt { + public: + InEdgeIt() { } + InEdgeIt(const typename GraphWrapper::InEdgeIt& e) : + GraphWrapper::InEdgeIt(e) { } + InEdgeIt(const Invalid& i) : GraphWrapper::InEdgeIt(i) { } + InEdgeIt(const GraphWrapperSkeleton& _G, const Node& n) : + GraphWrapper::InEdgeIt(_G.gw, n) { } + }; + //typedef typename GraphWrapper::SymEdgeIt SymEdgeIt; + //typedef typename GraphWrapper::EdgeIt EdgeIt; + class EdgeIt : public GraphWrapper::EdgeIt { + public: + EdgeIt() { } + EdgeIt(const typename GraphWrapper::EdgeIt& e) : + GraphWrapper::EdgeIt(e) { } + EdgeIt(const Invalid& i) : GraphWrapper::EdgeIt(i) { } + EdgeIt(const GraphWrapperSkeleton& _G) : + GraphWrapper::EdgeIt(_G.gw) { } + }; + + + //GraphWrapperSkeleton() : gw() { } + GraphWrapperSkeleton(GraphWrapper _gw) : gw(_gw) { } + + //void setGraph(BaseGraph& _graph) { gw.setGraph(_graph); } + //BaseGraph& getGraph() const { return gw.getGraph(); } + + template I& first(I& i) const { + i=I(*this); + return i; + } + template I& first(I& i, const P& p) const { + i=I(*this, p); + return i; + } + +// template I getNext(const I& i) const { return gw.getNext(i); } + template I& next(I &i) const { gw.next(i); return i; } + + template< typename It > It first() const { + It e; this->first(e); return e; } + + template< typename It > It first(const Node& v) const { + It e; this->first(e, v); return e; } + + Node head(const Edge& e) const { return gw.head(e); } + Node tail(const Edge& e) const { return gw.tail(e); } + + template bool valid(const I& i) const { return gw.valid(i); } + + //template void setInvalid(const I &i); + //{ return graph->setInvalid(i); } + + int nodeNum() const { return gw.nodeNum(); } + int edgeNum() const { return gw.edgeNum(); } + + template Node aNode(const I& e) const { return gw.aNode(e); } + template Node bNode(const I& e) const { return gw.bNode(e); } + + Node addNode() const { return gw.addNode(); } + Edge addEdge(const Node& tail, const Node& head) const { + return gw.addEdge(tail, head); } + + template void erase(const I& i) const { gw.erase(i); } + + void clear() const { gw.clear(); } + + template class NodeMap : public GraphWrapper::NodeMap { + public: + NodeMap(const GraphWrapperSkeleton& _G) : + GraphWrapper::NodeMap(_G.gw) { } + NodeMap(const GraphWrapperSkeleton& _G, T a) : + GraphWrapper::NodeMap(_G.gw, a) { } + }; + + template class EdgeMap : public GraphWrapper::EdgeMap { + public: + EdgeMap(const GraphWrapperSkeleton& _G) : + GraphWrapper::EdgeMap(_G.gw) { } + EdgeMap(const GraphWrapperSkeleton& _G, T a) : + GraphWrapper::EdgeMap(_G.gw, a) { } + }; + }; + + template + class GraphWrapperSkeleton1 { + protected: + GraphWrapper* g; + + public: + //typedef typename GraphWrapper::BaseGraph BaseGraph; + +// typedef typename GraphWrapper::Node Node; +// typedef typename GraphWrapper::NodeIt NodeIt; + +// typedef typename GraphWrapper::Edge Edge; +// typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; +// typedef typename GraphWrapper::InEdgeIt InEdgeIt; +// //typedef typename GraphWrapper::SymEdgeIt SymEdgeIt; +// typedef typename GraphWrapper::EdgeIt EdgeIt; + + typedef typename GraphWrapper::Node Node; + class NodeIt : public GraphWrapper::NodeIt { + public: + NodeIt() { } + NodeIt(const typename GraphWrapper::NodeIt& n) : + GraphWrapper::NodeIt(n) { } + NodeIt(const Invalid& i) : GraphWrapper::NodeIt(i) { } + NodeIt(const GraphWrapperSkeleton1& _G) : + GraphWrapper::NodeIt(*(_G.g)) { } + }; + typedef typename GraphWrapper::Edge Edge; + //typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; + class OutEdgeIt : public GraphWrapper::OutEdgeIt { + public: + OutEdgeIt() { } + OutEdgeIt(const typename GraphWrapper::OutEdgeIt& e) : + GraphWrapper::OutEdgeIt(e) { } + OutEdgeIt(const Invalid& i) : GraphWrapper::OutEdgeIt(i) { } + OutEdgeIt(const GraphWrapperSkeleton1& _G, const Node& n) : + GraphWrapper::OutEdgeIt(*(_G.g), n) { } + }; + //typedef typename GraphWrapper::InEdgeIt InEdgeIt; + class InEdgeIt : public GraphWrapper::InEdgeIt { + public: + InEdgeIt() { } + InEdgeIt(const typename GraphWrapper::InEdgeIt& e) : + GraphWrapper::InEdgeIt(e) { } + InEdgeIt(const Invalid& i) : GraphWrapper::InEdgeIt(i) { } + InEdgeIt(const GraphWrapperSkeleton1& _G, const Node& n) : + GraphWrapper::InEdgeIt(*(_G.g), n) { } + }; + //typedef typename GraphWrapper::SymEdgeIt SymEdgeIt; + //typedef typename GraphWrapper::EdgeIt EdgeIt; + class EdgeIt : public GraphWrapper::EdgeIt { + public: + EdgeIt() { } + EdgeIt(const typename GraphWrapper::EdgeIt& e) : + GraphWrapper::EdgeIt(e) { } + EdgeIt(const Invalid& i) : GraphWrapper::EdgeIt(i) { } + EdgeIt(const GraphWrapperSkeleton1& _G) : + GraphWrapper::EdgeIt(*(_G.g)) { } + }; + + + //GraphWrapperSkeleton() : gw() { } + GraphWrapperSkeleton1(GraphWrapper& _gw) : g(&_gw) { } + + //void setGraph(BaseGraph& _graph) { gw.setGraph(_graph); } + //BaseGraph& getGraph() const { return gw.getGraph(); } + + template I& first(I& i) const { + i=I(*this); + return i; + } + template I& first(I& i, const P& p) const { + i=I(*this, p); + return i; + } + +// template I getNext(const I& i) const { return gw.getNext(i); } + template I& next(I &i) const { g->next(i); return i; } + + template< typename It > It first() const { + It e; this->first(e); return e; } + + template< typename It > It first(const Node& v) const { + It e; this->first(e, v); return e; } + + Node head(const Edge& e) const { return g->head(e); } + Node tail(const Edge& e) const { return g->tail(e); } + + template bool valid(const I& i) const { return g->valid(i); } + + //template void setInvalid(const I &i); + //{ return graph->setInvalid(i); } + + int nodeNum() const { return g->nodeNum(); } + int edgeNum() const { return g->edgeNum(); } + + template Node aNode(const I& e) const { return g->aNode(e); } + template Node bNode(const I& e) const { return g->bNode(e); } + + Node addNode() const { return g->addNode(); } + Edge addEdge(const Node& tail, const Node& head) const { + return g->addEdge(tail, head); } + + template void erase(const I& i) const { g->erase(i); } + + void clear() const { g->clear(); } + + template class NodeMap : public GraphWrapper::NodeMap { + public: + NodeMap(const GraphWrapperSkeleton1& _G) : + GraphWrapper::NodeMap(*(_G.g)) { } + NodeMap(const GraphWrapperSkeleton1& _G, T a) : + GraphWrapper::NodeMap(*(_G.g), a) { } + }; + + template class EdgeMap : public GraphWrapper::EdgeMap { + public: + EdgeMap(const GraphWrapperSkeleton1& _G) : + GraphWrapper::EdgeMap(*(_G.g)) { } + EdgeMap(const GraphWrapperSkeleton1& _G, T a) : + GraphWrapper::EdgeMap(*(_G.g), a) { } + }; + }; + + +// template +// class RevGraphWrapper +// { +// protected: +// Graph* graph; + +// public: +// typedef Graph BaseGraph; + +// typedef typename Graph::Node Node; +// typedef typename Graph::NodeIt NodeIt; + +// typedef typename Graph::Edge Edge; +// typedef typename Graph::OutEdgeIt InEdgeIt; +// typedef typename Graph::InEdgeIt OutEdgeIt; +// //typedef typename Graph::SymEdgeIt SymEdgeIt; +// typedef typename Graph::EdgeIt EdgeIt; + +// //RevGraphWrapper() : graph(0) { } +// RevGraphWrapper(Graph& _graph) : graph(&_graph) { } + +// void setGraph(Graph& _graph) { graph = &_graph; } +// Graph& getGraph() const { return (*graph); } + +// template I& first(I& i) const { return graph->first(i); } +// template I& first(I& i, const P& p) const { +// return graph->first(i, p); } + +// template I getNext(const I& i) const { +// return graph->getNext(i); } +// template I& next(I &i) const { return graph->next(i); } + +// template< typename It > It first() const { +// It e; first(e); return e; } + +// template< typename It > It first(const Node& v) const { +// It e; first(e, v); return e; } + +// Node head(const Edge& e) const { return graph->tail(e); } +// Node tail(const Edge& e) const { return graph->head(e); } + +// template bool valid(const I& i) const +// { return graph->valid(i); } + +// //template void setInvalid(const I &i); +// //{ return graph->setInvalid(i); } + +// template Node aNode(const I& e) const { +// return graph->aNode(e); } +// template Node bNode(const I& e) const { +// return graph->bNode(e); } + +// Node addNode() const { return graph->addNode(); } +// Edge addEdge(const Node& tail, const Node& head) const { +// return graph->addEdge(tail, head); } + +// int nodeNum() const { return graph->nodeNum(); } +// int edgeNum() const { return graph->edgeNum(); } + +// template void erase(const I& i) const { graph->erase(i); } + +// void clear() const { graph->clear(); } + +// template class NodeMap : public Graph::NodeMap { +// public: +// NodeMap(const RevGraphWrapper& _G) : +// Graph::NodeMap(_G.getGraph()) { } +// NodeMap(const RevGraphWrapper& _G, T a) : +// Graph::NodeMap(_G.getGraph(), a) { } +// }; + +// template class EdgeMap : public Graph::EdgeMap { +// public: +// EdgeMap(const RevGraphWrapper& _G) : +// Graph::EdgeMap(_G.getGraph()) { } +// EdgeMap(const RevGraphWrapper& _G, T a) : +// Graph::EdgeMap(_G.getGraph(), a) { } +// }; +// }; + +// template*/ > +// class RevGraphWrapper : +// public GraphWrapper/*GraphWrapperSkeleton< TrivGraphWrapper >*/ { +// protected: +// //Graph* graph; + +// public: +// //typedef Graph BaseGraph; + +// //typedef typename Graph::Node Node; +// //typedef typename Graph::NodeIt NodeIt; + +// //typedef typename Graph::Edge Edge; +// typedef typename GraphWrapper/*typename GraphWrapperSkeleton< TrivGraphWrapper >*/::OutEdgeIt InEdgeIt; +// typedef typename GraphWrapper/*typename GraphWrapperSkeleton< TrivGraphWrapper >*/::InEdgeIt OutEdgeIt; +// //typedef typename Graph::SymEdgeIt SymEdgeIt; +// //typedef typename Graph::EdgeIt EdgeIt; + +// //RevGraphWrapper() : graph(0) { } +// RevGraphWrapper(GraphWrapper _gw/*BaseGraph& _graph*/) : GraphWrapper/*GraphWrapperSkeleton< TrivGraphWrapper >*/(_gw/*TrivGraphWrapper(_graph)*/) { } + +// //void setGraph(Graph& _graph) { graph = &_graph; } +// //Graph& getGraph() const { return (*graph); } + +// //template I& first(I& i) const { return graph->first(i); } +// //template I& first(I& i, const P& p) const { +// // return graph->first(i, p); } + +// //template I getNext(const I& i) const { +// // return graph->getNext(i); } +// //template I& next(I &i) const { return graph->next(i); } + +// //template< typename It > It first() const { +// // It e; first(e); return e; } + +// //template< typename It > It first(const Node& v) const { +// // It e; first(e, v); return e; } + +// //Node head(const Edge& e) const { return graph->tail(e); } +// //Node tail(const Edge& e) const { return graph->head(e); } + +// //template bool valid(const I& i) const +// // { return graph->valid(i); } + +// //template void setInvalid(const I &i); +// //{ return graph->setInvalid(i); } + +// //template Node aNode(const I& e) const { +// // return graph->aNode(e); } +// //template Node bNode(const I& e) const { +// // return graph->bNode(e); } + +// //Node addNode() const { return graph->addNode(); } +// //Edge addEdge(const Node& tail, const Node& head) const { +// // return graph->addEdge(tail, head); } + +// //int nodeNum() const { return graph->nodeNum(); } +// //int edgeNum() const { return graph->edgeNum(); } + +// //template void erase(const I& i) const { graph->erase(i); } + +// //void clear() const { graph->clear(); } + +// template class NodeMap : +// public GraphWrapper/*Skeleton< TrivGraphWrapper >*/::NodeMap +// { +// public: +// NodeMap(const RevGraphWrapper& _gw) : +// GraphWrapper/*Skeleton< TrivGraphWrapper >*/::NodeMap(_gw) { } +// NodeMap(const RevGraphWrapper& _gw, T a) : +// GraphWrapper/*Skeleton< TrivGraphWrapper >*/::NodeMap(_gw, a) { } +// }; + +// template class EdgeMap : +// public GraphWrapper/*Skeleton< TrivGraphWrapper >*/::EdgeMap { +// public: +// EdgeMap(const RevGraphWrapper& _gw) : +// GraphWrapper/*Skeleton< TrivGraphWrapper >*/::EdgeMap(_gw) { } +// EdgeMap(const RevGraphWrapper& _gw, T a) : +// GraphWrapper/*Skeleton< TrivGraphWrapper >*/::EdgeMap(_gw, a) { } +// }; +// }; + + template + class RevGraphWrapper : public GraphWrapperSkeleton1 { + public: + typedef typename GraphWrapperSkeleton1::Node Node; + typedef typename GraphWrapperSkeleton1::Edge Edge; + //FIXME + //If GraphWrapper::OutEdgeIt is not defined + //and we do not want to use RevGraphWrapper::InEdgeIt, + //this won't work, because of typedef + //OR + //graphs have to define their non-existing iterators to void + //Unfortunately all the typedefs are instantiated in templates, + //unlike other stuff + typedef typename GraphWrapperSkeleton1::OutEdgeIt InEdgeIt; + typedef typename GraphWrapperSkeleton1::InEdgeIt OutEdgeIt; + + RevGraphWrapper(GraphWrapper& _gw) : + GraphWrapperSkeleton1(_gw) { } + + Node head(const Edge& e) const + { return GraphWrapperSkeleton1::tail(e); } + Node tail(const Edge& e) const + { return GraphWrapperSkeleton1::head(e); } + }; + + //Subgraph on the same node-set and partial edge-set + template + class SubGraphWrapper : public GraphWrapperSkeleton1 { + protected: + EdgeFilterMap* filter_map; + public: + typedef typename GraphWrapperSkeleton1::Node Node; + typedef typename GraphWrapperSkeleton1::NodeIt NodeIt; + typedef typename GraphWrapperSkeleton1::Edge Edge; + typedef typename GraphWrapperSkeleton1::EdgeIt EdgeIt; + typedef typename GraphWrapperSkeleton1::InEdgeIt InEdgeIt; + typedef typename GraphWrapperSkeleton1::OutEdgeIt OutEdgeIt; + + SubGraphWrapper(GraphWrapper& _gw, EdgeFilterMap& _filter_map) : + GraphWrapperSkeleton1(_gw), filter_map(&_filter_map) { } + + template I& first(I& i) const { + g->first(i); + while (g->valid(i) && !filter_map->get(i)) { g->next(i); } + return i; + } + template I& first(I& i, const P& p) const { + g->first(i, p); + while (g->valid(i) && !filter_map->get(i)) { g->next(i); } + return i; + } + + //template I getNext(const I& i) const { + // return gw.getNext(i); + //} + template I& next(I &i) const { + g->next(i); + while (g->valid(i) && !filter_map->get(i)) { g->next(i); } + return i; + } + + template< typename It > It first() const { + It e; this->first(e); return e; } + + template< typename It > It first(const Node& v) const { + It e; this->first(e, v); return e; } + }; + +// template +// class UndirGraphWrapper { +// protected: +// //Graph* graph; +// GraphWrapper gw; + +// public: +// typedef GraphWrapper BaseGraph; + +// typedef typename GraphWrapper::Node Node; +// typedef typename GraphWrapper::NodeIt NodeIt; + +// //typedef typename Graph::Edge Edge; +// //typedef typename Graph::OutEdgeIt OutEdgeIt; +// //typedef typename Graph::InEdgeIt InEdgeIt; +// //typedef typename Graph::SymEdgeIt SymEdgeIt; +// //typedef typename Graph::EdgeIt EdgeIt; + +// //private: +// typedef typename GraphWrapper::Edge GraphEdge; +// typedef typename GraphWrapper::OutEdgeIt GraphOutEdgeIt; +// typedef typename GraphWrapper::InEdgeIt GraphInEdgeIt; +// //public: + +// //UndirGraphWrapper() : graph(0) { } +// UndirGraphWrapper(GraphWrapper _gw) : gw(_gw) { } + +// //void setGraph(Graph& _graph) { graph = &_graph; } +// //Graph& getGraph() const { return (*graph); } + +// class Edge { +// friend class UndirGraphWrapper; +// bool out_or_in; //true iff out +// GraphOutEdgeIt out; +// GraphInEdgeIt in; +// public: +// Edge() : out_or_in(), out(), in() { } +// Edge(const Invalid& i) : out_or_in(false), out(), in(i) { } +// operator GraphEdge() const { +// if (out_or_in) return(out); else return(in); +// } +// friend bool operator==(const Edge& u, const Edge& v) { +// if (v.out_or_in) +// return (u.out_or_in && u.out==v.out); +// else +// return (!u.out_or_in && u.in==v.in); +// } +// friend bool operator!=(const Edge& u, const Edge& v) { +// if (v.out_or_in) +// return (!u.out_or_in || u.out!=v.out); +// else +// return (u.out_or_in || u.in!=v.in); +// } +// }; + +// class OutEdgeIt : public Edge { +// friend class UndirGraphWrapper; +// public: +// OutEdgeIt() : Edge() { } +// OutEdgeIt(const Invalid& i) : Edge(i) { } +// OutEdgeIt(const UndirGraphWrapper& _G, const Node& n) +// : Edge() { +// out_or_in=true; +// _G.gw.first(out, n); +// if (!(_G.gw.valid(out))) { +// out_or_in=false; +// _G.gw.first(in, n); +// } +// } +// }; + +// OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { +// e.out_or_in=true; +// gw.first(e.out, n); +// if (!(gw.valid(e.out))) { +// e.out_or_in=false; +// gw.first(e.in, n); +// } +// return e; +// } + +// OutEdgeIt& next(OutEdgeIt& e) const { +// if (e.out_or_in) { +// Node n=gw.tail(e.out); +// gw.next(e.out); +// if (!gw.valid(e.out)) { +// e.out_or_in=false; +// gw.first(e.in, n); +// } +// } else { +// gw.next(e.in); +// } +// return e; +// } + +// Node aNode(const OutEdgeIt& e) const { +// if (e.out_or_in) return gw.tail(e); else return gw.head(e); } +// Node bNode(const OutEdgeIt& e) const { +// if (e.out_or_in) return gw.head(e); else return gw.tail(e); } + +// typedef OutEdgeIt InEdgeIt; + +// template I& first(I& i) const { return gw.first(i); } +// // template I& first(I& i, const P& p) const { +// // return graph->first(i, p); } + +// template I getNext(const I& i) const { +// return gw.getNext(i); } +// template I& next(I &i) const { return gw.next(i); } + +// template< typename It > It first() const { +// It e; first(e); return e; } + +// template< typename It > It first(const Node& v) const { +// It e; first(e, v); return e; } + +// Node head(const Edge& e) const { return gw.head(e); } +// Node tail(const Edge& e) const { return gw.tail(e); } + +// template bool valid(const I& i) const +// { return gw.valid(i); } + +// //template void setInvalid(const I &i); +// //{ return graph->setInvalid(i); } + +// int nodeNum() const { return gw.nodeNum(); } +// int edgeNum() const { return gw.edgeNum(); } + +// // template Node aNode(const I& e) const { +// // return graph->aNode(e); } +// // template Node bNode(const I& e) const { +// // return graph->bNode(e); } + +// Node addNode() const { return gw.addNode(); } +// // FIXME: ez igy nem jo, mert nem +// // Edge addEdge(const Node& tail, const Node& head) const { +// // return graph->addEdge(tail, head); } + +// template void erase(const I& i) const { gw.erase(i); } + +// void clear() const { gw.clear(); } + +// template class NodeMap : public GraphWrapper::NodeMap { +// public: +// NodeMap(const UndirGraphWrapper& _G) : +// GraphWrapper::NodeMap(_G.gw) { } +// NodeMap(const UndirGraphWrapper& _G, T a) : +// GraphWrapper::NodeMap(_G.gw, a) { } +// }; + +// template class EdgeMap : public GraphWrapper::EdgeMap { +// public: +// EdgeMap(const UndirGraphWrapper& _G) : +// GraphWrapper::EdgeMap(_G.gw) { } +// EdgeMap(const UndirGraphWrapper& _G, T a) : +// GraphWrapper::EdgeMap(_G.gw, a) { } +// }; +// }; + + + template + class UndirGraphWrapper : public GraphWrapperSkeleton1 { + protected: +// GraphWrapper gw; + + public: + //typedef GraphWrapper BaseGraph; + + typedef typename GraphWrapperSkeleton1::Node Node; + typedef typename GraphWrapperSkeleton1::NodeIt NodeIt; + + //private: + //FIXME ezeknek valojaban a GraphWrapper megfelelo dolgai kellene hogy + //legyenek, at kell irni + typedef typename /*GraphWrapperSkeleton*/ + GraphWrapper::Edge GraphEdge; + typedef typename /*GraphWrapperSkeleton*/ + GraphWrapper::OutEdgeIt GraphOutEdgeIt; + typedef typename /*GraphWrapperSkeleton*/ + GraphWrapper::InEdgeIt GraphInEdgeIt; + //public: + + //UndirGraphWrapper() : graph(0) { } + UndirGraphWrapper(GraphWrapper& _gw) : + GraphWrapperSkeleton1(_gw) { } + + //UndirGraphWrapper(GraphWrapper _gw) : gw(_gw) { } + + //void setGraph(Graph& _graph) { graph = &_graph; } + //Graph& getGraph() const { return (*graph); } + + class Edge { + friend class UndirGraphWrapper; + protected: + bool out_or_in; //true iff out + GraphOutEdgeIt out; + GraphInEdgeIt in; + public: + Edge() : out_or_in(), out(), in() { } + Edge(const Invalid& i) : out_or_in(false), out(), in(i) { } + operator GraphEdge() const { + if (out_or_in) return(out); else return(in); + } +//FIXME +//2 edges are equal if they "refer" to the same physical edge +//is it good? + friend bool operator==(const Edge& u, const Edge& v) { + if (v.out_or_in) + if (u.out_or_in) return (u.out==v.out); else return (u.out==v.in); + //return (u.out_or_in && u.out==v.out); + else + if (u.out_or_in) return (u.out==v.in); else return (u.in==v.in); + //return (!u.out_or_in && u.in==v.in); + } + friend bool operator!=(const Edge& u, const Edge& v) { + if (v.out_or_in) + if (u.out_or_in) return (u.out!=v.out); else return (u.out!=v.in); + //return (!u.out_or_in || u.out!=v.out); + else + if (u.out_or_in) return (u.out!=v.in); else return (u.in!=v.in); + //return (u.out_or_in || u.in!=v.in); + } + }; + + class OutEdgeIt : public Edge { + friend class UndirGraphWrapper; + public: + OutEdgeIt() : Edge() { } + OutEdgeIt(const Invalid& i) : Edge(i) { } + OutEdgeIt(const UndirGraphWrapper& _G, const Node& n) + : Edge() { + out_or_in=true; _G.g->first(out, n); + if (!(_G.g->valid(out))) { out_or_in=false; _G.g->first(in, n); } + } + }; + + typedef OutEdgeIt InEdgeIt; + + class EdgeIt : public Edge { + friend class UndirGraphWrapper; + protected: + NodeIt v; + public: + EdgeIt() : Edge() { } + EdgeIt(const Invalid& i) : Edge(i) { } + EdgeIt(const UndirGraphWrapper& _G) + : Edge() { + out_or_in=true; + //Node v; + _G.first(v); + if (_G.valid(v)) _G.g->first(out); else out=INVALID; + while (_G.valid(v) && !_G.g->valid(out)) { + _G.g->next(v); + if (_G.valid(v)) _G.g->first(out); + } + } + }; + + OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { + e.out_or_in=true; g->first(e.out, n); + if (!(g->valid(e.out))) { e.out_or_in=false; g->first(e.in, n); } + return e; + } + + EdgeIt& first(EdgeIt& e) const { + e.out_or_in=true; + //NodeIt v; + first(e.v); + if (valid(e.v)) g->first(e.out, e.v); else e.out=INVALID; + while (valid(e.v) && !g->valid(e.out)) { + g->next(e.v); + if (valid(e.v)) g->first(e.out, e.v); + } + return e; + } + + template I& first(I& i) const { g->first(i); return i; } + template I& first(I& i, const P& p) const { + g->first(i, p); return i; } + + OutEdgeIt& next(OutEdgeIt& e) const { + if (e.out_or_in) { + Node n=g->tail(e.out); + g->next(e.out); + if (!g->valid(e.out)) { e.out_or_in=false; g->first(e.in, n); } + } else { + g->next(e.in); + } + return e; + } + + EdgeIt& next(EdgeIt& e) const { + //NodeIt v=tail(e); + g->next(e.out); + while (valid(e.v) && !g->valid(e.out)) { + next(e.v); + if (valid(e.v)) g->first(e.out, e.v); + } + return e; + } + + template I& next(I &i) const { return g->next(i); } +// template I getNext(const I& i) const { return gw.getNext(i); } + + template< typename It > It first() const { + It e; first(e); return e; } + + template< typename It > It first(const Node& v) const { + It e; first(e, v); return e; } + +// Node head(const Edge& e) const { return gw.head(e); } +// Node tail(const Edge& e) const { return gw.tail(e); } + +// template bool valid(const I& i) const +// { return gw.valid(i); } + +// int nodeNum() const { return gw.nodeNum(); } +// int edgeNum() const { return gw.edgeNum(); } + +// template Node aNode(const I& e) const { +// return graph->aNode(e); } +// template Node bNode(const I& e) const { +// return graph->bNode(e); } + + Node aNode(const OutEdgeIt& e) const { + if (e.out_or_in) return g->tail(e); else return g->head(e); } + Node bNode(const OutEdgeIt& e) const { + if (e.out_or_in) return g->head(e); else return g->tail(e); } + +// Node addNode() const { return gw.addNode(); } + +// FIXME: ez igy nem jo, mert nem +// Edge addEdge(const Node& tail, const Node& head) const { +// return graph->addEdge(tail, head); } + +// template void erase(const I& i) const { gw.erase(i); } + +// void clear() const { gw.clear(); } + +// template class NodeMap : public GraphWrapper::NodeMap { +// public: +// NodeMap(const UndirGraphWrapper& _G) : +// GraphWrapper::NodeMap(_G.gw) { } +// NodeMap(const UndirGraphWrapper& _G, T a) : +// GraphWrapper::NodeMap(_G.gw, a) { } +// }; + +// template class EdgeMap : +// public GraphWrapperSkeleton::EdgeMap { +// public: +// EdgeMap(const UndirGraphWrapper& _G) : +// GraphWrapperSkeleton::EdgeMap(_G.gw) { } +// EdgeMap(const UndirGraphWrapper& _G, T a) : +// GraphWrapper::EdgeMap(_G.gw, a) { } +// }; + }; + + + + + +// template +// class SymGraphWrapper +// { +// Graph* graph; + +// public: +// typedef Graph BaseGraph; + +// typedef typename Graph::Node Node; +// typedef typename Graph::Edge Edge; + +// typedef typename Graph::NodeIt NodeIt; + +// //FIXME tag-ekkel megcsinalni, hogy abbol csinaljon +// //iranyitatlant, ami van +// //mert csak 1 dolgot lehet be typedef-elni +// typedef typename Graph::OutEdgeIt SymEdgeIt; +// //typedef typename Graph::InEdgeIt SymEdgeIt; +// //typedef typename Graph::SymEdgeIt SymEdgeIt; +// typedef typename Graph::EdgeIt EdgeIt; + +// int nodeNum() const { return graph->nodeNum(); } +// int edgeNum() const { return graph->edgeNum(); } + +// template I& first(I& i) const { return graph->first(i); } +// template I& first(I& i, const P& p) const { +// return graph->first(i, p); } +// //template I next(const I i); { return graph->goNext(i); } +// //template I &goNext(I &i); { return graph->goNext(i); } + +// template< typename It > It first() const { +// It e; first(e); return e; } + +// template< typename It > It first(Node v) const { +// It e; first(e, v); return e; } + +// Node head(const Edge& e) const { return graph->head(e); } +// Node tail(const Edge& e) const { return graph->tail(e); } + +// template Node aNode(const I& e) const { +// return graph->aNode(e); } +// template Node bNode(const I& e) const { +// return graph->bNode(e); } + +// //template bool valid(const I i); +// //{ return graph->valid(i); } + +// //template void setInvalid(const I &i); +// //{ return graph->setInvalid(i); } + +// Node addNode() { return graph->addNode(); } +// Edge addEdge(const Node& tail, const Node& head) { +// return graph->addEdge(tail, head); } + +// template void erase(const I& i) { graph->erase(i); } + +// void clear() { graph->clear(); } + +// template class NodeMap : public Graph::NodeMap { }; +// template class EdgeMap : public Graph::EdgeMap { }; + +// void setGraph(Graph& _graph) { graph = &_graph; } +// Graph& getGraph() { return (*graph); } + +// //SymGraphWrapper() : graph(0) { } +// SymGraphWrapper(Graph& _graph) : graph(&_graph) { } +// }; + + + template + class ResGraphWrapper : public GraphWrapperSkeleton1{ + public: + //typedef Graph BaseGraph; + //typedef TrivGraphWrapper GraphWrapper; + typedef typename GraphWrapperSkeleton1::Node Node; + typedef typename GraphWrapperSkeleton1::NodeIt NodeIt; + private: + typedef typename /*GraphWrapperSkeleton*/ + GraphWrapper::OutEdgeIt OldOutEdgeIt; + typedef typename /*GraphWrapperSkeleton*/ + GraphWrapper::InEdgeIt OldInEdgeIt; + protected: + //const Graph* graph; + //GraphWrapper gw; + FlowMap* flow; + const CapacityMap* capacity; + public: + + ResGraphWrapper(GraphWrapper& _gw, FlowMap& _flow, + const CapacityMap& _capacity) : + GraphWrapperSkeleton1(_gw), + flow(&_flow), capacity(&_capacity) { } + + //void setGraph(const Graph& _graph) { graph = &_graph; } + //const Graph& getGraph() const { return (*graph); } + + class Edge; + class OutEdgeIt; + friend class Edge; + friend class OutEdgeIt; + + class Edge { + friend class ResGraphWrapper; + protected: + bool out_or_in; //true, iff out + OldOutEdgeIt out; + OldInEdgeIt in; + public: + Edge() : out_or_in(true) { } + Edge(const Invalid& i) : out_or_in(false), out(), in(i) { } +// bool valid() const { +// return out_or_in && out.valid() || in.valid(); } + friend bool operator==(const Edge& u, const Edge& v) { + if (v.out_or_in) + return (u.out_or_in && u.out==v.out); + else + return (!u.out_or_in && u.in==v.in); + } + friend bool operator!=(const Edge& u, const Edge& v) { + if (v.out_or_in) + return (!u.out_or_in || u.out!=v.out); + else + return (u.out_or_in || u.in!=v.in); + } + }; + + + class OutEdgeIt : public Edge { + friend class ResGraphWrapper; + public: + OutEdgeIt() { } + //FIXME + OutEdgeIt(const Edge& e) : Edge(e) { } + OutEdgeIt(const Invalid& i) : Edge(i) { } + protected: + OutEdgeIt(const ResGraphWrapper& resG, Node v) : Edge() { + resG.g->first(out, v); + while( resG.g->valid(out) && !(resG.resCap(out)>0) ) { resG.g->next(out); } + if (!resG.g->valid(out)) { + out_or_in=0; + resG.g->first(in, v); + while( resG.g->valid(in) && !(resG.resCap(in)>0) ) { resG.g->next(in); } + } + } +// public: +// OutEdgeIt& operator++() { +// if (out_or_in) { +// Node v=/*resG->*/G->aNode(out); +// ++out; +// while( out.valid() && !(Edge::resCap()>0) ) { ++out; } +// if (!out.valid()) { +// out_or_in=0; +// G->first(in, v); +// while( in.valid() && !(Edge::resCap()>0) ) { ++in; } +// } +// } else { +// ++in; +// while( in.valid() && !(Edge::resCap()>0) ) { ++in; } +// } +// return *this; +// } + }; + + //FIXME This is just for having InEdgeIt + typedef void InEdgeIt; + + class EdgeIt : public Edge { + friend class ResGraphWrapper; + NodeIt v; + public: + EdgeIt() { } + //EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { } + EdgeIt(const Invalid& i) : Edge(i) { } + EdgeIt(const ResGraphWrapper& resG) : Edge() { + resG.g->first(v); + if (resG.g->valid(v)) resG.g->first(out, v); else out=INVALID; + while (resG.g->valid(out) && !(resG.resCap(out)>0) ) { resG.g->next(out); } + while (resG.g->valid(v) && !resG.g->valid(out)) { + resG.g->next(v); + if (resG.g->valid(v)) resG.g->first(out, v); + while (resG.g->valid(out) && !(resG.resCap(out)>0) ) { resG.g->next(out); } + } + if (!resG.g->valid(out)) { + out_or_in=0; + resG.g->first(v); + if (resG.g->valid(v)) resG.g->first(in, v); else in=INVALID; + while (resG.g->valid(in) && !(resG.resCap(in)>0) ) { resG.g->next(in); } + while (resG.g->valid(v) && !resG.g->valid(in)) { + resG.g->next(v); + if (resG.g->valid(v)) resG.g->first(in, v); + while (resG.g->valid(in) && !(resG.resCap(in)>0) ) { resG.g->next(in); } + } + } + } +// EdgeIt& operator++() { +// if (out_or_in) { +// ++out; +// while (out.valid() && !(Edge::resCap()>0) ) { ++out; } +// while (v.valid() && !out.valid()) { +// ++v; +// if (v.valid()) G->first(out, v); +// while (out.valid() && !(Edge::resCap()>0) ) { ++out; } +// } +// if (!out.valid()) { +// out_or_in=0; +// G->first(v); +// if (v.valid()) G->first(in, v); else in=OldInEdgeIt(); +// while (in.valid() && !(Edge::resCap()>0) ) { ++in; } +// while (v.valid() && !in.valid()) { +// ++v; +// if (v.valid()) G->first(in, v); +// while (in.valid() && !(Edge::resCap()>0) ) { ++in; } +// } +// } +// } else { +// ++in; +// while (in.valid() && !(Edge::resCap()>0) ) { ++in; } +// while (v.valid() && !in.valid()) { +// ++v; +// if (v.valid()) G->first(in, v); +// while (in.valid() && !(Edge::resCap()>0) ) { ++in; } +// } +// } +// return *this; +// } + }; + + NodeIt& first(NodeIt& v) const { g->first(v); return v; } + OutEdgeIt& first(OutEdgeIt& e, Node v) const { + e=OutEdgeIt(*this, v); + return e; + } + EdgeIt& first(EdgeIt& e) const { + e=EdgeIt(*this); + return e; + } + + NodeIt& next(NodeIt& n) const { return g->next(n); } + + OutEdgeIt& next(OutEdgeIt& e) const { + if (e.out_or_in) { + Node v=g->aNode(e.out); + g->next(e.out); + while( g->valid(e.out) && !(resCap(e.out)>0) ) { g->next(e.out); } + if (!g->valid(e.out)) { + e.out_or_in=0; + g->first(e.in, v); + while( g->valid(e.in) && !(resCap(e.in)>0) ) { g->next(e.in); } + } + } else { + g->next(e.in); + while( g->valid(e.in) && !(resCap(e.in)>0) ) { g->next(e.in); } + } + return e; + } + + EdgeIt& next(EdgeIt& e) const { + if (e.out_or_in) { + g->next(e.out); + while (g->valid(e.out) && !(resCap(e.out)>0) ) { g->next(e.out); } + while (g->valid(e.v) && !g->valid(e.out)) { + g->next(e.v); + if (g->valid(e.v)) g->first(e.out, e.v); + while (g->valid(e.out) && !(resCap(e.out)>0) ) { g->next(e.out); } + } + if (!g->valid(e.out)) { + e.out_or_in=0; + g->first(e.v); + if (g->valid(e.v)) g->first(e.in, e.v); else e.in=INVALID; + while (g->valid(e.in) && !(resCap(e.in)>0) ) { g->next(e.in); } + while (g->valid(e.v) && !g->valid(e.in)) { + g->next(e.v); + if (g->valid(e.v)) g->first(e.in, e.v); + while (g->valid(e.in) && !(resCap(e.in)>0) ) { g->next(e.in); } + } + } + } else { + g->next(e.in); + while (g->valid(e.in) && !(resCap(e.in)>0) ) { g->next(e.in); } + while (g->valid(e.v) && !g->valid(e.in)) { + g->next(e.v); + if (g->valid(e.v)) g->first(e.in, e.v); + while (g->valid(e.in) && !(resCap(e.in)>0) ) { g->next(e.in); } + } + } + return e; + } + + + template< typename It > + It first() const { + It e; + first(e); + return e; + } + + template< typename It > + It first(Node v) const { + It e; + first(e, v); + return e; + } + + Node tail(Edge e) const { + return ((e.out_or_in) ? g->aNode(e.out) : g->aNode(e.in)); } + Node head(Edge e) const { + return ((e.out_or_in) ? g->bNode(e.out) : g->bNode(e.in)); } + + Node aNode(OutEdgeIt e) const { + return ((e.out_or_in) ? g->aNode(e.out) : g->aNode(e.in)); } + Node bNode(OutEdgeIt e) const { + return ((e.out_or_in) ? g->bNode(e.out) : g->bNode(e.in)); } + + int nodeNum() const { return g->nodeNum(); } + //FIXME + //int edgeNum() const { return g->edgeNum(); } + + + int id(Node v) const { return g->id(v); } + + bool valid(Node n) const { return g->valid(n); } + bool valid(Edge e) const { + return e.out_or_in ? g->valid(e.out) : g->valid(e.in); } + + void augment(const Edge& e, Number a) const { + if (e.out_or_in) + flow->set(e.out, flow->get(e.out)+a); + else + flow->set(e.in, flow->get(e.in)-a); + } + + Number resCap(const Edge& e) const { + if (e.out_or_in) + return (capacity->get(e.out)-flow->get(e.out)); + else + return (flow->get(e.in)); + } + + Number resCap(OldOutEdgeIt out) const { + return (capacity->get(out)-flow->get(out)); + } + + Number resCap(OldInEdgeIt in) const { + return (flow->get(in)); + } + +// template class NodeMap : public GraphWrapper::NodeMap { +// public: +// NodeMap(const ResGraphWrapper& _G) +// : GraphWrapper::NodeMap(_G.gw) { } +// NodeMap(const ResGraphWrapper& _G, +// T a) : GraphWrapper::NodeMap(_G.gw, a) { } +// }; + +// template +// class NodeMap { +// typename Graph::NodeMap node_map; +// public: +// NodeMap(const ResGraphWrapper& _G) : node_map(*(_G.graph)) { } +// NodeMap(const ResGraphWrapper& _G, T a) : node_map(*(_G.graph), a) { } +// void set(Node nit, T a) { node_map.set(nit, a); } +// T get(Node nit) const { return node_map.get(nit); } +// }; + + template + class EdgeMap { + typename GraphWrapper::EdgeMap forward_map, backward_map; + public: + EdgeMap(const ResGraphWrapper& _G) : forward_map(_G.gw), backward_map(_G.gw) { } + EdgeMap(const ResGraphWrapper& _G, T a) : forward_map(_G.gw, a), backward_map(_G.gw, a) { } + void set(Edge e, T a) { + if (e.out_or_in) + forward_map.set(e.out, a); + else + backward_map.set(e.in, a); + } + T get(Edge e) { + if (e.out_or_in) + return forward_map.get(e.out); + else + return backward_map.get(e.in); + } + }; + }; + + //Subgraph on the same node-set and partial edge-set + template + class ErasingFirstGraphWrapper : public GraphWrapperSkeleton1 { + protected: + FirstOutEdgesMap* first_out_edges; + public: + typedef typename GraphWrapperSkeleton1::Node Node; + typedef typename GraphWrapperSkeleton1::NodeIt NodeIt; + typedef typename GraphWrapperSkeleton1::Edge Edge; + typedef typename GraphWrapperSkeleton1::EdgeIt EdgeIt; + typedef typename GraphWrapperSkeleton1::InEdgeIt InEdgeIt; + typedef typename GraphWrapperSkeleton1::OutEdgeIt OutEdgeIt; + + ErasingFirstGraphWrapper(GraphWrapper& _gw, FirstOutEdgesMap& _first_out_edges) : + GraphWrapperSkeleton1(_gw), first_out_edges(&_first_out_edges) { } + + template I& first(I& i) const { + g->first(i); + //while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } + return i; + } + OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { + e=first_out_edges->get(n); + return e; + } + template I& first(I& i, const P& p) const { + g->first(i, p); + //while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } + return i; + } + + //template I getNext(const I& i) const { + // return gw.getNext(i); + //} + template I& next(I &i) const { + g->next(i); + //while (gw.valid(i) && !filter_map->get(i)) { gw.next(i); } + return i; + } + + template< typename It > It first() const { + It e; this->first(e); return e; } + + template< typename It > It first(const Node& v) const { + It e; this->first(e, v); return e; } + + void erase(const OutEdgeIt& e) const { + OutEdgeIt f=e; + this->next(f); + first_out_edges->set(this->tail(e), f); + } + }; + +// template +// class ErasingResGraphWrapper : public ResGraphWrapper { +// protected: +// ResGraphWrapper::NodeMap::OutEdgeIt> first_out_edges; +// //ResGraphWrapper::NodeMap dist; +// public: +// ErasingResGraphWrapper(const Graph& _G, FlowMap& _flow, +// const CapacityMap& _capacity) : +// ResGraphWrapper(_G, _flow, _capacity), +// first_out_edges(*this) /*, dist(*this)*/ { +// for(NodeIt n=this->template first(); this->valid(n); this->next(n)) { +// OutEdgeIt e; +// ResGraphWrapper::first(e, n); +// first_out_edges.set(n, e); +// } +// } + +// //void setGraph(Graph& _graph) { graph = &_graph; } +// //Graph& getGraph() const { return (*graph); } + +// //TrivGraphWrapper() : graph(0) { } +// //ErasingResGraphWrapper(Graph& _graph) : graph(&_graph) { } + +// //typedef Graph BaseGraph; + +// //typedef typename Graph::Node Node; +// //typedef typename Graph::NodeIt NodeIt; + +// //typedef typename Graph::Edge Edge; +// //typedef typename Graph::OutEdgeIt OutEdgeIt; +// //typedef typename Graph::InEdgeIt InEdgeIt; +// //typedef typename Graph::SymEdgeIt SymEdgeIt; +// //typedef typename Graph::EdgeIt EdgeIt; + +// typedef typename ResGraphWrapper::Node Node; +// typedef typename ResGraphWrapper::NodeIt NodeIt; + +// typedef typename ResGraphWrapper::Edge Edge; +// typedef typename ResGraphWrapper::OutEdgeIt OutEdgeIt; +// //typedef typename ResGraphWrapper::InEdgeIt InEdgeIt; +// //typedef typename Graph::SymEdgeIt SymEdgeIt; +// //typedef typename ResGraphWrapper::EdgeIt EdgeIt; + +// NodeIt& first(NodeIt& n) const { +// return ResGraphWrapper::first(n); +// } + +// OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { +// e=first_out_edges.get(n); +// return e; +// } + +// //ROSSZ template I& first(I& i) const { return first(i); } +// //ROSSZ template I& first(I& i, const P& p) const { +// // return first(i, p); } + +// //template I getNext(const I& i) const { +// // return gw.getNext(i); } +// //template I& next(I &i) const { return gw.next(i); } + +// template< typename It > It first() const { +// It e; first(e); return e; } + +// template< typename It > It first(const Node& v) const { +// It e; first(e, v); return e; } + +// //Node head(const Edge& e) const { return gw.head(e); } +// //Node tail(const Edge& e) const { return gw.tail(e); } + +// //template bool valid(const I& i) const +// // { return gw.valid(i); } + +// //int nodeNum() const { return gw.nodeNum(); } +// //int edgeNum() const { return gw.edgeNum(); } + +// //template Node aNode(const I& e) const { +// // return gw.aNode(e); } +// //template Node bNode(const I& e) const { +// // return gw.bNode(e); } + +// //Node addNode() const { return gw.addNode(); } +// //Edge addEdge(const Node& tail, const Node& head) const { +// // return gw.addEdge(tail, head); } + +// //void erase(const OutEdgeIt& e) { +// // first_out_edge(this->tail(e))=e; +// //} +// void erase(const Edge& e) { +// OutEdgeIt f(e); +// next(f); +// first_out_edges.set(this->tail(e), f); +// } +// //template void erase(const I& i) const { gw.erase(i); } + +// //void clear() const { gw.clear(); } + +// template class NodeMap : public ResGraphWrapper::NodeMap { +// public: +// NodeMap(const ErasingResGraphWrapper& _G) : +// ResGraphWrapper::NodeMap(_G /*_G.getGraph()*/) { } +// NodeMap(const ErasingResGraphWrapper& _G, T a) : +// ResGraphWrapper::NodeMap(_G /*_G.getGraph()*/, a) { } +// }; + +// template class EdgeMap : public ResGraphWrapper::EdgeMap { +// public: +// EdgeMap(const ErasingResGraphWrapper& _G) : +// ResGraphWrapper::EdgeMap(_G /*_G.getGraph()*/) { } +// EdgeMap(const ErasingResGraphWrapper& _G, T a) : +// ResGraphWrapper::EdgeMap(_G /*_G.getGraph()*/, a) { } +// }; +// }; + +// template +// class FilterGraphWrapper { +// }; + +// template +// class FilterGraphWrapper > : public ErasingResGraphWrapper { + +// //Graph* graph; + +// public: +// //typedef Graph BaseGraph; + +// typedef typename ErasingResGraphWrapper::Node Node; +// typedef typename ErasingResGraphWrapper::NodeIt NodeIt; + +// typedef typename ErasingResGraphWrapper::Edge Edge; +// typedef typename ErasingResGraphWrapper::OutEdgeIt OutEdgeIt; +// //typedef typename ErasingResGraphWrapper::InEdgeIt InEdgeIt; +// //typedef typename Graph::SymEdgeIt SymEdgeIt; +// typedef typename ErasingResGraphWrapper::EdgeIt EdgeIt; + +// //FilterGraphWrapper::NodeMap::OutEdgeIt> first_out_edges; + +// public: +// FilterGraphWrapper(const Graph& _G, FlowMap& _flow, +// const CapacityMap& _capacity) : +// ErasingResGraphWrapper(_G, _flow, _capacity), dist(*this, gw.nodeNum()) { +// } + +// OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { +// ErasingResGraphWrapper::first(e, n); +// while (valid(e) && (dist.get(tail(e))/*+1!=*/>=dist.get(head(e)))) +// ErasingResGraphWrapper::next(e); +// return e; +// } + +// NodeIt& next(NodeIt& e) const { +// return ErasingResGraphWrapper::next(e); +// } + +// OutEdgeIt& next(OutEdgeIt& e) const { +// ErasingResGraphWrapper::next(e); +// while (valid(e) && (dist.get(tail(e))/*+1!*/>=dist.get(head(e)))) +// ErasingResGraphWrapper::next(e); +// return e; +// } + +// NodeIt& first(NodeIt& n) const { +// return ErasingResGraphWrapper::first(n); +// } + +// void erase(const Edge& e) { +// OutEdgeIt f(e); +// ErasingResGraphWrapper::next(f); +// while (valid(f) && (dist.get(tail(f))/*+1!=*/>=dist.get(head(f)))) +// ErasingResGraphWrapper::next(f); +// first_out_edges.set(this->tail(e), f); +// } + +// //TrivGraphWrapper() : graph(0) { } +// //TrivGraphWrapper(Graph& _graph) : graph(&_graph) { } + +// //void setGraph(Graph& _graph) { graph = &_graph; } +// //Graph& getGraph() const { return (*graph); } + +// //template I& first(I& i) const { return gw.first(i); } +// //template I& first(I& i, const P& p) const { +// // return gw.first(i, p); } + +// //template I getNext(const I& i) const { +// // return gw.getNext(i); } +// //template I& next(I &i) const { return gw.next(i); } + +// template< typename It > It first() const { +// It e; first(e); return e; } + +// template< typename It > It first(const Node& v) const { +// It e; first(e, v); return e; } + +// //Node head(const Edge& e) const { return gw.head(e); } +// //Node tail(const Edge& e) const { return gw.tail(e); } + +// //template bool valid(const I& i) const +// // { return gw.valid(i); } + +// //template void setInvalid(const I &i); +// //{ return gw.setInvalid(i); } + +// //int nodeNum() const { return gw.nodeNum(); } +// //int edgeNum() const { return gw.edgeNum(); } + +// //template Node aNode(const I& e) const { +// // return gw.aNode(e); } +// //template Node bNode(const I& e) const { +// // return gw.bNode(e); } + +// //Node addNode() const { return gw.addNode(); } +// //Edge addEdge(const Node& tail, const Node& head) const { +// // return gw.addEdge(tail, head); } + +// //template void erase(const I& i) const { gw.erase(i); } + +// //void clear() const { gw.clear(); } + +// template class NodeMap : public ErasingResGraphWrapper::NodeMap { +// public: +// NodeMap(const FilterGraphWrapper >& _G) : +// ErasingResGraphWrapper::NodeMap(_G /*_G.getGraph()*/) { } +// NodeMap(const FilterGraphWrapper >& _G, T a) : +// ErasingResGraphWrapper::NodeMap(_G /*_G.getGraph()*/, a) { } +// }; + +// template class EdgeMap : public ErasingResGraphWrapper::EdgeMap { +// public: +// EdgeMap(const FilterGraphWrapper >& _G) : +// ErasingResGraphWrapper::EdgeMap(_G /*_G.getGraph()*/) { } +// EdgeMap(const FilterGraphWrapper >& _G, T a) : +// ErasingResGraphWrapper::EdgeMap(_G /*_G.getGraph()*/, a) { } +// }; + +// public: +// ErasingResGraphWrapper::NodeMap dist; + +// }; + + + +// // FIXME: comparison should be made better!!! +// template +// class ResGraphWrapper +// { +// Graph* graph; + +// public: +// typedef Graph BaseGraph; + +// typedef typename Graph::Node Node; +// typedef typename Graph::Edge Edge; + +// typedef typename Graph::NodeIt NodeIt; + +// class OutEdgeIt { +// public: +// //Graph::Node n; +// bool out_or_in; +// typename Graph::OutEdgeIt o; +// typename Graph::InEdgeIt i; +// }; +// class InEdgeIt { +// public: +// //Graph::Node n; +// bool out_or_in; +// typename Graph::OutEdgeIt o; +// typename Graph::InEdgeIt i; +// }; +// typedef typename Graph::SymEdgeIt SymEdgeIt; +// typedef typename Graph::EdgeIt EdgeIt; + +// int nodeNum() const { return gw.nodeNum(); } +// int edgeNum() const { return gw.edgeNum(); } + +// Node& first(Node& n) const { return gw.first(n); } + +// // Edge and SymEdge is missing!!!! +// // Edge <-> In/OutEdgeIt conversion is missing!!!! + +// //FIXME +// OutEdgeIt& first(OutEdgeIt& e, const Node& n) const +// { +// e.n=n; +// gw.first(e.o,n); +// while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o)) +// gw.goNext(e.o); +// if(!gw.valid(e.o)) { +// gw.first(e.i,n); +// while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i)) +// gw.goNext(e.i); +// } +// return e; +// } +// /* +// OutEdgeIt &goNext(OutEdgeIt &e) +// { +// if(gw.valid(e.o)) { +// while(gw.valid(e.o) && fmap.get(e.o)>=himap.get(e.o)) +// gw.goNext(e.o); +// if(gw.valid(e.o)) return e; +// else gw.first(e.i,e.n); +// } +// else { +// while(gw.valid(e.i) && fmap.get(e.i)<=lomap.get(e.i)) +// gw.goNext(e.i); +// return e; +// } +// } +// OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);} +// */ +// //bool valid(const OutEdgeIt e) { return gw.valid(e.o)||gw.valid(e.i);} + +// //FIXME +// InEdgeIt& first(InEdgeIt& e, const Node& n) const +// { +// e.n=n; +// gw.first(e.i,n); +// while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i)) +// gw.goNext(e.i); +// if(!gw.valid(e.i)) { +// gw.first(e.o,n); +// while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o)) +// gw.goNext(e.o); +// } +// return e; +// } +// /* +// InEdgeIt &goNext(InEdgeIt &e) +// { +// if(gw.valid(e.i)) { +// while(gw.valid(e.i) && fmap.get(e.i)>=himap.get(e.i)) +// gw.goNext(e.i); +// if(gw.valid(e.i)) return e; +// else gw.first(e.o,e.n); +// } +// else { +// while(gw.valid(e.o) && fmap.get(e.o)<=lomap.get(e.o)) +// gw.goNext(e.o); +// return e; +// } +// } +// InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);} +// */ +// //bool valid(const InEdgeIt e) { return gw.valid(e.i)||gw.valid(e.o);} + +// //template I &goNext(I &i); { return gw.goNext(i); } +// //template I next(const I i); { return gw.goNext(i); } + +// template< typename It > It first() const { +// It e; first(e); return e; } + +// template< typename It > It first(Node v) const { +// It e; first(e, v); return e; } + +// Node head(const Edge& e) const { return gw.head(e); } +// Node tail(const Edge& e) const { return gw.tail(e); } + +// template Node aNode(const I& e) const { +// return gw.aNode(e); } +// template Node bNode(const I& e) const { +// return gw.bNode(e); } + +// //template bool valid(const I i); +// //{ return gw.valid(i); } + +// //template void setInvalid(const I &i); +// //{ return gw.setInvalid(i); } + +// Node addNode() { return gw.addNode(); } +// Edge addEdge(const Node& tail, const Node& head) { +// return gw.addEdge(tail, head); } + +// template void erase(const I& i) { gw.erase(i); } + +// void clear() { gw.clear(); } + +// template class NodeMap : public Graph::NodeMap { }; +// template class EdgeMap : public Graph::EdgeMap { }; + +// void setGraph(Graph& _graph) { graph = &_graph; } +// Graph& getGraph() { return (*graph); } + +// //ResGraphWrapper() : graph(0) { } +// ResGraphWrapper(Graph& _graph) : graph(&_graph) { } +// }; + +} //namespace hugo + +#endif //HUGO_GRAPH_WRAPPER_H +