deba@432: /* -*- mode: C++; indent-tabs-mode: nil; -*- deba@430: * deba@432: * This file is a part of LEMON, a generic C++ optimization library. deba@430: * alpar@463: * Copyright (C) 2003-2009 deba@430: * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport deba@430: * (Egervary Research Group on Combinatorial Optimization, EGRES). deba@430: * deba@430: * Permission to use, modify and distribute this software is granted deba@430: * provided that this copyright notice appears in all copies. For deba@430: * precise terms see the accompanying LICENSE file. deba@430: * deba@430: * This software is provided "AS IS" with no warranty of any kind, deba@430: * express or implied, and with no claim as to its suitability for any deba@430: * purpose. deba@430: * deba@430: */ deba@430: deba@430: #ifndef LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H deba@430: #define LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H deba@430: deba@430: #include deba@430: #include deba@430: deba@430: #include deba@430: deba@430: namespace lemon { deba@430: deba@430: template deba@430: class DigraphAdaptorExtender : public _Digraph { deba@430: public: deba@430: deba@430: typedef _Digraph Parent; deba@430: typedef _Digraph Digraph; deba@430: typedef DigraphAdaptorExtender Adaptor; deba@430: deba@430: // Base extensions deba@430: deba@430: typedef typename Parent::Node Node; deba@430: typedef typename Parent::Arc Arc; deba@430: deba@430: int maxId(Node) const { deba@430: return Parent::maxNodeId(); deba@430: } deba@430: deba@430: int maxId(Arc) const { deba@430: return Parent::maxArcId(); deba@430: } deba@430: deba@430: Node fromId(int id, Node) const { deba@430: return Parent::nodeFromId(id); deba@430: } deba@430: deba@430: Arc fromId(int id, Arc) const { deba@430: return Parent::arcFromId(id); deba@430: } deba@430: deba@430: Node oppositeNode(const Node &n, const Arc &e) const { deba@430: if (n == Parent::source(e)) deba@432: return Parent::target(e); deba@430: else if(n==Parent::target(e)) deba@432: return Parent::source(e); deba@430: else deba@432: return INVALID; deba@430: } deba@430: deba@432: class NodeIt : public Node { deba@430: const Adaptor* _adaptor; deba@430: public: deba@430: deba@430: NodeIt() {} deba@430: deba@430: NodeIt(Invalid i) : Node(i) { } deba@430: deba@430: explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) { deba@432: _adaptor->first(static_cast(*this)); deba@430: } deba@430: deba@432: NodeIt(const Adaptor& adaptor, const Node& node) deba@432: : Node(node), _adaptor(&adaptor) {} deba@430: deba@432: NodeIt& operator++() { deba@432: _adaptor->next(*this); deba@432: return *this; deba@430: } deba@430: deba@430: }; deba@430: deba@430: deba@432: class ArcIt : public Arc { deba@430: const Adaptor* _adaptor; deba@430: public: deba@430: deba@430: ArcIt() { } deba@430: deba@430: ArcIt(Invalid i) : Arc(i) { } deba@430: deba@430: explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) { deba@432: _adaptor->first(static_cast(*this)); deba@430: } deba@430: deba@432: ArcIt(const Adaptor& adaptor, const Arc& e) : deba@432: Arc(e), _adaptor(&adaptor) { } deba@430: deba@432: ArcIt& operator++() { deba@432: _adaptor->next(*this); deba@432: return *this; deba@430: } deba@430: deba@430: }; deba@430: deba@430: deba@432: class OutArcIt : public Arc { deba@430: const Adaptor* _adaptor; deba@430: public: deba@430: deba@430: OutArcIt() { } deba@430: deba@430: OutArcIt(Invalid i) : Arc(i) { } deba@430: deba@432: OutArcIt(const Adaptor& adaptor, const Node& node) deba@432: : _adaptor(&adaptor) { deba@432: _adaptor->firstOut(*this, node); deba@430: } deba@430: deba@432: OutArcIt(const Adaptor& adaptor, const Arc& arc) deba@432: : Arc(arc), _adaptor(&adaptor) {} deba@430: deba@432: OutArcIt& operator++() { deba@432: _adaptor->nextOut(*this); deba@432: return *this; deba@430: } deba@430: deba@430: }; deba@430: deba@430: deba@432: class InArcIt : public Arc { deba@430: const Adaptor* _adaptor; deba@430: public: deba@430: deba@430: InArcIt() { } deba@430: deba@430: InArcIt(Invalid i) : Arc(i) { } deba@430: deba@432: InArcIt(const Adaptor& adaptor, const Node& node) deba@432: : _adaptor(&adaptor) { deba@432: _adaptor->firstIn(*this, node); deba@430: } deba@430: deba@432: InArcIt(const Adaptor& adaptor, const Arc& arc) : deba@432: Arc(arc), _adaptor(&adaptor) {} deba@430: deba@432: InArcIt& operator++() { deba@432: _adaptor->nextIn(*this); deba@432: return *this; deba@430: } deba@430: deba@430: }; deba@430: deba@430: Node baseNode(const OutArcIt &e) const { deba@430: return Parent::source(e); deba@430: } deba@430: Node runningNode(const OutArcIt &e) const { deba@430: return Parent::target(e); deba@430: } deba@430: deba@430: Node baseNode(const InArcIt &e) const { deba@430: return Parent::target(e); deba@430: } deba@430: Node runningNode(const InArcIt &e) const { deba@430: return Parent::source(e); deba@430: } deba@430: deba@430: }; deba@430: deba@432: template deba@430: class GraphAdaptorExtender : public _Graph { deba@430: public: deba@432: deba@430: typedef _Graph Parent; deba@430: typedef _Graph Graph; deba@430: typedef GraphAdaptorExtender Adaptor; deba@430: deba@430: typedef typename Parent::Node Node; deba@430: typedef typename Parent::Arc Arc; deba@430: typedef typename Parent::Edge Edge; deba@430: deba@432: // Graph extension deba@430: deba@430: int maxId(Node) const { deba@430: return Parent::maxNodeId(); deba@430: } deba@430: deba@430: int maxId(Arc) const { deba@430: return Parent::maxArcId(); deba@430: } deba@430: deba@430: int maxId(Edge) const { deba@430: return Parent::maxEdgeId(); deba@430: } deba@430: deba@430: Node fromId(int id, Node) const { deba@430: return Parent::nodeFromId(id); deba@430: } deba@430: deba@430: Arc fromId(int id, Arc) const { deba@430: return Parent::arcFromId(id); deba@430: } deba@430: deba@430: Edge fromId(int id, Edge) const { deba@430: return Parent::edgeFromId(id); deba@430: } deba@430: deba@430: Node oppositeNode(const Node &n, const Edge &e) const { deba@430: if( n == Parent::u(e)) deba@432: return Parent::v(e); deba@430: else if( n == Parent::v(e)) deba@432: return Parent::u(e); deba@430: else deba@432: return INVALID; deba@430: } deba@430: deba@430: Arc oppositeArc(const Arc &a) const { deba@430: return Parent::direct(a, !Parent::direction(a)); deba@430: } deba@430: deba@430: using Parent::direct; deba@430: Arc direct(const Edge &e, const Node &s) const { deba@430: return Parent::direct(e, Parent::u(e) == s); deba@430: } deba@430: deba@430: deba@432: class NodeIt : public Node { deba@430: const Adaptor* _adaptor; deba@430: public: deba@430: deba@430: NodeIt() {} deba@430: deba@430: NodeIt(Invalid i) : Node(i) { } deba@430: deba@430: explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) { deba@432: _adaptor->first(static_cast(*this)); deba@430: } deba@430: deba@432: NodeIt(const Adaptor& adaptor, const Node& node) deba@432: : Node(node), _adaptor(&adaptor) {} deba@430: deba@432: NodeIt& operator++() { deba@432: _adaptor->next(*this); deba@432: return *this; deba@430: } deba@430: deba@430: }; deba@430: deba@430: deba@432: class ArcIt : public Arc { deba@430: const Adaptor* _adaptor; deba@430: public: deba@430: deba@430: ArcIt() { } deba@430: deba@430: ArcIt(Invalid i) : Arc(i) { } deba@430: deba@430: explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) { deba@432: _adaptor->first(static_cast(*this)); deba@430: } deba@430: deba@432: ArcIt(const Adaptor& adaptor, const Arc& e) : deba@432: Arc(e), _adaptor(&adaptor) { } deba@430: deba@432: ArcIt& operator++() { deba@432: _adaptor->next(*this); deba@432: return *this; deba@430: } deba@430: deba@430: }; deba@430: deba@430: deba@432: class OutArcIt : public Arc { deba@430: const Adaptor* _adaptor; deba@430: public: deba@430: deba@430: OutArcIt() { } deba@430: deba@430: OutArcIt(Invalid i) : Arc(i) { } deba@430: deba@432: OutArcIt(const Adaptor& adaptor, const Node& node) deba@432: : _adaptor(&adaptor) { deba@432: _adaptor->firstOut(*this, node); deba@430: } deba@430: deba@432: OutArcIt(const Adaptor& adaptor, const Arc& arc) deba@432: : Arc(arc), _adaptor(&adaptor) {} deba@430: deba@432: OutArcIt& operator++() { deba@432: _adaptor->nextOut(*this); deba@432: return *this; deba@430: } deba@430: deba@430: }; deba@430: deba@430: deba@432: class InArcIt : public Arc { deba@430: const Adaptor* _adaptor; deba@430: public: deba@430: deba@430: InArcIt() { } deba@430: deba@430: InArcIt(Invalid i) : Arc(i) { } deba@430: deba@432: InArcIt(const Adaptor& adaptor, const Node& node) deba@432: : _adaptor(&adaptor) { deba@432: _adaptor->firstIn(*this, node); deba@430: } deba@430: deba@432: InArcIt(const Adaptor& adaptor, const Arc& arc) : deba@432: Arc(arc), _adaptor(&adaptor) {} deba@430: deba@432: InArcIt& operator++() { deba@432: _adaptor->nextIn(*this); deba@432: return *this; deba@430: } deba@430: deba@430: }; deba@430: deba@432: class EdgeIt : public Parent::Edge { deba@430: const Adaptor* _adaptor; deba@430: public: deba@430: deba@430: EdgeIt() { } deba@430: deba@430: EdgeIt(Invalid i) : Edge(i) { } deba@430: deba@430: explicit EdgeIt(const Adaptor& adaptor) : _adaptor(&adaptor) { deba@432: _adaptor->first(static_cast(*this)); deba@430: } deba@430: deba@432: EdgeIt(const Adaptor& adaptor, const Edge& e) : deba@432: Edge(e), _adaptor(&adaptor) { } deba@430: deba@432: EdgeIt& operator++() { deba@432: _adaptor->next(*this); deba@432: return *this; deba@430: } deba@430: deba@430: }; deba@430: deba@432: class IncEdgeIt : public Edge { deba@430: friend class GraphAdaptorExtender; deba@430: const Adaptor* _adaptor; deba@430: bool direction; deba@430: public: deba@430: deba@430: IncEdgeIt() { } deba@430: deba@430: IncEdgeIt(Invalid i) : Edge(i), direction(false) { } deba@430: deba@430: IncEdgeIt(const Adaptor& adaptor, const Node &n) : _adaptor(&adaptor) { deba@432: _adaptor->firstInc(static_cast(*this), direction, n); deba@430: } deba@430: deba@430: IncEdgeIt(const Adaptor& adaptor, const Edge &e, const Node &n) deba@432: : _adaptor(&adaptor), Edge(e) { deba@432: direction = (_adaptor->u(e) == n); deba@430: } deba@430: deba@430: IncEdgeIt& operator++() { deba@432: _adaptor->nextInc(*this, direction); deba@432: return *this; deba@430: } deba@430: }; deba@430: deba@430: Node baseNode(const OutArcIt &a) const { deba@430: return Parent::source(a); deba@430: } deba@430: Node runningNode(const OutArcIt &a) const { deba@430: return Parent::target(a); deba@430: } deba@430: deba@430: Node baseNode(const InArcIt &a) const { deba@430: return Parent::target(a); deba@430: } deba@430: Node runningNode(const InArcIt &a) const { deba@430: return Parent::source(a); deba@430: } deba@430: deba@430: Node baseNode(const IncEdgeIt &e) const { deba@430: return e.direction ? Parent::u(e) : Parent::v(e); deba@430: } deba@430: Node runningNode(const IncEdgeIt &e) const { deba@430: return e.direction ? Parent::v(e) : Parent::u(e); deba@430: } deba@430: deba@430: }; deba@430: deba@430: } deba@430: deba@430: deba@430: #endif