COIN-OR::LEMON - Graph Library

Ignore:
Timestamp:
04/03/06 11:45:23 (18 years ago)
Author:
Balazs Dezso
Branch:
default
Phase:
public
Convert:
svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@2670
Message:

Correcting the structure of the graph's and adaptor's map.
The template assign operators and map iterators can be used for adaptors also.

Some bugfix in the adaptors

New class SwapBpUGraphAdaptor which swaps the two nodeset of the graph.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • lemon/bits/graph_adaptor_extender.h

    r1996 r2031  
    3434  ///
    3535  /// \brief Extender for the GraphAdaptors
    36   template <typename Base>
    37   class GraphAdaptorExtender : public Base {
     36  template <typename _Graph>
     37  class GraphAdaptorExtender : public _Graph {
    3838  public:
    3939
    40     typedef Base Parent;
    41     typedef GraphAdaptorExtender Graph;
     40    typedef _Graph Parent;
     41    typedef _Graph Graph;
     42    typedef GraphAdaptorExtender Adaptor;
    4243
    4344    // Base extensions
     
    7273
    7374    class NodeIt : public Node {
    74       const Graph* graph;
     75      const Adaptor* graph;
    7576    public:
    7677
     
    7980      NodeIt(Invalid i) : Node(i) { }
    8081
    81       explicit NodeIt(const Graph& _graph) : graph(&_graph) {
    82         _graph.first(*static_cast<Node*>(this));
    83       }
    84 
    85       NodeIt(const Graph& _graph, const Node& node)
     82      explicit NodeIt(const Adaptor& _graph) : graph(&_graph) {
     83        _graph.first(static_cast<Node&>(*this));
     84      }
     85
     86      NodeIt(const Adaptor& _graph, const Node& node)
    8687        : Node(node), graph(&_graph) {}
    8788
     
    9596
    9697    class EdgeIt : public Edge {
    97       const Graph* graph;
     98      const Adaptor* graph;
    9899    public:
    99100
     
    102103      EdgeIt(Invalid i) : Edge(i) { }
    103104
    104       explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
    105         _graph.first(*static_cast<Edge*>(this));
    106       }
    107 
    108       EdgeIt(const Graph& _graph, const Edge& e) :
     105      explicit EdgeIt(const Adaptor& _graph) : graph(&_graph) {
     106        _graph.first(static_cast<Edge&>(*this));
     107      }
     108
     109      EdgeIt(const Adaptor& _graph, const Edge& e) :
    109110        Edge(e), graph(&_graph) { }
    110111
     
    118119
    119120    class OutEdgeIt : public Edge {
    120       const Graph* graph;
     121      const Adaptor* graph;
    121122    public:
    122123
     
    125126      OutEdgeIt(Invalid i) : Edge(i) { }
    126127
    127       OutEdgeIt(const Graph& _graph, const Node& node)
     128      OutEdgeIt(const Adaptor& _graph, const Node& node)
    128129        : graph(&_graph) {
    129130        _graph.firstOut(*this, node);
    130131      }
    131132
    132       OutEdgeIt(const Graph& _graph, const Edge& edge)
     133      OutEdgeIt(const Adaptor& _graph, const Edge& edge)
    133134        : Edge(edge), graph(&_graph) {}
    134135
     
    142143
    143144    class InEdgeIt : public Edge {
    144       const Graph* graph;
     145      const Adaptor* graph;
    145146    public:
    146147
     
    149150      InEdgeIt(Invalid i) : Edge(i) { }
    150151
    151       InEdgeIt(const Graph& _graph, const Node& node)
     152      InEdgeIt(const Adaptor& _graph, const Node& node)
    152153        : graph(&_graph) {
    153154        _graph.firstIn(*this, node);
    154155      }
    155156
    156       InEdgeIt(const Graph& _graph, const Edge& edge) :
     157      InEdgeIt(const Adaptor& _graph, const Edge& edge) :
    157158        Edge(edge), graph(&_graph) {}
    158159
     
    198199  ///
    199200  /// \brief Extender for the UGraphAdaptors
    200   template <typename Base>
    201   class UGraphAdaptorExtender : public Base {
     201  template <typename _UGraph>
     202  class UGraphAdaptorExtender : public _UGraph {
    202203  public:
    203204   
    204     typedef Base Parent;
    205     typedef UGraphAdaptorExtender Graph;
     205    typedef _UGraph Parent;
     206    typedef _UGraph UGraph;
     207    typedef UGraphAdaptorExtender Adaptor;
    206208
    207209    typedef typename Parent::Node Node;
     
    255257
    256258    class NodeIt : public Node {
    257       const Graph* graph;
     259      const Adaptor* graph;
    258260    public:
    259261
     
    262264      NodeIt(Invalid i) : Node(i) { }
    263265
    264       explicit NodeIt(const Graph& _graph) : graph(&_graph) {
    265         _graph.first(*static_cast<Node*>(this));
    266       }
    267 
    268       NodeIt(const Graph& _graph, const Node& node)
     266      explicit NodeIt(const Adaptor& _graph) : graph(&_graph) {
     267        _graph.first(static_cast<Node&>(*this));
     268      }
     269
     270      NodeIt(const Adaptor& _graph, const Node& node)
    269271        : Node(node), graph(&_graph) {}
    270272
     
    278280
    279281    class EdgeIt : public Edge {
    280       const Graph* graph;
     282      const Adaptor* graph;
    281283    public:
    282284
     
    285287      EdgeIt(Invalid i) : Edge(i) { }
    286288
    287       explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
    288         _graph.first(*static_cast<Edge*>(this));
    289       }
    290 
    291       EdgeIt(const Graph& _graph, const Edge& e) :
     289      explicit EdgeIt(const Adaptor& _graph) : graph(&_graph) {
     290        _graph.first(static_cast<Edge&>(*this));
     291      }
     292
     293      EdgeIt(const Adaptor& _graph, const Edge& e) :
    292294        Edge(e), graph(&_graph) { }
    293295
     
    301303
    302304    class OutEdgeIt : public Edge {
    303       const Graph* graph;
     305      const Adaptor* graph;
    304306    public:
    305307
     
    308310      OutEdgeIt(Invalid i) : Edge(i) { }
    309311
    310       OutEdgeIt(const Graph& _graph, const Node& node)
     312      OutEdgeIt(const Adaptor& _graph, const Node& node)
    311313        : graph(&_graph) {
    312314        _graph.firstOut(*this, node);
    313315      }
    314316
    315       OutEdgeIt(const Graph& _graph, const Edge& edge)
     317      OutEdgeIt(const Adaptor& _graph, const Edge& edge)
    316318        : Edge(edge), graph(&_graph) {}
    317319
     
    325327
    326328    class InEdgeIt : public Edge {
    327       const Graph* graph;
     329      const Adaptor* graph;
    328330    public:
    329331
     
    332334      InEdgeIt(Invalid i) : Edge(i) { }
    333335
    334       InEdgeIt(const Graph& _graph, const Node& node)
     336      InEdgeIt(const Adaptor& _graph, const Node& node)
    335337        : graph(&_graph) {
    336338        _graph.firstIn(*this, node);
    337339      }
    338340
    339       InEdgeIt(const Graph& _graph, const Edge& edge) :
     341      InEdgeIt(const Adaptor& _graph, const Edge& edge) :
    340342        Edge(edge), graph(&_graph) {}
    341343
     
    348350
    349351    class UEdgeIt : public Parent::UEdge {
    350       const Graph* graph;
     352      const Adaptor* graph;
    351353    public:
    352354
     
    355357      UEdgeIt(Invalid i) : UEdge(i) { }
    356358
    357       explicit UEdgeIt(const Graph& _graph) : graph(&_graph) {
    358         _graph.first(*static_cast<UEdge*>(this));
    359       }
    360 
    361       UEdgeIt(const Graph& _graph, const UEdge& e) :
     359      explicit UEdgeIt(const Adaptor& _graph) : graph(&_graph) {
     360        _graph.first(static_cast<UEdge&>(*this));
     361      }
     362
     363      UEdgeIt(const Adaptor& _graph, const UEdge& e) :
    362364        UEdge(e), graph(&_graph) { }
    363365
     
    371373    class IncEdgeIt : public Parent::UEdge {
    372374      friend class UGraphAdaptorExtender;
    373       const Graph* graph;
     375      const Adaptor* graph;
    374376      bool direction;
    375377    public:
     
    379381      IncEdgeIt(Invalid i) : UEdge(i), direction(false) { }
    380382
    381       IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
     383      IncEdgeIt(const Adaptor& _graph, const Node &n) : graph(&_graph) {
    382384        _graph.firstInc(static_cast<UEdge&>(*this), direction, n);
    383385      }
    384386
    385       IncEdgeIt(const Graph& _graph, const UEdge &ue, const Node &n)
     387      IncEdgeIt(const Adaptor& _graph, const UEdge &ue, const Node &n)
    386388        : graph(&_graph), UEdge(ue) {
    387389        direction = (_graph.source(ue) == n);
     
    437439  };
    438440
     441  /// \ingroup graphbits
     442  ///
     443  /// \brief Extender for the BpUGraphAdaptors
     444  template <typename Base>
     445  class BpUGraphAdaptorExtender : public Base {
     446  public:
     447    typedef Base Parent;
     448    typedef BpUGraphAdaptorExtender Graph;
     449
     450    typedef typename Parent::Node Node;
     451    typedef typename Parent::BNode BNode;
     452    typedef typename Parent::ANode ANode;
     453    typedef typename Parent::Edge Edge;
     454    typedef typename Parent::UEdge UEdge;
     455
     456    Node oppositeNode(const UEdge& edge, const Node& node) const {
     457      return source(edge) == node ?
     458        target(edge) : source(edge);
     459    }
     460
     461
     462    int maxId(Node) const {
     463      return Parent::maxNodeId();
     464    }
     465    int maxId(BNode) const {
     466      return Parent::maxBNodeId();
     467    }
     468    int maxId(ANode) const {
     469      return Parent::maxANodeId();
     470    }
     471    int maxId(Edge) const {
     472      return Parent::maxEdgeId();
     473    }
     474    int maxId(UEdge) const {
     475      return Parent::maxUEdgeId();
     476    }
     477
     478
     479    Node fromId(int id, Node) const {
     480      return Parent::nodeFromId(id);
     481    }
     482    ANode fromId(int id, ANode) const {
     483      return Parent::fromANodeId(id);
     484    }
     485    BNode fromId(int id, BNode) const {
     486      return Parent::fromBNodeId(id);
     487    }
     488    Edge fromId(int id, Edge) const {
     489      return Parent::edgeFromId(id);
     490    }
     491    UEdge fromId(int id, UEdge) const {
     492      return Parent::uEdgeFromId(id);
     493    } 
     494 
     495    class NodeIt : public Node {
     496      const Graph* graph;
     497    public:
     498   
     499      NodeIt() { }
     500   
     501      NodeIt(Invalid i) : Node(INVALID) { }
     502   
     503      explicit NodeIt(const Graph& _graph) : graph(&_graph) {
     504        graph->first(static_cast<Node&>(*this));
     505      }
     506
     507      NodeIt(const Graph& _graph, const Node& node)
     508        : Node(node), graph(&_graph) { }
     509   
     510      NodeIt& operator++() {
     511        graph->next(*this);
     512        return *this;
     513      }
     514
     515    };
     516
     517    class ANodeIt : public Node {
     518      friend class BpUGraphAdaptorExtender;
     519      const Graph* graph;
     520    public:
     521   
     522      ANodeIt() { }
     523   
     524      ANodeIt(Invalid i) : Node(INVALID) { }
     525   
     526      explicit ANodeIt(const Graph& _graph) : graph(&_graph) {
     527        graph->firstANode(static_cast<Node&>(*this));
     528      }
     529
     530      ANodeIt(const Graph& _graph, const Node& node)
     531        : Node(node), graph(&_graph) {}
     532   
     533      ANodeIt& operator++() {
     534        graph->nextANode(*this);
     535        return *this;
     536      }
     537    };
     538
     539    class BNodeIt : public Node {
     540      friend class BpUGraphAdaptorExtender;
     541      const Graph* graph;
     542    public:
     543   
     544      BNodeIt() { }
     545   
     546      BNodeIt(Invalid i) : Node(INVALID) { }
     547   
     548      explicit BNodeIt(const Graph& _graph) : graph(&_graph) {
     549        graph->firstBNode(static_cast<Node&>(*this));
     550      }
     551
     552      BNodeIt(const Graph& _graph, const Node& node)
     553        : Node(node), graph(&_graph) {}
     554   
     555      BNodeIt& operator++() {
     556        graph->nextBNode(*this);
     557        return *this;
     558      }
     559    };
     560
     561    class EdgeIt : public Edge {
     562      friend class BpUGraphAdaptorExtender;
     563      const Graph* graph;
     564    public:
     565   
     566      EdgeIt() { }
     567   
     568      EdgeIt(Invalid i) : Edge(INVALID) { }
     569   
     570      explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
     571        graph->first(static_cast<Edge&>(*this));
     572      }
     573
     574      EdgeIt(const Graph& _graph, const Edge& edge)
     575        : Edge(edge), graph(&_graph) { }
     576   
     577      EdgeIt& operator++() {
     578        graph->next(*this);
     579        return *this;
     580      }
     581
     582    };
     583
     584    class UEdgeIt : public UEdge {
     585      friend class BpUGraphAdaptorExtender;
     586      const Graph* graph;
     587    public:
     588   
     589      UEdgeIt() { }
     590   
     591      UEdgeIt(Invalid i) : UEdge(INVALID) { }
     592   
     593      explicit UEdgeIt(const Graph& _graph) : graph(&_graph) {
     594        graph->first(static_cast<UEdge&>(*this));
     595      }
     596
     597      UEdgeIt(const Graph& _graph, const UEdge& edge)
     598        : UEdge(edge), graph(&_graph) { }
     599   
     600      UEdgeIt& operator++() {
     601        graph->next(*this);
     602        return *this;
     603      }
     604    };
     605
     606    class OutEdgeIt : public Edge {
     607      friend class BpUGraphAdaptorExtender;
     608      const Graph* graph;
     609    public:
     610   
     611      OutEdgeIt() { }
     612   
     613      OutEdgeIt(Invalid i) : Edge(i) { }
     614   
     615      OutEdgeIt(const Graph& _graph, const Node& node)
     616        : graph(&_graph) {
     617        graph->firstOut(*this, node);
     618      }
     619   
     620      OutEdgeIt(const Graph& _graph, const Edge& edge)
     621        : Edge(edge), graph(&_graph) {}
     622   
     623      OutEdgeIt& operator++() {
     624        graph->nextOut(*this);
     625        return *this;
     626      }
     627
     628    };
     629
     630
     631    class InEdgeIt : public Edge {
     632      friend class BpUGraphAdaptorExtender;
     633      const Graph* graph;
     634    public:
     635   
     636      InEdgeIt() { }
     637   
     638      InEdgeIt(Invalid i) : Edge(i) { }
     639   
     640      InEdgeIt(const Graph& _graph, const Node& node)
     641        : graph(&_graph) {
     642        graph->firstIn(*this, node);
     643      }
     644   
     645      InEdgeIt(const Graph& _graph, const Edge& edge) :
     646        Edge(edge), graph(&_graph) {}
     647   
     648      InEdgeIt& operator++() {
     649        graph->nextIn(*this);
     650        return *this;
     651      }
     652
     653    };
     654 
     655    /// \brief Base node of the iterator
     656    ///
     657    /// Returns the base node (ie. the source in this case) of the iterator
     658    Node baseNode(const OutEdgeIt &e) const {
     659      return Parent::source((Edge&)e);
     660    }
     661    /// \brief Running node of the iterator
     662    ///
     663    /// Returns the running node (ie. the target in this case) of the
     664    /// iterator
     665    Node runningNode(const OutEdgeIt &e) const {
     666      return Parent::target((Edge&)e);
     667    }
     668 
     669    /// \brief Base node of the iterator
     670    ///
     671    /// Returns the base node (ie. the target in this case) of the iterator
     672    Node baseNode(const InEdgeIt &e) const {
     673      return Parent::target((Edge&)e);
     674    }
     675    /// \brief Running node of the iterator
     676    ///
     677    /// Returns the running node (ie. the source in this case) of the
     678    /// iterator
     679    Node runningNode(const InEdgeIt &e) const {
     680      return Parent::source((Edge&)e);
     681    }
     682 
     683    class IncEdgeIt : public Parent::UEdge {
     684      friend class BpUGraphAdaptorExtender;
     685      const Graph* graph;
     686      bool direction;
     687    public:
     688   
     689      IncEdgeIt() { }
     690   
     691      IncEdgeIt(Invalid i) : UEdge(i), direction(true) { }
     692   
     693      IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
     694        graph->firstInc(*this, direction, n);
     695      }
     696
     697      IncEdgeIt(const Graph& _graph, const UEdge &ue, const Node &n)
     698        : graph(&_graph), UEdge(ue) {
     699        direction = (graph->source(ue) == n);
     700      }
     701
     702      IncEdgeIt& operator++() {
     703        graph->nextInc(*this, direction);
     704        return *this;
     705      }
     706    };
     707 
     708
     709    /// Base node of the iterator
     710    ///
     711    /// Returns the base node of the iterator
     712    Node baseNode(const IncEdgeIt &e) const {
     713      return e.direction ? source(e) : target(e);
     714    }
     715
     716    /// Running node of the iterator
     717    ///
     718    /// Returns the running node of the iterator
     719    Node runningNode(const IncEdgeIt &e) const {
     720      return e.direction ? target(e) : source(e);
     721    }
     722
     723  };
     724
    439725
    440726}
Note: See TracChangeset for help on using the changeset viewer.