1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
 
     3  * This file is a part of LEMON, a generic C++ optimization library.
 
     5  * Copyright (C) 2003-2009
 
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
 
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
 
     9  * Permission to use, modify and distribute this software is granted
 
    10  * provided that this copyright notice appears in all copies. For
 
    11  * precise terms see the accompanying LICENSE file.
 
    13  * This software is provided "AS IS" with no warranty of any kind,
 
    14  * express or implied, and with no claim as to its suitability for any
 
    19 #ifndef LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H
 
    20 #define LEMON_BITS_GRAPH_ADAPTOR_EXTENDER_H
 
    22 #include <lemon/core.h>
 
    23 #include <lemon/error.h>
 
    25 #include <lemon/bits/default_map.h>
 
    29   template <typename _Digraph>
 
    30   class DigraphAdaptorExtender : public _Digraph {
 
    33     typedef _Digraph Parent;
 
    34     typedef _Digraph Digraph;
 
    35     typedef DigraphAdaptorExtender Adaptor;
 
    39     typedef typename Parent::Node Node;
 
    40     typedef typename Parent::Arc Arc;
 
    42     int maxId(Node) const {
 
    43       return Parent::maxNodeId();
 
    46     int maxId(Arc) const {
 
    47       return Parent::maxArcId();
 
    50     Node fromId(int id, Node) const {
 
    51       return Parent::nodeFromId(id);
 
    54     Arc fromId(int id, Arc) const {
 
    55       return Parent::arcFromId(id);
 
    58     Node oppositeNode(const Node &n, const Arc &e) const {
 
    59       if (n == Parent::source(e))
 
    60         return Parent::target(e);
 
    61       else if(n==Parent::target(e))
 
    62         return Parent::source(e);
 
    67     class NodeIt : public Node {
 
    68       const Adaptor* _adaptor;
 
    73       NodeIt(Invalid i) : Node(i) { }
 
    75       explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
 
    76         _adaptor->first(static_cast<Node&>(*this));
 
    79       NodeIt(const Adaptor& adaptor, const Node& node)
 
    80         : Node(node), _adaptor(&adaptor) {}
 
    82       NodeIt& operator++() {
 
    83         _adaptor->next(*this);
 
    90     class ArcIt : public Arc {
 
    91       const Adaptor* _adaptor;
 
    96       ArcIt(Invalid i) : Arc(i) { }
 
    98       explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
 
    99         _adaptor->first(static_cast<Arc&>(*this));
 
   102       ArcIt(const Adaptor& adaptor, const Arc& e) :
 
   103         Arc(e), _adaptor(&adaptor) { }
 
   105       ArcIt& operator++() {
 
   106         _adaptor->next(*this);
 
   113     class OutArcIt : public Arc {
 
   114       const Adaptor* _adaptor;
 
   119       OutArcIt(Invalid i) : Arc(i) { }
 
   121       OutArcIt(const Adaptor& adaptor, const Node& node)
 
   122         : _adaptor(&adaptor) {
 
   123         _adaptor->firstOut(*this, node);
 
   126       OutArcIt(const Adaptor& adaptor, const Arc& arc)
 
   127         : Arc(arc), _adaptor(&adaptor) {}
 
   129       OutArcIt& operator++() {
 
   130         _adaptor->nextOut(*this);
 
   137     class InArcIt : public Arc {
 
   138       const Adaptor* _adaptor;
 
   143       InArcIt(Invalid i) : Arc(i) { }
 
   145       InArcIt(const Adaptor& adaptor, const Node& node)
 
   146         : _adaptor(&adaptor) {
 
   147         _adaptor->firstIn(*this, node);
 
   150       InArcIt(const Adaptor& adaptor, const Arc& arc) :
 
   151         Arc(arc), _adaptor(&adaptor) {}
 
   153       InArcIt& operator++() {
 
   154         _adaptor->nextIn(*this);
 
   160     Node baseNode(const OutArcIt &e) const {
 
   161       return Parent::source(e);
 
   163     Node runningNode(const OutArcIt &e) const {
 
   164       return Parent::target(e);
 
   167     Node baseNode(const InArcIt &e) const {
 
   168       return Parent::target(e);
 
   170     Node runningNode(const InArcIt &e) const {
 
   171       return Parent::source(e);
 
   176   template <typename _Graph>
 
   177   class GraphAdaptorExtender : public _Graph {
 
   180     typedef _Graph Parent;
 
   181     typedef _Graph Graph;
 
   182     typedef GraphAdaptorExtender Adaptor;
 
   184     typedef typename Parent::Node Node;
 
   185     typedef typename Parent::Arc Arc;
 
   186     typedef typename Parent::Edge Edge;
 
   190     int maxId(Node) const {
 
   191       return Parent::maxNodeId();
 
   194     int maxId(Arc) const {
 
   195       return Parent::maxArcId();
 
   198     int maxId(Edge) const {
 
   199       return Parent::maxEdgeId();
 
   202     Node fromId(int id, Node) const {
 
   203       return Parent::nodeFromId(id);
 
   206     Arc fromId(int id, Arc) const {
 
   207       return Parent::arcFromId(id);
 
   210     Edge fromId(int id, Edge) const {
 
   211       return Parent::edgeFromId(id);
 
   214     Node oppositeNode(const Node &n, const Edge &e) const {
 
   215       if( n == Parent::u(e))
 
   217       else if( n == Parent::v(e))
 
   223     Arc oppositeArc(const Arc &a) const {
 
   224       return Parent::direct(a, !Parent::direction(a));
 
   227     using Parent::direct;
 
   228     Arc direct(const Edge &e, const Node &s) const {
 
   229       return Parent::direct(e, Parent::u(e) == s);
 
   233     class NodeIt : public Node {
 
   234       const Adaptor* _adaptor;
 
   239       NodeIt(Invalid i) : Node(i) { }
 
   241       explicit NodeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
 
   242         _adaptor->first(static_cast<Node&>(*this));
 
   245       NodeIt(const Adaptor& adaptor, const Node& node)
 
   246         : Node(node), _adaptor(&adaptor) {}
 
   248       NodeIt& operator++() {
 
   249         _adaptor->next(*this);
 
   256     class ArcIt : public Arc {
 
   257       const Adaptor* _adaptor;
 
   262       ArcIt(Invalid i) : Arc(i) { }
 
   264       explicit ArcIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
 
   265         _adaptor->first(static_cast<Arc&>(*this));
 
   268       ArcIt(const Adaptor& adaptor, const Arc& e) :
 
   269         Arc(e), _adaptor(&adaptor) { }
 
   271       ArcIt& operator++() {
 
   272         _adaptor->next(*this);
 
   279     class OutArcIt : public Arc {
 
   280       const Adaptor* _adaptor;
 
   285       OutArcIt(Invalid i) : Arc(i) { }
 
   287       OutArcIt(const Adaptor& adaptor, const Node& node)
 
   288         : _adaptor(&adaptor) {
 
   289         _adaptor->firstOut(*this, node);
 
   292       OutArcIt(const Adaptor& adaptor, const Arc& arc)
 
   293         : Arc(arc), _adaptor(&adaptor) {}
 
   295       OutArcIt& operator++() {
 
   296         _adaptor->nextOut(*this);
 
   303     class InArcIt : public Arc {
 
   304       const Adaptor* _adaptor;
 
   309       InArcIt(Invalid i) : Arc(i) { }
 
   311       InArcIt(const Adaptor& adaptor, const Node& node)
 
   312         : _adaptor(&adaptor) {
 
   313         _adaptor->firstIn(*this, node);
 
   316       InArcIt(const Adaptor& adaptor, const Arc& arc) :
 
   317         Arc(arc), _adaptor(&adaptor) {}
 
   319       InArcIt& operator++() {
 
   320         _adaptor->nextIn(*this);
 
   326     class EdgeIt : public Parent::Edge {
 
   327       const Adaptor* _adaptor;
 
   332       EdgeIt(Invalid i) : Edge(i) { }
 
   334       explicit EdgeIt(const Adaptor& adaptor) : _adaptor(&adaptor) {
 
   335         _adaptor->first(static_cast<Edge&>(*this));
 
   338       EdgeIt(const Adaptor& adaptor, const Edge& e) :
 
   339         Edge(e), _adaptor(&adaptor) { }
 
   341       EdgeIt& operator++() {
 
   342         _adaptor->next(*this);
 
   348     class IncEdgeIt : public Edge {
 
   349       friend class GraphAdaptorExtender;
 
   350       const Adaptor* _adaptor;
 
   356       IncEdgeIt(Invalid i) : Edge(i), direction(false) { }
 
   358       IncEdgeIt(const Adaptor& adaptor, const Node &n) : _adaptor(&adaptor) {
 
   359         _adaptor->firstInc(static_cast<Edge&>(*this), direction, n);
 
   362       IncEdgeIt(const Adaptor& adaptor, const Edge &e, const Node &n)
 
   363         : _adaptor(&adaptor), Edge(e) {
 
   364         direction = (_adaptor->u(e) == n);
 
   367       IncEdgeIt& operator++() {
 
   368         _adaptor->nextInc(*this, direction);
 
   373     Node baseNode(const OutArcIt &a) const {
 
   374       return Parent::source(a);
 
   376     Node runningNode(const OutArcIt &a) const {
 
   377       return Parent::target(a);
 
   380     Node baseNode(const InArcIt &a) const {
 
   381       return Parent::target(a);
 
   383     Node runningNode(const InArcIt &a) const {
 
   384       return Parent::source(a);
 
   387     Node baseNode(const IncEdgeIt &e) const {
 
   388       return e.direction ? Parent::u(e) : Parent::v(e);
 
   390     Node runningNode(const IncEdgeIt &e) const {
 
   391       return e.direction ? Parent::v(e) : Parent::u(e);