marci@174: // -*- c++ -*- marci@76: #ifndef GRAPH_WRAPPER_H marci@76: #define GRAPH_WRAPPER_H marci@76: marci@174: #include marci@174: alpar@105: namespace hugo { marci@76: marci@76: template marci@76: class TrivGraphWrapper { marci@199: protected: marci@76: Graph* graph; marci@76: marci@76: public: marci@76: typedef Graph BaseGraph; marci@76: marci@174: typedef typename Graph::Node Node; marci@76: typedef typename Graph::NodeIt NodeIt; marci@76: marci@174: typedef typename Graph::Edge Edge; marci@76: typedef typename Graph::OutEdgeIt OutEdgeIt; marci@76: typedef typename Graph::InEdgeIt InEdgeIt; marci@155: //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@174: typedef typename Graph::EdgeIt EdgeIt; marci@168: marci@168: //TrivGraphWrapper() : graph(0) { } marci@168: TrivGraphWrapper(Graph& _graph) : graph(&_graph) { } marci@168: marci@168: void setGraph(Graph& _graph) { graph = &_graph; } marci@168: Graph& getGraph() const { return (*graph); } marci@76: marci@212: template I& first(I& i) const { return graph->first(i); } marci@212: template I& first(I& i, const P& p) const { marci@212: return graph->first(i, p); } marci@155: marci@155: template I getNext(const I& i) const { marci@155: return graph->getNext(i); } marci@155: template I& next(I &i) const { return graph->next(i); } marci@76: marci@76: template< typename It > It first() const { marci@212: It e; first(e); return e; } marci@76: marci@174: template< typename It > It first(const Node& v) const { marci@212: It e; first(e, v); return e; } marci@76: marci@174: Node head(const Edge& e) const { return graph->head(e); } marci@174: Node tail(const Edge& e) const { return graph->tail(e); } marci@155: marci@155: template bool valid(const I& i) const marci@155: { return graph->valid(i); } marci@155: marci@155: //template void setInvalid(const I &i); marci@155: //{ return graph->setInvalid(i); } marci@155: marci@155: int nodeNum() const { return graph->nodeNum(); } marci@155: int edgeNum() const { return graph->edgeNum(); } marci@76: marci@174: template Node aNode(const I& e) const { marci@76: return graph->aNode(e); } marci@174: template Node bNode(const I& e) const { marci@76: return graph->bNode(e); } marci@76: marci@174: Node addNode() const { return graph->addNode(); } marci@174: Edge addEdge(const Node& tail, const Node& head) const { marci@76: return graph->addEdge(tail, head); } marci@76: marci@76: template void erase(const I& i) const { graph->erase(i); } marci@76: marci@76: void clear() const { graph->clear(); } marci@155: marci@76: template class NodeMap : public Graph::NodeMap { marci@76: public: marci@155: NodeMap(const TrivGraphWrapper& _G) : marci@158: Graph::NodeMap(_G.getGraph()) { } marci@155: NodeMap(const TrivGraphWrapper& _G, T a) : marci@158: Graph::NodeMap(_G.getGraph(), a) { } marci@76: }; marci@168: marci@155: template class EdgeMap : public Graph::EdgeMap { marci@155: public: marci@155: EdgeMap(const TrivGraphWrapper& _G) : marci@158: Graph::EdgeMap(_G.getGraph()) { } marci@155: EdgeMap(const TrivGraphWrapper& _G, T a) : marci@158: Graph::EdgeMap(_G.getGraph(), a) { } marci@155: }; marci@76: }; marci@76: marci@212: template marci@212: class GraphWrapperSkeleton { marci@212: protected: marci@212: GraphWrapper gw; marci@212: marci@212: public: marci@212: typedef typename GraphWrapper::BaseGraph BaseGraph; marci@212: marci@212: typedef typename GraphWrapper::Node Node; marci@212: typedef typename GraphWrapper::NodeIt NodeIt; marci@212: marci@212: typedef typename GraphWrapper::Edge Edge; marci@212: typedef typename GraphWrapper::OutEdgeIt OutEdgeIt; marci@212: typedef typename GraphWrapper::InEdgeIt InEdgeIt; marci@212: //typedef typename GraphWrapper::SymEdgeIt SymEdgeIt; marci@212: typedef typename GraphWrapper::EdgeIt EdgeIt; marci@212: marci@212: //GraphWrapperSkeleton() : gw() { } marci@230: GraphWrapperSkeleton(GraphWrapper _gw) : gw(_gw) { } marci@212: marci@212: void setGraph(BaseGraph& _graph) { gw.setGraph(_graph); } marci@212: BaseGraph& getGraph() const { return gw.getGraph(); } marci@212: marci@212: template I& first(I& i) const { return gw.first(i); } marci@212: template I& first(I& i, const P& p) const { marci@212: return gw.first(i, p); } marci@212: marci@212: template I getNext(const I& i) const { return gw.getNext(i); } marci@212: template I& next(I &i) const { return gw.next(i); } marci@212: marci@212: template< typename It > It first() const { marci@212: It e; this->first(e); return e; } marci@212: marci@212: template< typename It > It first(const Node& v) const { marci@212: It e; this->first(e, v); return e; } marci@212: marci@212: Node head(const Edge& e) const { return gw.head(e); } marci@212: Node tail(const Edge& e) const { return gw.tail(e); } marci@212: marci@212: template bool valid(const I& i) const { return gw.valid(i); } marci@212: marci@212: //template void setInvalid(const I &i); marci@212: //{ return graph->setInvalid(i); } marci@212: marci@212: int nodeNum() const { return gw.nodeNum(); } marci@212: int edgeNum() const { return gw.edgeNum(); } marci@212: marci@212: template Node aNode(const I& e) const { return gw.aNode(e); } marci@212: template Node bNode(const I& e) const { return gw.bNode(e); } marci@212: marci@212: Node addNode() const { return gw.addNode(); } marci@212: Edge addEdge(const Node& tail, const Node& head) const { marci@212: return gw.addEdge(tail, head); } marci@212: marci@212: template void erase(const I& i) const { gw.erase(i); } marci@212: marci@212: void clear() const { gw.clear(); } marci@212: marci@212: template class NodeMap : public GraphWrapper::NodeMap { marci@212: public: marci@212: NodeMap(const GraphWrapperSkeleton& _G) : marci@212: GraphWrapper::NodeMap(_G.gw) { } marci@212: NodeMap(const GraphWrapperSkeleton& _G, T a) : marci@212: GraphWrapper::NodeMap(_G.gw, a) { } marci@212: }; marci@212: marci@212: template class EdgeMap : public GraphWrapper::EdgeMap { marci@212: public: marci@212: EdgeMap(const GraphWrapperSkeleton& _G) : marci@212: GraphWrapper::EdgeMap(_G.gw) { } marci@212: EdgeMap(const GraphWrapperSkeleton& _G, T a) : marci@212: GraphWrapper::EdgeMap(_G.gw, a) { } marci@212: }; marci@212: }; marci@212: marci@230: // template marci@230: // class RevGraphWrapper marci@230: // { marci@230: // protected: marci@230: // Graph* graph; marci@230: marci@230: // public: marci@230: // typedef Graph BaseGraph; marci@230: marci@230: // typedef typename Graph::Node Node; marci@230: // typedef typename Graph::NodeIt NodeIt; marci@230: marci@230: // typedef typename Graph::Edge Edge; marci@230: // typedef typename Graph::OutEdgeIt InEdgeIt; marci@230: // typedef typename Graph::InEdgeIt OutEdgeIt; marci@230: // //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@230: // typedef typename Graph::EdgeIt EdgeIt; marci@230: marci@230: // //RevGraphWrapper() : graph(0) { } marci@230: // RevGraphWrapper(Graph& _graph) : graph(&_graph) { } marci@230: marci@230: // void setGraph(Graph& _graph) { graph = &_graph; } marci@230: // Graph& getGraph() const { return (*graph); } marci@230: marci@230: // template I& first(I& i) const { return graph->first(i); } marci@230: // template I& first(I& i, const P& p) const { marci@230: // return graph->first(i, p); } marci@230: marci@230: // template I getNext(const I& i) const { marci@230: // return graph->getNext(i); } marci@230: // template I& next(I &i) const { return graph->next(i); } marci@230: marci@230: // template< typename It > It first() const { marci@230: // It e; first(e); return e; } marci@230: marci@230: // template< typename It > It first(const Node& v) const { marci@230: // It e; first(e, v); return e; } marci@230: marci@230: // Node head(const Edge& e) const { return graph->tail(e); } marci@230: // Node tail(const Edge& e) const { return graph->head(e); } marci@230: marci@230: // template bool valid(const I& i) const marci@230: // { return graph->valid(i); } marci@230: marci@230: // //template void setInvalid(const I &i); marci@230: // //{ return graph->setInvalid(i); } marci@230: marci@230: // template Node aNode(const I& e) const { marci@230: // return graph->aNode(e); } marci@230: // template Node bNode(const I& e) const { marci@230: // return graph->bNode(e); } marci@230: marci@230: // Node addNode() const { return graph->addNode(); } marci@230: // Edge addEdge(const Node& tail, const Node& head) const { marci@230: // return graph->addEdge(tail, head); } marci@230: marci@230: // int nodeNum() const { return graph->nodeNum(); } marci@230: // int edgeNum() const { return graph->edgeNum(); } marci@230: marci@230: // template void erase(const I& i) const { graph->erase(i); } marci@230: marci@230: // void clear() const { graph->clear(); } marci@230: marci@230: // template class NodeMap : public Graph::NodeMap { marci@230: // public: marci@230: // NodeMap(const RevGraphWrapper& _G) : marci@230: // Graph::NodeMap(_G.getGraph()) { } marci@230: // NodeMap(const RevGraphWrapper& _G, T a) : marci@230: // Graph::NodeMap(_G.getGraph(), a) { } marci@230: // }; marci@230: marci@230: // template class EdgeMap : public Graph::EdgeMap { marci@230: // public: marci@230: // EdgeMap(const RevGraphWrapper& _G) : marci@230: // Graph::EdgeMap(_G.getGraph()) { } marci@230: // EdgeMap(const RevGraphWrapper& _G, T a) : marci@230: // Graph::EdgeMap(_G.getGraph(), a) { } marci@230: // }; marci@230: // }; marci@230: marci@234: template*/ > marci@230: class RevGraphWrapper : marci@234: public GraphWrapper/*GraphWrapperSkeleton< TrivGraphWrapper >*/ { marci@199: protected: marci@230: //Graph* graph; marci@230: marci@230: public: marci@230: //typedef Graph BaseGraph; marci@230: marci@230: //typedef typename Graph::Node Node; marci@230: //typedef typename Graph::NodeIt NodeIt; marci@76: marci@230: //typedef typename Graph::Edge Edge; marci@234: typedef typename GraphWrapper/*typename GraphWrapperSkeleton< TrivGraphWrapper >*/::OutEdgeIt InEdgeIt; marci@234: typedef typename GraphWrapper/*typename GraphWrapperSkeleton< TrivGraphWrapper >*/::InEdgeIt OutEdgeIt; marci@155: //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@230: //typedef typename Graph::EdgeIt EdgeIt; marci@168: marci@168: //RevGraphWrapper() : graph(0) { } marci@234: RevGraphWrapper(GraphWrapper _gw/*BaseGraph& _graph*/) : GraphWrapper/*GraphWrapperSkeleton< TrivGraphWrapper >*/(_gw/*TrivGraphWrapper(_graph)*/) { } marci@230: marci@230: //void setGraph(Graph& _graph) { graph = &_graph; } marci@230: //Graph& getGraph() const { return (*graph); } marci@230: marci@230: //template I& first(I& i) const { return graph->first(i); } marci@230: //template I& first(I& i, const P& p) const { marci@230: // return graph->first(i, p); } marci@168: marci@230: //template I getNext(const I& i) const { marci@230: // return graph->getNext(i); } marci@230: //template I& next(I &i) const { return graph->next(i); } marci@155: marci@230: //template< typename It > It first() const { marci@230: // It e; first(e); return e; } marci@76: marci@230: //template< typename It > It first(const Node& v) const { marci@230: // It e; first(e, v); return e; } marci@76: marci@230: //Node head(const Edge& e) const { return graph->tail(e); } marci@230: //Node tail(const Edge& e) const { return graph->head(e); } marci@76: marci@230: //template bool valid(const I& i) const marci@230: // { return graph->valid(i); } marci@155: marci@155: //template void setInvalid(const I &i); marci@155: //{ return graph->setInvalid(i); } marci@155: marci@230: //template Node aNode(const I& e) const { marci@230: // return graph->aNode(e); } marci@230: //template Node bNode(const I& e) const { marci@230: // return graph->bNode(e); } marci@155: marci@230: //Node addNode() const { return graph->addNode(); } marci@230: //Edge addEdge(const Node& tail, const Node& head) const { marci@230: // return graph->addEdge(tail, head); } marci@76: marci@230: //int nodeNum() const { return graph->nodeNum(); } marci@230: //int edgeNum() const { return graph->edgeNum(); } marci@76: marci@230: //template void erase(const I& i) const { graph->erase(i); } marci@76: marci@230: //void clear() const { graph->clear(); } marci@155: marci@230: template class NodeMap : marci@234: public GraphWrapper/*Skeleton< TrivGraphWrapper >*/::NodeMap marci@230: { marci@155: public: marci@234: NodeMap(const RevGraphWrapper& _gw) : marci@234: GraphWrapper/*Skeleton< TrivGraphWrapper >*/::NodeMap(_gw) { } marci@234: NodeMap(const RevGraphWrapper& _gw, T a) : marci@234: GraphWrapper/*Skeleton< TrivGraphWrapper >*/::NodeMap(_gw, a) { } marci@155: }; marci@230: marci@230: template class EdgeMap : marci@234: public GraphWrapper/*Skeleton< TrivGraphWrapper >*/::EdgeMap { marci@155: public: marci@234: EdgeMap(const RevGraphWrapper& _gw) : marci@234: GraphWrapper/*Skeleton< TrivGraphWrapper >*/::EdgeMap(_gw) { } marci@234: EdgeMap(const RevGraphWrapper& _gw, T a) : marci@234: GraphWrapper/*Skeleton< TrivGraphWrapper >*/::EdgeMap(_gw, a) { } marci@155: }; marci@76: }; marci@76: marci@155: marci@158: template marci@158: class UndirGraphWrapper { marci@199: protected: marci@158: Graph* graph; marci@158: marci@158: public: marci@158: typedef Graph BaseGraph; marci@158: marci@174: typedef typename Graph::Node Node; marci@158: typedef typename Graph::NodeIt NodeIt; marci@158: marci@174: //typedef typename Graph::Edge Edge; marci@158: //typedef typename Graph::OutEdgeIt OutEdgeIt; marci@158: //typedef typename Graph::InEdgeIt InEdgeIt; marci@158: //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@174: //typedef typename Graph::EdgeIt EdgeIt; marci@158: marci@158: //private: marci@174: typedef typename Graph::Edge GraphEdge; marci@158: typedef typename Graph::OutEdgeIt GraphOutEdgeIt; marci@158: typedef typename Graph::InEdgeIt GraphInEdgeIt; marci@158: //public: marci@158: marci@168: //UndirGraphWrapper() : graph(0) { } marci@168: UndirGraphWrapper(Graph& _graph) : graph(&_graph) { } marci@168: marci@168: void setGraph(Graph& _graph) { graph = &_graph; } marci@168: Graph& getGraph() const { return (*graph); } marci@168: marci@174: class Edge { marci@158: friend class UndirGraphWrapper; marci@158: bool out_or_in; //true iff out marci@158: GraphOutEdgeIt out; marci@158: GraphInEdgeIt in; marci@158: public: marci@174: Edge() : out_or_in(), out(), in() { } marci@174: Edge(const Invalid& i) : out_or_in(false), out(), in(i) { } marci@174: operator GraphEdge() const { marci@158: if (out_or_in) return(out); else return(in); marci@158: } marci@174: friend bool operator==(const Edge& u, const Edge& v) { marci@174: if (v.out_or_in) marci@174: return (u.out_or_in && u.out==v.out); marci@174: else marci@174: return (!u.out_or_in && u.in==v.in); marci@174: } marci@174: friend bool operator!=(const Edge& u, const Edge& v) { marci@174: if (v.out_or_in) marci@174: return (!u.out_or_in || u.out!=v.out); marci@174: else marci@174: return (u.out_or_in || u.in!=v.in); marci@174: } marci@158: }; marci@158: marci@174: class OutEdgeIt : public Edge { marci@158: friend class UndirGraphWrapper; marci@158: public: marci@174: OutEdgeIt() : Edge() { } marci@174: OutEdgeIt(const Invalid& i) : Edge(i) { } marci@174: OutEdgeIt(const UndirGraphWrapper& _G, const Node& n) : Edge() { marci@174: out_or_in=true; marci@212: _G.graph->first(out, n); marci@158: if (!(_G.graph->valid(out))) { marci@158: out_or_in=false; marci@212: _G.graph->first(in, n); marci@158: } marci@158: } marci@158: }; marci@158: marci@212: OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { marci@158: e.out_or_in=true; marci@212: graph->first(e.out, n); marci@158: if (!(graph->valid(e.out))) { marci@158: e.out_or_in=false; marci@212: graph->first(e.in, n); marci@158: } marci@158: return e; marci@158: } marci@158: marci@158: OutEdgeIt& next(OutEdgeIt& e) const { marci@158: if (e.out_or_in) { marci@174: Node n=graph->tail(e.out); marci@158: graph->next(e.out); marci@158: if (!graph->valid(e.out)) { marci@158: e.out_or_in=false; marci@212: graph->first(e.in, n); marci@158: } marci@158: } else { marci@158: graph->next(e.in); marci@158: } marci@158: return e; marci@158: } marci@158: marci@174: Node aNode(const OutEdgeIt& e) const { marci@158: if (e.out_or_in) return graph->tail(e); else return graph->head(e); } marci@174: Node bNode(const OutEdgeIt& e) const { marci@158: if (e.out_or_in) return graph->head(e); else return graph->tail(e); } marci@158: marci@158: typedef OutEdgeIt InEdgeIt; marci@158: marci@212: template I& first(I& i) const { return graph->first(i); } marci@212: // template I& first(I& i, const P& p) const { marci@212: // return graph->first(i, p); } marci@158: marci@158: template I getNext(const I& i) const { marci@158: return graph->getNext(i); } marci@158: template I& next(I &i) const { return graph->next(i); } marci@158: marci@158: template< typename It > It first() const { marci@212: It e; first(e); return e; } marci@158: marci@174: template< typename It > It first(const Node& v) const { marci@212: It e; first(e, v); return e; } marci@158: marci@174: Node head(const Edge& e) const { return graph->head(e); } marci@174: Node tail(const Edge& e) const { return graph->tail(e); } marci@158: marci@158: template bool valid(const I& i) const marci@158: { return graph->valid(i); } marci@158: marci@158: //template void setInvalid(const I &i); marci@158: //{ return graph->setInvalid(i); } marci@158: marci@158: int nodeNum() const { return graph->nodeNum(); } marci@158: int edgeNum() const { return graph->edgeNum(); } marci@158: marci@174: // template Node aNode(const I& e) const { marci@158: // return graph->aNode(e); } marci@174: // template Node bNode(const I& e) const { marci@158: // return graph->bNode(e); } marci@158: marci@174: Node addNode() const { return graph->addNode(); } marci@231: // FIXME: ez igy nem jo, mert nem marci@231: // Edge addEdge(const Node& tail, const Node& head) const { marci@231: // return graph->addEdge(tail, head); } marci@158: marci@158: template void erase(const I& i) const { graph->erase(i); } marci@158: marci@158: void clear() const { graph->clear(); } marci@158: marci@158: template class NodeMap : public Graph::NodeMap { marci@158: public: marci@158: NodeMap(const UndirGraphWrapper& _G) : marci@158: Graph::NodeMap(_G.getGraph()) { } marci@158: NodeMap(const UndirGraphWrapper& _G, T a) : marci@158: Graph::NodeMap(_G.getGraph(), a) { } marci@158: }; marci@168: marci@158: template class EdgeMap : public Graph::EdgeMap { marci@158: public: marci@158: EdgeMap(const UndirGraphWrapper& _G) : marci@158: Graph::EdgeMap(_G.getGraph()) { } marci@158: EdgeMap(const UndirGraphWrapper& _G, T a) : marci@158: Graph::EdgeMap(_G.getGraph(), a) { } marci@158: }; marci@158: }; marci@158: marci@158: marci@158: marci@155: // template marci@155: // class SymGraphWrapper marci@155: // { marci@155: // Graph* graph; marci@76: marci@155: // public: marci@155: // typedef Graph BaseGraph; marci@155: marci@174: // typedef typename Graph::Node Node; marci@174: // typedef typename Graph::Edge Edge; marci@174: marci@155: // typedef typename Graph::NodeIt NodeIt; marci@155: marci@155: // //FIXME tag-ekkel megcsinalni, hogy abbol csinaljon marci@155: // //iranyitatlant, ami van marci@155: // //mert csak 1 dolgot lehet be typedef-elni marci@155: // typedef typename Graph::OutEdgeIt SymEdgeIt; marci@155: // //typedef typename Graph::InEdgeIt SymEdgeIt; marci@155: // //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@174: // typedef typename Graph::EdgeIt EdgeIt; marci@155: marci@155: // int nodeNum() const { return graph->nodeNum(); } marci@155: // int edgeNum() const { return graph->edgeNum(); } marci@155: marci@212: // template I& first(I& i) const { return graph->first(i); } marci@212: // template I& first(I& i, const P& p) const { marci@212: // return graph->first(i, p); } marci@155: // //template I next(const I i); { return graph->goNext(i); } marci@155: // //template I &goNext(I &i); { return graph->goNext(i); } marci@155: marci@155: // template< typename It > It first() const { marci@212: // It e; first(e); return e; } marci@155: marci@174: // template< typename It > It first(Node v) const { marci@212: // It e; first(e, v); return e; } marci@155: marci@174: // Node head(const Edge& e) const { return graph->head(e); } marci@174: // Node tail(const Edge& e) const { return graph->tail(e); } marci@155: marci@174: // template Node aNode(const I& e) const { marci@155: // return graph->aNode(e); } marci@174: // template Node bNode(const I& e) const { marci@155: // return graph->bNode(e); } marci@155: marci@155: // //template bool valid(const I i); marci@155: // //{ return graph->valid(i); } marci@155: marci@155: // //template void setInvalid(const I &i); marci@155: // //{ return graph->setInvalid(i); } marci@155: marci@174: // Node addNode() { return graph->addNode(); } marci@174: // Edge addEdge(const Node& tail, const Node& head) { marci@155: // return graph->addEdge(tail, head); } marci@155: marci@155: // template void erase(const I& i) { graph->erase(i); } marci@155: marci@155: // void clear() { graph->clear(); } marci@155: marci@155: // template class NodeMap : public Graph::NodeMap { }; marci@155: // template class EdgeMap : public Graph::EdgeMap { }; marci@155: marci@155: // void setGraph(Graph& _graph) { graph = &_graph; } marci@155: // Graph& getGraph() { return (*graph); } marci@155: marci@155: // //SymGraphWrapper() : graph(0) { } marci@155: // SymGraphWrapper(Graph& _graph) : graph(&_graph) { } marci@155: // }; marci@155: marci@155: marci@155: template marci@155: class ResGraphWrapper { marci@76: public: marci@76: typedef Graph BaseGraph; marci@174: typedef typename Graph::Node Node; marci@155: typedef typename Graph::NodeIt NodeIt; marci@155: private: marci@155: typedef typename Graph::OutEdgeIt OldOutEdgeIt; marci@155: typedef typename Graph::InEdgeIt OldInEdgeIt; marci@199: protected: marci@174: const Graph* graph; marci@155: FlowMap* flow; marci@155: const CapacityMap* capacity; marci@155: public: marci@168: marci@155: ResGraphWrapper(const Graph& _G, FlowMap& _flow, marci@155: const CapacityMap& _capacity) : marci@174: graph(&_G), flow(&_flow), capacity(&_capacity) { } marci@168: marci@168: void setGraph(const Graph& _graph) { graph = &_graph; } marci@174: const Graph& getGraph() const { return (*graph); } marci@168: marci@174: class Edge; marci@155: class OutEdgeIt; marci@174: friend class Edge; marci@155: friend class OutEdgeIt; marci@76: marci@174: class Edge { marci@155: friend class ResGraphWrapper; marci@155: protected: marci@168: bool out_or_in; //true, iff out marci@155: OldOutEdgeIt out; marci@155: OldInEdgeIt in; marci@155: public: marci@174: Edge() : out_or_in(true) { } marci@174: Edge(const Invalid& i) : out_or_in(false), out(), in(i) { } marci@168: // bool valid() const { marci@168: // return out_or_in && out.valid() || in.valid(); } marci@174: friend bool operator==(const Edge& u, const Edge& v) { marci@174: if (v.out_or_in) marci@174: return (u.out_or_in && u.out==v.out); marci@174: else marci@174: return (!u.out_or_in && u.in==v.in); marci@174: } marci@174: friend bool operator!=(const Edge& u, const Edge& v) { marci@174: if (v.out_or_in) marci@174: return (!u.out_or_in || u.out!=v.out); marci@174: else marci@174: return (u.out_or_in || u.in!=v.in); marci@174: } marci@155: }; marci@155: marci@155: marci@174: class OutEdgeIt : public Edge { marci@155: friend class ResGraphWrapper; marci@155: public: marci@155: OutEdgeIt() { } marci@168: //FIXME marci@174: OutEdgeIt(const Edge& e) : Edge(e) { } marci@174: OutEdgeIt(const Invalid& i) : Edge(i) { } marci@155: private: marci@174: OutEdgeIt(const ResGraphWrapper& resG, Node v) : Edge() { marci@212: resG.graph->first(out, v); marci@174: while( resG.graph->valid(out) && !(resG.free(out)>0) ) { resG.graph->next(out); } marci@174: if (!resG.graph->valid(out)) { marci@155: out_or_in=0; marci@212: resG.graph->first(in, v); marci@174: while( resG.graph->valid(in) && !(resG.free(in)>0) ) { resG.graph->next(in); } marci@155: } marci@155: } marci@168: // public: marci@168: // OutEdgeIt& operator++() { marci@168: // if (out_or_in) { marci@174: // Node v=/*resG->*/G->aNode(out); marci@168: // ++out; marci@174: // while( out.valid() && !(Edge::free()>0) ) { ++out; } marci@168: // if (!out.valid()) { marci@168: // out_or_in=0; marci@212: // G->first(in, v); marci@174: // while( in.valid() && !(Edge::free()>0) ) { ++in; } marci@168: // } marci@168: // } else { marci@168: // ++in; marci@174: // while( in.valid() && !(Edge::free()>0) ) { ++in; } marci@168: // } marci@168: // return *this; marci@168: // } marci@155: }; marci@155: marci@174: class EdgeIt : public Edge { marci@155: friend class ResGraphWrapper; marci@174: typename Graph::NodeIt v; marci@155: public: marci@174: EdgeIt() { } marci@174: //EdgeIt(const EdgeIt& e) : Edge(e), v(e.v) { } marci@174: EdgeIt(const Invalid& i) : Edge(i) { } marci@174: EdgeIt(const ResGraphWrapper& resG) : Edge() { marci@212: resG.graph->first(v); marci@212: if (resG.graph->valid(v)) resG.graph->first(out, v); else out=OldOutEdgeIt(INVALID); marci@174: while (resG.graph->valid(out) && !(resG.free(out)>0) ) { resG.graph->next(out); } marci@174: while (resG.graph->valid(v) && !resG.graph->valid(out)) { marci@174: resG.graph->next(v); marci@212: if (resG.graph->valid(v)) resG.graph->first(out, v); marci@174: while (resG.graph->valid(out) && !(resG.free(out)>0) ) { resG.graph->next(out); } marci@155: } marci@174: if (!resG.graph->valid(out)) { marci@155: out_or_in=0; marci@212: resG.graph->first(v); marci@212: if (resG.graph->valid(v)) resG.graph->first(in, v); else in=OldInEdgeIt(INVALID); marci@174: while (resG.graph->valid(in) && !(resG.free(in)>0) ) { resG.graph->next(in); } marci@174: while (resG.graph->valid(v) && !resG.graph->valid(in)) { marci@174: resG.graph->next(v); marci@212: if (resG.graph->valid(v)) resG.graph->first(in, v); marci@174: while (resG.graph->valid(in) && !(resG.free(in)>0) ) { resG.graph->next(in); } marci@155: } marci@155: } marci@155: } marci@174: // EdgeIt& operator++() { marci@168: // if (out_or_in) { marci@168: // ++out; marci@174: // while (out.valid() && !(Edge::free()>0) ) { ++out; } marci@168: // while (v.valid() && !out.valid()) { marci@168: // ++v; marci@212: // if (v.valid()) G->first(out, v); marci@174: // while (out.valid() && !(Edge::free()>0) ) { ++out; } marci@168: // } marci@168: // if (!out.valid()) { marci@168: // out_or_in=0; marci@212: // G->first(v); marci@212: // if (v.valid()) G->first(in, v); else in=OldInEdgeIt(); marci@174: // while (in.valid() && !(Edge::free()>0) ) { ++in; } marci@168: // while (v.valid() && !in.valid()) { marci@168: // ++v; marci@212: // if (v.valid()) G->first(in, v); marci@174: // while (in.valid() && !(Edge::free()>0) ) { ++in; } marci@168: // } marci@168: // } marci@168: // } else { marci@168: // ++in; marci@174: // while (in.valid() && !(Edge::free()>0) ) { ++in; } marci@168: // while (v.valid() && !in.valid()) { marci@168: // ++v; marci@212: // if (v.valid()) G->first(in, v); marci@174: // while (in.valid() && !(Edge::free()>0) ) { ++in; } marci@168: // } marci@168: // } marci@168: // return *this; marci@168: // } marci@155: }; marci@155: marci@212: NodeIt& first(NodeIt& v) const { return graph->first(v); } marci@212: OutEdgeIt& first(OutEdgeIt& e, Node v) const { marci@168: e=OutEdgeIt(*this, v); marci@174: return e; marci@155: } marci@212: EdgeIt& first(EdgeIt& e) const { marci@174: e=EdgeIt(*this); marci@174: return e; marci@155: } marci@155: marci@174: NodeIt& next(NodeIt& n) const { return graph->next(n); } marci@155: marci@155: OutEdgeIt& next(OutEdgeIt& e) const { marci@155: if (e.out_or_in) { marci@174: Node v=graph->aNode(e.out); marci@174: graph->next(e.out); marci@174: while( graph->valid(e.out) && !(free(e.out)>0) ) { graph->next(e.out); } marci@174: if (!graph->valid(e.out)) { marci@155: e.out_or_in=0; marci@212: graph->first(e.in, v); marci@174: while( graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); } marci@155: } marci@155: } else { marci@174: graph->next(e.in); marci@174: while( graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); } marci@155: } marci@155: return e; marci@155: } marci@155: marci@174: EdgeIt& next(EdgeIt& e) const { marci@155: if (e.out_or_in) { marci@174: graph->next(e.out); marci@174: while (graph->valid(e.out) && !(free(e.out)>0) ) { graph->next(e.out); } marci@174: while (graph->valid(e.v) && !graph->valid(e.out)) { marci@174: graph->next(e.v); marci@212: if (graph->valid(e.v)) graph->first(e.out, e.v); marci@174: while (graph->valid(e.out) && !(free(e.out)>0) ) { graph->next(e.out); } marci@155: } marci@174: if (!graph->valid(e.out)) { marci@155: e.out_or_in=0; marci@212: graph->first(e.v); marci@212: if (graph->valid(e.v)) graph->first(e.in, e.v); else e.in=OldInEdgeIt(INVALID); marci@174: while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); } marci@174: while (graph->valid(e.v) && !graph->valid(e.in)) { marci@174: graph->next(e.v); marci@212: if (graph->valid(e.v)) graph->first(e.in, e.v); marci@174: while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); } marci@155: } marci@155: } marci@155: } else { marci@174: graph->next(e.in); marci@174: while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); } marci@174: while (graph->valid(e.v) && !graph->valid(e.in)) { marci@174: graph->next(e.v); marci@212: if (graph->valid(e.v)) graph->first(e.in, e.v); marci@174: while (graph->valid(e.in) && !(free(e.in)>0) ) { graph->next(e.in); } marci@155: } marci@155: } marci@155: return e; marci@155: } marci@76: marci@76: marci@155: template< typename It > marci@155: It first() const { marci@155: It e; marci@212: first(e); marci@155: return e; marci@155: } marci@76: marci@155: template< typename It > marci@174: It first(Node v) const { marci@155: It e; marci@212: first(e, v); marci@155: return e; marci@155: } marci@76: marci@174: Node tail(Edge e) const { marci@174: return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); } marci@174: Node head(Edge e) const { marci@174: return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); } marci@76: marci@174: Node aNode(OutEdgeIt e) const { marci@174: return ((e.out_or_in) ? graph->aNode(e.out) : graph->aNode(e.in)); } marci@174: Node bNode(OutEdgeIt e) const { marci@174: return ((e.out_or_in) ? graph->bNode(e.out) : graph->bNode(e.in)); } marci@76: marci@174: int id(Node v) const { return graph->id(v); } marci@155: marci@174: bool valid(Node n) const { return graph->valid(n); } marci@174: bool valid(Edge e) const { marci@174: return e.out_or_in ? graph->valid(e.out) : graph->valid(e.in); } marci@155: marci@174: void augment(const Edge& e, Number a) const { marci@168: if (e.out_or_in) marci@168: flow->set(e.out, flow->get(e.out)+a); marci@168: else marci@168: flow->set(e.in, flow->get(e.in)-a); marci@168: } marci@168: marci@174: Number free(const Edge& e) const { marci@168: if (e.out_or_in) marci@168: return (capacity->get(e.out)-flow->get(e.out)); marci@168: else marci@168: return (flow->get(e.in)); marci@168: } marci@168: marci@168: Number free(OldOutEdgeIt out) const { marci@168: return (capacity->get(out)-flow->get(out)); marci@168: } marci@168: marci@168: Number free(OldInEdgeIt in) const { marci@168: return (flow->get(in)); marci@168: } marci@168: marci@155: template class NodeMap : public Graph::NodeMap { marci@155: public: marci@155: NodeMap(const ResGraphWrapper& _G) marci@158: : Graph::NodeMap(_G.getGraph()) { } marci@155: NodeMap(const ResGraphWrapper& _G, marci@158: T a) : Graph::NodeMap(_G.getGraph(), a) { } marci@155: }; marci@155: marci@155: // template marci@155: // class NodeMap { marci@155: // typename Graph::NodeMap node_map; marci@155: // public: marci@174: // NodeMap(const ResGraphWrapper& _G) : node_map(*(_G.graph)) { } marci@174: // NodeMap(const ResGraphWrapper& _G, T a) : node_map(*(_G.graph), a) { } marci@174: // void set(Node nit, T a) { node_map.set(nit, a); } marci@174: // T get(Node nit) const { return node_map.get(nit); } marci@155: // }; marci@155: marci@155: template marci@155: class EdgeMap { marci@155: typename Graph::EdgeMap forward_map, backward_map; marci@155: public: marci@158: EdgeMap(const ResGraphWrapper& _G) : forward_map(_G.getGraph()), backward_map(_G.getGraph()) { } marci@158: EdgeMap(const ResGraphWrapper& _G, T a) : forward_map(_G.getGraph(), a), backward_map(_G.getGraph(), a) { } marci@174: void set(Edge e, T a) { marci@155: if (e.out_or_in) marci@155: forward_map.set(e.out, a); marci@155: else marci@155: backward_map.set(e.in, a); marci@155: } marci@174: T get(Edge e) { marci@155: if (e.out_or_in) marci@155: return forward_map.get(e.out); marci@155: else marci@155: return backward_map.get(e.in); marci@155: } marci@155: }; marci@168: }; marci@168: marci@168: template marci@168: class ErasingResGraphWrapper : public ResGraphWrapper { marci@168: protected: marci@168: ResGraphWrapper::NodeMap::OutEdgeIt> first_out_edges; marci@168: //ResGraphWrapper::NodeMap dist; marci@168: public: marci@168: ErasingResGraphWrapper(const Graph& _G, FlowMap& _flow, marci@168: const CapacityMap& _capacity) : marci@168: ResGraphWrapper(_G, _flow, _capacity), marci@168: first_out_edges(*this) /*, dist(*this)*/ { marci@174: for(NodeIt n=this->template first(); this->valid(n); this->next(n)) { marci@168: OutEdgeIt e; marci@212: ResGraphWrapper::first(e, n); marci@168: first_out_edges.set(n, e); marci@168: } marci@168: } marci@168: marci@168: //void setGraph(Graph& _graph) { graph = &_graph; } marci@168: //Graph& getGraph() const { return (*graph); } marci@168: marci@168: //TrivGraphWrapper() : graph(0) { } marci@168: //ErasingResGraphWrapper(Graph& _graph) : graph(&_graph) { } marci@168: marci@168: //typedef Graph BaseGraph; marci@168: marci@174: //typedef typename Graph::Node Node; marci@168: //typedef typename Graph::NodeIt NodeIt; marci@168: marci@174: //typedef typename Graph::Edge Edge; marci@168: //typedef typename Graph::OutEdgeIt OutEdgeIt; marci@168: //typedef typename Graph::InEdgeIt InEdgeIt; marci@168: //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@174: //typedef typename Graph::EdgeIt EdgeIt; marci@168: marci@174: typedef typename ResGraphWrapper::Node Node; marci@168: typedef typename ResGraphWrapper::NodeIt NodeIt; marci@168: marci@174: typedef typename ResGraphWrapper::Edge Edge; marci@168: typedef typename ResGraphWrapper::OutEdgeIt OutEdgeIt; marci@168: //typedef typename ResGraphWrapper::InEdgeIt InEdgeIt; marci@168: //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@174: //typedef typename ResGraphWrapper::EdgeIt EdgeIt; marci@168: marci@212: NodeIt& first(NodeIt& n) const { marci@212: return ResGraphWrapper::first(n); marci@168: } marci@168: marci@212: OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { marci@168: e=first_out_edges.get(n); marci@168: return e; marci@168: } marci@168: marci@212: //ROSSZ template I& first(I& i) const { return first(i); } marci@212: //ROSSZ template I& first(I& i, const P& p) const { marci@212: // return first(i, p); } marci@168: marci@168: //template I getNext(const I& i) const { marci@168: // return graph->getNext(i); } marci@168: //template I& next(I &i) const { return graph->next(i); } marci@168: marci@168: template< typename It > It first() const { marci@212: It e; first(e); return e; } marci@168: marci@174: template< typename It > It first(const Node& v) const { marci@212: It e; first(e, v); return e; } marci@168: marci@174: //Node head(const Edge& e) const { return graph->head(e); } marci@174: //Node tail(const Edge& e) const { return graph->tail(e); } marci@168: marci@168: //template bool valid(const I& i) const marci@168: // { return graph->valid(i); } marci@168: marci@168: //int nodeNum() const { return graph->nodeNum(); } marci@168: //int edgeNum() const { return graph->edgeNum(); } marci@168: marci@174: //template Node aNode(const I& e) const { marci@168: // return graph->aNode(e); } marci@174: //template Node bNode(const I& e) const { marci@168: // return graph->bNode(e); } marci@168: marci@174: //Node addNode() const { return graph->addNode(); } marci@174: //Edge addEdge(const Node& tail, const Node& head) const { marci@168: // return graph->addEdge(tail, head); } marci@168: marci@168: //void erase(const OutEdgeIt& e) { marci@168: // first_out_edge(this->tail(e))=e; marci@168: //} marci@174: void erase(const Edge& e) { marci@168: OutEdgeIt f(e); marci@168: next(f); marci@168: first_out_edges.set(this->tail(e), f); marci@168: } marci@168: //template void erase(const I& i) const { graph->erase(i); } marci@168: marci@168: //void clear() const { graph->clear(); } marci@168: marci@168: template class NodeMap : public ResGraphWrapper::NodeMap { marci@168: public: marci@168: NodeMap(const ErasingResGraphWrapper& _G) : marci@168: ResGraphWrapper::NodeMap(_G /*_G.getGraph()*/) { } marci@168: NodeMap(const ErasingResGraphWrapper& _G, T a) : marci@168: ResGraphWrapper::NodeMap(_G /*_G.getGraph()*/, a) { } marci@168: }; marci@168: marci@168: template class EdgeMap : public ResGraphWrapper::EdgeMap { marci@168: public: marci@168: EdgeMap(const ErasingResGraphWrapper& _G) : marci@168: ResGraphWrapper::EdgeMap(_G /*_G.getGraph()*/) { } marci@168: EdgeMap(const ErasingResGraphWrapper& _G, T a) : marci@168: ResGraphWrapper::EdgeMap(_G /*_G.getGraph()*/, a) { } marci@168: }; marci@168: }; marci@168: marci@168: template marci@168: class FilterGraphWrapper { marci@168: }; marci@168: marci@168: template marci@168: class FilterGraphWrapper > : public ErasingResGraphWrapper { marci@168: marci@168: //Graph* graph; marci@168: marci@168: public: marci@168: //typedef Graph BaseGraph; marci@168: marci@174: typedef typename ErasingResGraphWrapper::Node Node; marci@168: typedef typename ErasingResGraphWrapper::NodeIt NodeIt; marci@168: marci@174: typedef typename ErasingResGraphWrapper::Edge Edge; marci@168: typedef typename ErasingResGraphWrapper::OutEdgeIt OutEdgeIt; marci@168: //typedef typename ErasingResGraphWrapper::InEdgeIt InEdgeIt; marci@168: //typedef typename Graph::SymEdgeIt SymEdgeIt; marci@174: typedef typename ErasingResGraphWrapper::EdgeIt EdgeIt; marci@168: marci@168: //FilterGraphWrapper::NodeMap::OutEdgeIt> first_out_edges; marci@168: marci@168: public: marci@168: FilterGraphWrapper(const Graph& _G, FlowMap& _flow, marci@168: const CapacityMap& _capacity) : marci@199: ErasingResGraphWrapper(_G, _flow, _capacity), dist(*this, graph->nodeNum()) { marci@168: } marci@168: marci@212: OutEdgeIt& first(OutEdgeIt& e, const Node& n) const { marci@212: ErasingResGraphWrapper::first(e, n); marci@199: while (valid(e) && (dist.get(tail(e))/*+1!=*/>=dist.get(head(e)))) marci@168: ErasingResGraphWrapper::next(e); marci@168: return e; marci@168: } marci@168: marci@174: NodeIt& next(NodeIt& e) const { marci@168: return ErasingResGraphWrapper::next(e); marci@168: } marci@168: marci@168: OutEdgeIt& next(OutEdgeIt& e) const { marci@168: ErasingResGraphWrapper::next(e); marci@199: while (valid(e) && (dist.get(tail(e))/*+1!*/>=dist.get(head(e)))) marci@168: ErasingResGraphWrapper::next(e); marci@168: return e; marci@168: } marci@168: marci@212: NodeIt& first(NodeIt& n) const { marci@212: return ErasingResGraphWrapper::first(n); marci@168: } marci@168: marci@174: void erase(const Edge& e) { marci@168: OutEdgeIt f(e); marci@168: ErasingResGraphWrapper::next(f); marci@199: while (valid(f) && (dist.get(tail(f))/*+1!=*/>=dist.get(head(f)))) marci@168: ErasingResGraphWrapper::next(f); marci@168: first_out_edges.set(this->tail(e), f); marci@168: } marci@168: marci@168: //TrivGraphWrapper() : graph(0) { } marci@168: //TrivGraphWrapper(Graph& _graph) : graph(&_graph) { } marci@168: marci@168: //void setGraph(Graph& _graph) { graph = &_graph; } marci@168: //Graph& getGraph() const { return (*graph); } marci@168: marci@212: //template I& first(I& i) const { return graph->first(i); } marci@212: //template I& first(I& i, const P& p) const { marci@212: // return graph->first(i, p); } marci@168: marci@168: //template I getNext(const I& i) const { marci@168: // return graph->getNext(i); } marci@168: //template I& next(I &i) const { return graph->next(i); } marci@168: marci@168: template< typename It > It first() const { marci@212: It e; first(e); return e; } marci@168: marci@174: template< typename It > It first(const Node& v) const { marci@212: It e; first(e, v); return e; } marci@168: marci@174: //Node head(const Edge& e) const { return graph->head(e); } marci@174: //Node tail(const Edge& e) const { return graph->tail(e); } marci@168: marci@168: //template bool valid(const I& i) const marci@168: // { return graph->valid(i); } marci@168: marci@168: //template void setInvalid(const I &i); marci@168: //{ return graph->setInvalid(i); } marci@168: marci@168: //int nodeNum() const { return graph->nodeNum(); } marci@168: //int edgeNum() const { return graph->edgeNum(); } marci@168: marci@174: //template Node aNode(const I& e) const { marci@168: // return graph->aNode(e); } marci@174: //template Node bNode(const I& e) const { marci@168: // return graph->bNode(e); } marci@168: marci@174: //Node addNode() const { return graph->addNode(); } marci@174: //Edge addEdge(const Node& tail, const Node& head) const { marci@168: // return graph->addEdge(tail, head); } marci@168: marci@168: //template void erase(const I& i) const { graph->erase(i); } marci@168: marci@168: //void clear() const { graph->clear(); } marci@168: marci@168: template class NodeMap : public ErasingResGraphWrapper::NodeMap { marci@168: public: marci@168: NodeMap(const FilterGraphWrapper >& _G) : marci@168: ErasingResGraphWrapper::NodeMap(_G /*_G.getGraph()*/) { } marci@168: NodeMap(const FilterGraphWrapper >& _G, T a) : marci@168: ErasingResGraphWrapper::NodeMap(_G /*_G.getGraph()*/, a) { } marci@168: }; marci@168: marci@168: template class EdgeMap : public ErasingResGraphWrapper::EdgeMap { marci@168: public: marci@168: EdgeMap(const FilterGraphWrapper >& _G) : marci@168: ErasingResGraphWrapper::EdgeMap(_G /*_G.getGraph()*/) { } marci@168: EdgeMap(const FilterGraphWrapper >& _G, T a) : marci@168: ErasingResGraphWrapper::EdgeMap(_G /*_G.getGraph()*/, a) { } marci@168: }; marci@168: marci@168: public: marci@168: ErasingResGraphWrapper::NodeMap dist; marci@155: marci@76: }; marci@76: marci@76: marci@148: marci@148: // // FIXME: comparison should be made better!!! marci@148: // template marci@148: // class ResGraphWrapper marci@148: // { marci@148: // Graph* graph; marci@76: marci@148: // public: marci@148: // typedef Graph BaseGraph; marci@76: marci@174: // typedef typename Graph::Node Node; marci@174: // typedef typename Graph::Edge Edge; marci@174: marci@148: // typedef typename Graph::NodeIt NodeIt; marci@76: marci@148: // class OutEdgeIt { marci@148: // public: marci@174: // //Graph::Node n; marci@148: // bool out_or_in; marci@148: // typename Graph::OutEdgeIt o; marci@148: // typename Graph::InEdgeIt i; marci@148: // }; marci@148: // class InEdgeIt { marci@148: // public: marci@174: // //Graph::Node n; marci@148: // bool out_or_in; marci@148: // typename Graph::OutEdgeIt o; marci@148: // typename Graph::InEdgeIt i; marci@148: // }; marci@148: // typedef typename Graph::SymEdgeIt SymEdgeIt; marci@174: // typedef typename Graph::EdgeIt EdgeIt; marci@76: marci@148: // int nodeNum() const { return graph->nodeNum(); } marci@148: // int edgeNum() const { return graph->edgeNum(); } marci@76: marci@212: // Node& first(Node& n) const { return graph->first(n); } marci@76: marci@174: // // Edge and SymEdge is missing!!!! marci@174: // // Edge <-> In/OutEdgeIt conversion is missing!!!! marci@76: marci@148: // //FIXME marci@212: // OutEdgeIt& first(OutEdgeIt& e, const Node& n) const marci@148: // { marci@148: // e.n=n; marci@212: // graph->first(e.o,n); marci@148: // while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o)) marci@148: // graph->goNext(e.o); marci@148: // if(!graph->valid(e.o)) { marci@212: // graph->first(e.i,n); marci@148: // while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i)) marci@148: // graph->goNext(e.i); marci@148: // } marci@148: // return e; marci@148: // } marci@148: // /* marci@148: // OutEdgeIt &goNext(OutEdgeIt &e) marci@148: // { marci@148: // if(graph->valid(e.o)) { marci@148: // while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o)) marci@148: // graph->goNext(e.o); marci@148: // if(graph->valid(e.o)) return e; marci@212: // else graph->first(e.i,e.n); marci@148: // } marci@148: // else { marci@148: // while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i)) marci@148: // graph->goNext(e.i); marci@148: // return e; marci@148: // } marci@148: // } marci@148: // OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);} marci@148: // */ marci@148: // //bool valid(const OutEdgeIt e) { return graph->valid(e.o)||graph->valid(e.i);} marci@76: marci@148: // //FIXME marci@212: // InEdgeIt& first(InEdgeIt& e, const Node& n) const marci@148: // { marci@148: // e.n=n; marci@212: // graph->first(e.i,n); marci@148: // while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i)) marci@148: // graph->goNext(e.i); marci@148: // if(!graph->valid(e.i)) { marci@212: // graph->first(e.o,n); marci@148: // while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o)) marci@148: // graph->goNext(e.o); marci@148: // } marci@148: // return e; marci@148: // } marci@148: // /* marci@148: // InEdgeIt &goNext(InEdgeIt &e) marci@148: // { marci@148: // if(graph->valid(e.i)) { marci@148: // while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i)) marci@148: // graph->goNext(e.i); marci@148: // if(graph->valid(e.i)) return e; marci@212: // else graph->first(e.o,e.n); marci@148: // } marci@148: // else { marci@148: // while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o)) marci@148: // graph->goNext(e.o); marci@148: // return e; marci@148: // } marci@148: // } marci@148: // InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);} marci@148: // */ marci@148: // //bool valid(const InEdgeIt e) { return graph->valid(e.i)||graph->valid(e.o);} marci@76: marci@148: // //template I &goNext(I &i); { return graph->goNext(i); } marci@148: // //template I next(const I i); { return graph->goNext(i); } marci@76: marci@148: // template< typename It > It first() const { marci@212: // It e; first(e); return e; } marci@76: marci@174: // template< typename It > It first(Node v) const { marci@212: // It e; first(e, v); return e; } marci@76: marci@174: // Node head(const Edge& e) const { return graph->head(e); } marci@174: // Node tail(const Edge& e) const { return graph->tail(e); } marci@76: marci@174: // template Node aNode(const I& e) const { marci@148: // return graph->aNode(e); } marci@174: // template Node bNode(const I& e) const { marci@148: // return graph->bNode(e); } marci@76: marci@148: // //template bool valid(const I i); marci@148: // //{ return graph->valid(i); } marci@76: marci@148: // //template void setInvalid(const I &i); marci@148: // //{ return graph->setInvalid(i); } marci@76: marci@174: // Node addNode() { return graph->addNode(); } marci@174: // Edge addEdge(const Node& tail, const Node& head) { marci@148: // return graph->addEdge(tail, head); } marci@76: marci@148: // template void erase(const I& i) { graph->erase(i); } marci@76: marci@148: // void clear() { graph->clear(); } marci@76: marci@148: // template class NodeMap : public Graph::NodeMap { }; marci@148: // template class EdgeMap : public Graph::EdgeMap { }; marci@76: marci@148: // void setGraph(Graph& _graph) { graph = &_graph; } marci@148: // Graph& getGraph() { return (*graph); } marci@76: marci@148: // //ResGraphWrapper() : graph(0) { } marci@148: // ResGraphWrapper(Graph& _graph) : graph(&_graph) { } marci@148: // }; marci@76: alpar@105: } //namespace hugo marci@76: marci@76: #endif //GRAPH_WRAPPER_H marci@76: