// -*-mode: c++; -*- #ifndef GRAPH_WRAPPER_H #define GRAPH_WRAPPER_H namespace hugo { template class TrivGraphWrapper { Graph* graph; public: typedef Graph BaseGraph; typedef typename Graph::NodeIt NodeIt; typedef typename Graph::EdgeIt EdgeIt; typedef typename Graph::EachNodeIt EachNodeIt; typedef typename Graph::OutEdgeIt OutEdgeIt; typedef typename Graph::InEdgeIt InEdgeIt; typedef typename Graph::SymEdgeIt SymEdgeIt; typedef typename Graph::EachEdgeIt EachEdgeIt; int nodeNum() const { return graph->nodeNum(); } int edgeNum() const { return graph->edgeNum(); } template I& getFirst(I& i) const { return graph->getFirst(i); } template I& getFirst(I& i, const P& p) const { return graph->getFirst(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; getFirst(e); return e; } template< typename It > It first(NodeIt v) const { It e; getFirst(e, v); return e; } NodeIt head(const EdgeIt& e) const { return graph->head(e); } NodeIt tail(const EdgeIt& e) const { return graph->tail(e); } template NodeIt aNode(const I& e) const { return graph->aNode(e); } template NodeIt 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); } NodeIt addNode() const { return graph->addNode(); } EdgeIt addEdge(const NodeIt& tail, const NodeIt& 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 Graph& _G) : Graph::NodeMap(_G) { } NodeMap(const Graph& _G, T a) : Graph::NodeMap(_G, a) { } }; template class EdgeMap : public Graph::EdgeMap { }; void setGraph(Graph& _graph) { graph = &_graph; } Graph& getGraph() { return (*graph); } //TrivGraphWrapper() : graph(0) { } TrivGraphWrapper(Graph& _graph) : graph(&_graph) { } }; template class ConstTrivGraphWrapper { const Graph* graph; public: typedef Graph BaseGraph; typedef typename Graph::NodeIt NodeIt; typedef typename Graph::EdgeIt EdgeIt; typedef typename Graph::EachNodeIt EachNodeIt; typedef typename Graph::OutEdgeIt OutEdgeIt; typedef typename Graph::InEdgeIt InEdgeIt; typedef typename Graph::SymEdgeIt SymEdgeIt; typedef typename Graph::EachEdgeIt EachEdgeIt; int nodeNum() const { return graph->nodeNum(); } int edgeNum() const { return graph->edgeNum(); } template I& getFirst(I& i) const { return graph->getFirst(i); } template I& getFirst(I& i, const P& p) const { return graph->getFirst(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; getFirst(e); return e; } template< typename It > It first(NodeIt v) const { It e; getFirst(e, v); return e; } NodeIt head(const EdgeIt& e) const { return graph->head(e); } NodeIt tail(const EdgeIt& e) const { return graph->tail(e); } template NodeIt aNode(const I& e) const { return graph->aNode(e); } template NodeIt 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); } NodeIt addNode() const { return graph->addNode(); } EdgeIt addEdge(const NodeIt& tail, const NodeIt& 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 Graph& _G) : Graph::NodeMap(_G) { } NodeMap(const Graph& _G, T a) : Graph::NodeMap(_G, a) { } }; template class EdgeMap : public Graph::EdgeMap { }; void setGraph(const Graph& _graph) { graph = &_graph; } const Graph& getGraph() { return (*graph); } //ConstTrivGraphWrapper() : graph(0) { } ConstTrivGraphWrapper(const Graph& _graph) : graph(&_graph) { } }; template class RevGraphWrapper { Graph* graph; public: typedef Graph BaseGraph; typedef typename Graph::NodeIt NodeIt; typedef typename Graph::EdgeIt EdgeIt; typedef typename Graph::EachNodeIt EachNodeIt; typedef typename Graph::OutEdgeIt InEdgeIt; typedef typename Graph::InEdgeIt OutEdgeIt; typedef typename Graph::SymEdgeIt SymEdgeIt; typedef typename Graph::EachEdgeIt EachEdgeIt; int nodeNum() const { return graph->nodeNum(); } int edgeNum() const { return graph->edgeNum(); } template I& getFirst(I& i) const { return graph->getFirst(i); } template I& getFirst(I& i, const P& p) const { return graph->getFirst(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; getFirst(e); return e; } template< typename It > It first(NodeIt v) const { It e; getFirst(e, v); return e; } NodeIt head(const EdgeIt& e) const { return graph->tail(e); } NodeIt tail(const EdgeIt& e) const { return graph->head(e); } template NodeIt aNode(const I& e) const { return graph->aNode(e); } template NodeIt 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); } NodeIt addNode() { return graph->addNode(); } EdgeIt addEdge(const NodeIt& tail, const NodeIt& 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); } //RevGraphWrapper() : graph(0) { } RevGraphWrapper(Graph& _graph) : graph(&_graph) { } }; template class SymGraphWrapper { Graph* graph; public: typedef Graph BaseGraph; typedef typename Graph::NodeIt NodeIt; typedef typename Graph::EdgeIt EdgeIt; typedef typename Graph::EachNodeIt EachNodeIt; //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::EachEdgeIt EachEdgeIt; int nodeNum() const { return graph->nodeNum(); } int edgeNum() const { return graph->edgeNum(); } template I& getFirst(I& i) const { return graph->getFirst(i); } template I& getFirst(I& i, const P& p) const { return graph->getFirst(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; getFirst(e); return e; } template< typename It > It first(NodeIt v) const { It e; getFirst(e, v); return e; } NodeIt head(const EdgeIt& e) const { return graph->head(e); } NodeIt tail(const EdgeIt& e) const { return graph->tail(e); } template NodeIt aNode(const I& e) const { return graph->aNode(e); } template NodeIt 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); } NodeIt addNode() { return graph->addNode(); } EdgeIt addEdge(const NodeIt& tail, const NodeIt& 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) { } }; // FIXME: comparison should be made better!!! template class ResGraphWrapper { Graph* graph; public: typedef Graph BaseGraph; typedef typename Graph::NodeIt NodeIt; typedef typename Graph::EdgeIt EdgeIt; typedef typename Graph::EachNodeIt EachNodeIt; class OutEdgeIt { public: //Graph::NodeIt n; bool out_or_in; typename Graph::OutEdgeIt o; typename Graph::InEdgeIt i; }; class InEdgeIt { public: //Graph::NodeIt n; bool out_or_in; typename Graph::OutEdgeIt o; typename Graph::InEdgeIt i; }; typedef typename Graph::SymEdgeIt SymEdgeIt; typedef typename Graph::EachEdgeIt EachEdgeIt; int nodeNum() const { return graph->nodeNum(); } int edgeNum() const { return graph->edgeNum(); } NodeIt& getFirst(NodeIt& n) const { return graph->getFirst(n); } // EachEdge and SymEdge is missing!!!! // EdgeIt <-> In/OutEdgeIt conversion is missing!!!! //FIXME OutEdgeIt& getFirst(OutEdgeIt& e, const NodeIt& n) const { e.n=n; graph->getFirst(e.o,n); while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o)) graph->goNext(e.o); if(!graph->valid(e.o)) { graph->getFirst(e.i,n); while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i)) graph->goNext(e.i); } return e; } /* OutEdgeIt &goNext(OutEdgeIt &e) { if(graph->valid(e.o)) { while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o)) graph->goNext(e.o); if(graph->valid(e.o)) return e; else graph->getFirst(e.i,e.n); } else { while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i)) graph->goNext(e.i); return e; } } OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);} */ //bool valid(const OutEdgeIt e) { return graph->valid(e.o)||graph->valid(e.i);} //FIXME InEdgeIt& getFirst(InEdgeIt& e, const NodeIt& n) const { e.n=n; graph->getFirst(e.i,n); while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i)) graph->goNext(e.i); if(!graph->valid(e.i)) { graph->getFirst(e.o,n); while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o)) graph->goNext(e.o); } return e; } /* InEdgeIt &goNext(InEdgeIt &e) { if(graph->valid(e.i)) { while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i)) graph->goNext(e.i); if(graph->valid(e.i)) return e; else graph->getFirst(e.o,e.n); } else { while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o)) graph->goNext(e.o); return e; } } InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);} */ //bool valid(const InEdgeIt e) { return graph->valid(e.i)||graph->valid(e.o);} //template I &goNext(I &i); { return graph->goNext(i); } //template I next(const I i); { return graph->goNext(i); } template< typename It > It first() const { It e; getFirst(e); return e; } template< typename It > It first(NodeIt v) const { It e; getFirst(e, v); return e; } NodeIt head(const EdgeIt& e) const { return graph->head(e); } NodeIt tail(const EdgeIt& e) const { return graph->tail(e); } template NodeIt aNode(const I& e) const { return graph->aNode(e); } template NodeIt 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); } NodeIt addNode() { return graph->addNode(); } EdgeIt addEdge(const NodeIt& tail, const NodeIt& 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); } //ResGraphWrapper() : graph(0) { } ResGraphWrapper(Graph& _graph) : graph(&_graph) { } }; // FIXME: comparison should be made better!!! template class ConstResGraphWrapper { const Graph* graph; const LowerMap* low; FlowMap* flow; const UpperMap* up; public: typedef Graph BaseGraph; typedef typename Graph::NodeIt NodeIt; typedef typename Graph::EdgeIt EdgeIt; typedef typename Graph::EachNodeIt EachNodeIt; class OutEdgeIt { public: //Graph::NodeIt n; bool out_or_in; typename Graph::SymEdgeIt sym; }; class InEdgeIt { public: //Graph::NodeIt n; bool out_or_in; typename Graph::OutEdgeIt sym; }; //typedef typename Graph::SymEdgeIt SymEdgeIt; //typedef typename Graph::EachEdgeIt EachEdgeIt; int nodeNum() const { return graph->nodeNum(); } //int edgeNum() const { return graph->edgeNum(); } NodeIt& getFirst(NodeIt& n) const { return graph->getFirst(n); } // EachEdge and SymEdge is missing!!!! // EdgeIt <-> In/OutEdgeIt conversion is missing!!!! //FIXME OutEdgeIt& getFirst(OutEdgeIt& e, const NodeIt& n) const { e.n=n; graph->getFirst(e.o,n); while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o)) graph->goNext(e.o); if(!graph->valid(e.o)) { graph->getFirst(e.i,n); while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i)) graph->goNext(e.i); } return e; } /* OutEdgeIt &goNext(OutEdgeIt &e) { if(graph->valid(e.o)) { while(graph->valid(e.o) && fmap.get(e.o)>=himap.get(e.o)) graph->goNext(e.o); if(graph->valid(e.o)) return e; else graph->getFirst(e.i,e.n); } else { while(graph->valid(e.i) && fmap.get(e.i)<=lomap.get(e.i)) graph->goNext(e.i); return e; } } OutEdgeIt Next(const OutEdgeIt &e) {OutEdgeIt t(e); return goNext(t);} */ //bool valid(const OutEdgeIt e) { return graph->valid(e.o)||graph->valid(e.i);} //FIXME InEdgeIt& getFirst(InEdgeIt& e, const NodeIt& n) const { e.n=n; graph->getFirst(e.i,n); while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i)) graph->goNext(e.i); if(!graph->valid(e.i)) { graph->getFirst(e.o,n); while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o)) graph->goNext(e.o); } return e; } /* InEdgeIt &goNext(InEdgeIt &e) { if(graph->valid(e.i)) { while(graph->valid(e.i) && fmap.get(e.i)>=himap.get(e.i)) graph->goNext(e.i); if(graph->valid(e.i)) return e; else graph->getFirst(e.o,e.n); } else { while(graph->valid(e.o) && fmap.get(e.o)<=lomap.get(e.o)) graph->goNext(e.o); return e; } } InEdgeIt Next(const InEdgeIt &e) {InEdgeIt t(e); return goNext(t);} */ //bool valid(const InEdgeIt e) { return graph->valid(e.i)||graph->valid(e.o);} //template I &goNext(I &i); { return graph->goNext(i); } //template I next(const I i); { return graph->goNext(i); } template< typename It > It first() const { It e; getFirst(e); return e; } template< typename It > It first(NodeIt v) const { It e; getFirst(e, v); return e; } NodeIt head(const EdgeIt& e) const { return graph->head(e); } NodeIt tail(const EdgeIt& e) const { return graph->tail(e); } template NodeIt aNode(const I& e) const { return graph->aNode(e); } template NodeIt 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); } NodeIt addNode() { return graph->addNode(); } EdgeIt addEdge(const NodeIt& tail, const NodeIt& 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(const Graph& _graph) { graph = &_graph; } const Graph& getGraph() { return (*graph); } //ConstResGraphWrapper() : graph(0) { } ConstResGraphWrapper(const Graph& _graph) : graph(&_graph) { } }; } //namespace hugo #endif //GRAPH_WRAPPER_H // NodeIt &getFirst(NodeIt &n) { return graph->getFirst(n); } // InEdgeIt &getFirst(InEdgeIt &e,const NodeIt &n); // { return graph->getFirst(e,n); } // OutEdgeIt &getFirst(OutEdgeIt &e,const NodeIt &n); // { return graph->getFirst(e,n); } // SymEdgeIt &getFirst(SymEdgeIt &e,const NodeIt &n); // { return graph->getFirst(e,n); } // EachEdgeIt &getFirst(EachEdgeIt &e); // { return graph->getFirst(e); } // NodeIt next(const NodeIt &n); // { return graph->next(n); } // InEdgeIt next(const InEdgeIt &e); // { return graph->next(e); } // OutEdgeIt next(const OutEdgeIt &e); // { return graph->next(e); } // SymEdgeIt next(const SymEdgeIt &e); // { return graph->next(e); } // EachEdgeIt next(const EachEdgeIt &e); // { return graph->next(e); } // NodeIt &goNext(NodeIt &n); // { return graph->goNext(n); } // InEdgeIt &goNext(InEdgeIt &e); // { return graph->goNext(e); } // OutEdgeIt &goNext(OutEdgeIt &e); // { return graph->goNext(e); } // SymEdgeIt &goNext(SymEdgeIt &e); // { return graph->goNext(e); } // EachEdgeIt &goNext(EachEdgeIt &e); // { return graph->goNext(e); }