COIN-OR::LEMON - Graph Library

source: lemon/lemon/bits/graph_extender.h @ 1194:699c7eac2c6d

Last change on this file since 1194:699c7eac2c6d was 1194:699c7eac2c6d, checked in by Balazs Dezso <deba@…>, 12 years ago

Renamings in BpGraphs? (#69)

File size: 31.3 KB
RevLine 
[209]1/* -*- mode: C++; indent-tabs-mode: nil; -*-
[57]2 *
[209]3 * This file is a part of LEMON, a generic C++ optimization library.
[57]4 *
[463]5 * Copyright (C) 2003-2009
[57]6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
8 *
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.
12 *
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
15 * purpose.
16 *
17 */
18
19#ifndef LEMON_BITS_GRAPH_EXTENDER_H
20#define LEMON_BITS_GRAPH_EXTENDER_H
21
[220]22#include <lemon/core.h>
[57]23
24#include <lemon/bits/map_extender.h>
25#include <lemon/bits/default_map.h>
26
27#include <lemon/concept_check.h>
28#include <lemon/concepts/maps.h>
29
[314]30//\ingroup graphbits
31//\file
[373]32//\brief Extenders for the graph types
[57]33namespace lemon {
34
[314]35  // \ingroup graphbits
36  //
[373]37  // \brief Extender for the digraph implementations
[57]38  template <typename Base>
39  class DigraphExtender : public Base {
[664]40    typedef Base Parent;
41
[57]42  public:
43
44    typedef DigraphExtender Digraph;
45
46    // Base extensions
47
48    typedef typename Parent::Node Node;
49    typedef typename Parent::Arc Arc;
50
51    int maxId(Node) const {
52      return Parent::maxNodeId();
53    }
54
55    int maxId(Arc) const {
56      return Parent::maxArcId();
57    }
58
[825]59    static Node fromId(int id, Node) {
[57]60      return Parent::nodeFromId(id);
61    }
62
[825]63    static Arc fromId(int id, Arc) {
[57]64      return Parent::arcFromId(id);
65    }
66
[78]67    Node oppositeNode(const Node &node, const Arc &arc) const {
68      if (node == Parent::source(arc))
[209]69        return Parent::target(arc);
[78]70      else if(node == Parent::target(arc))
[209]71        return Parent::source(arc);
[57]72      else
[209]73        return INVALID;
[57]74    }
75
76    // Alterable extension
77
78    typedef AlterationNotifier<DigraphExtender, Node> NodeNotifier;
79    typedef AlterationNotifier<DigraphExtender, Arc> ArcNotifier;
80
81
82  protected:
83
84    mutable NodeNotifier node_notifier;
85    mutable ArcNotifier arc_notifier;
86
87  public:
88
89    NodeNotifier& notifier(Node) const {
90      return node_notifier;
91    }
[209]92
[57]93    ArcNotifier& notifier(Arc) const {
94      return arc_notifier;
95    }
96
[209]97    class NodeIt : public Node {
[78]98      const Digraph* _digraph;
[57]99    public:
100
101      NodeIt() {}
102
103      NodeIt(Invalid i) : Node(i) { }
104
[78]105      explicit NodeIt(const Digraph& digraph) : _digraph(&digraph) {
[209]106        _digraph->first(static_cast<Node&>(*this));
[57]107      }
108
[209]109      NodeIt(const Digraph& digraph, const Node& node)
110        : Node(node), _digraph(&digraph) {}
[57]111
[209]112      NodeIt& operator++() {
113        _digraph->next(*this);
114        return *this;
[57]115      }
116
117    };
118
119
[209]120    class ArcIt : public Arc {
[78]121      const Digraph* _digraph;
[57]122    public:
123
124      ArcIt() { }
125
126      ArcIt(Invalid i) : Arc(i) { }
127
[78]128      explicit ArcIt(const Digraph& digraph) : _digraph(&digraph) {
[209]129        _digraph->first(static_cast<Arc&>(*this));
[57]130      }
131
[209]132      ArcIt(const Digraph& digraph, const Arc& arc) :
133        Arc(arc), _digraph(&digraph) { }
[57]134
[209]135      ArcIt& operator++() {
136        _digraph->next(*this);
137        return *this;
[57]138      }
139
140    };
141
142
[209]143    class OutArcIt : public Arc {
[78]144      const Digraph* _digraph;
[57]145    public:
146
147      OutArcIt() { }
148
149      OutArcIt(Invalid i) : Arc(i) { }
150
[209]151      OutArcIt(const Digraph& digraph, const Node& node)
152        : _digraph(&digraph) {
153        _digraph->firstOut(*this, node);
[57]154      }
155
[209]156      OutArcIt(const Digraph& digraph, const Arc& arc)
157        : Arc(arc), _digraph(&digraph) {}
[57]158
[209]159      OutArcIt& operator++() {
160        _digraph->nextOut(*this);
161        return *this;
[57]162      }
163
164    };
165
166
[209]167    class InArcIt : public Arc {
[78]168      const Digraph* _digraph;
[57]169    public:
170
171      InArcIt() { }
172
173      InArcIt(Invalid i) : Arc(i) { }
174
[209]175      InArcIt(const Digraph& digraph, const Node& node)
176        : _digraph(&digraph) {
177        _digraph->firstIn(*this, node);
[57]178      }
179
[209]180      InArcIt(const Digraph& digraph, const Arc& arc) :
181        Arc(arc), _digraph(&digraph) {}
[57]182
[209]183      InArcIt& operator++() {
184        _digraph->nextIn(*this);
185        return *this;
[57]186      }
187
188    };
189
[314]190    // \brief Base node of the iterator
191    //
192    // Returns the base node (i.e. the source in this case) of the iterator
[78]193    Node baseNode(const OutArcIt &arc) const {
194      return Parent::source(arc);
[57]195    }
[314]196    // \brief Running node of the iterator
197    //
198    // Returns the running node (i.e. the target in this case) of the
199    // iterator
[78]200    Node runningNode(const OutArcIt &arc) const {
201      return Parent::target(arc);
[57]202    }
203
[314]204    // \brief Base node of the iterator
205    //
206    // Returns the base node (i.e. the target in this case) of the iterator
[78]207    Node baseNode(const InArcIt &arc) const {
208      return Parent::target(arc);
[57]209    }
[314]210    // \brief Running node of the iterator
211    //
212    // Returns the running node (i.e. the source in this case) of the
213    // iterator
[78]214    Node runningNode(const InArcIt &arc) const {
215      return Parent::source(arc);
[57]216    }
217
[209]218
[57]219    template <typename _Value>
[209]220    class NodeMap
[57]221      : public MapExtender<DefaultMap<Digraph, Node, _Value> > {
222      typedef MapExtender<DefaultMap<Digraph, Node, _Value> > Parent;
223
[664]224    public:
[209]225      explicit NodeMap(const Digraph& digraph)
226        : Parent(digraph) {}
227      NodeMap(const Digraph& digraph, const _Value& value)
228        : Parent(digraph, value) {}
[57]229
[263]230    private:
[57]231      NodeMap& operator=(const NodeMap& cmap) {
[209]232        return operator=<NodeMap>(cmap);
[57]233      }
234
235      template <typename CMap>
236      NodeMap& operator=(const CMap& cmap) {
237        Parent::operator=(cmap);
[209]238        return *this;
[57]239      }
240
241    };
242
243    template <typename _Value>
[209]244    class ArcMap
[57]245      : public MapExtender<DefaultMap<Digraph, Arc, _Value> > {
246      typedef MapExtender<DefaultMap<Digraph, Arc, _Value> > Parent;
247
[664]248    public:
[209]249      explicit ArcMap(const Digraph& digraph)
250        : Parent(digraph) {}
251      ArcMap(const Digraph& digraph, const _Value& value)
252        : Parent(digraph, value) {}
[57]253
[263]254    private:
[57]255      ArcMap& operator=(const ArcMap& cmap) {
[209]256        return operator=<ArcMap>(cmap);
[57]257      }
258
259      template <typename CMap>
260      ArcMap& operator=(const CMap& cmap) {
261        Parent::operator=(cmap);
[209]262        return *this;
[57]263      }
264    };
265
266
267    Node addNode() {
268      Node node = Parent::addNode();
269      notifier(Node()).add(node);
270      return node;
271    }
[209]272
[57]273    Arc addArc(const Node& from, const Node& to) {
274      Arc arc = Parent::addArc(from, to);
275      notifier(Arc()).add(arc);
276      return arc;
277    }
278
279    void clear() {
280      notifier(Arc()).clear();
281      notifier(Node()).clear();
282      Parent::clear();
283    }
284
285    template <typename Digraph, typename NodeRefMap, typename ArcRefMap>
286    void build(const Digraph& digraph, NodeRefMap& nodeRef, ArcRefMap& arcRef) {
287      Parent::build(digraph, nodeRef, arcRef);
288      notifier(Node()).build();
289      notifier(Arc()).build();
290    }
291
292    void erase(const Node& node) {
293      Arc arc;
294      Parent::firstOut(arc, node);
295      while (arc != INVALID ) {
[209]296        erase(arc);
297        Parent::firstOut(arc, node);
298      }
[57]299
300      Parent::firstIn(arc, node);
301      while (arc != INVALID ) {
[209]302        erase(arc);
303        Parent::firstIn(arc, node);
[57]304      }
305
306      notifier(Node()).erase(node);
307      Parent::erase(node);
308    }
[209]309
[57]310    void erase(const Arc& arc) {
311      notifier(Arc()).erase(arc);
312      Parent::erase(arc);
313    }
314
315    DigraphExtender() {
316      node_notifier.setContainer(*this);
317      arc_notifier.setContainer(*this);
[209]318    }
319
[57]320
321    ~DigraphExtender() {
322      arc_notifier.clear();
323      node_notifier.clear();
324    }
325  };
326
[314]327  // \ingroup _graphbits
328  //
329  // \brief Extender for the Graphs
[209]330  template <typename Base>
[57]331  class GraphExtender : public Base {
[664]332    typedef Base Parent;
333
[57]334  public:
[209]335
[78]336    typedef GraphExtender Graph;
[57]337
[77]338    typedef True UndirectedTag;
339
[57]340    typedef typename Parent::Node Node;
341    typedef typename Parent::Arc Arc;
342    typedef typename Parent::Edge Edge;
343
[209]344    // Graph extension
[57]345
346    int maxId(Node) const {
347      return Parent::maxNodeId();
348    }
349
350    int maxId(Arc) const {
351      return Parent::maxArcId();
352    }
353
354    int maxId(Edge) const {
355      return Parent::maxEdgeId();
356    }
357
[825]358    static Node fromId(int id, Node) {
[57]359      return Parent::nodeFromId(id);
360    }
361
[825]362    static Arc fromId(int id, Arc) {
[57]363      return Parent::arcFromId(id);
364    }
365
[825]366    static Edge fromId(int id, Edge) {
[57]367      return Parent::edgeFromId(id);
368    }
369
370    Node oppositeNode(const Node &n, const Edge &e) const {
[125]371      if( n == Parent::u(e))
[209]372        return Parent::v(e);
[125]373      else if( n == Parent::v(e))
[209]374        return Parent::u(e);
[57]375      else
[209]376        return INVALID;
[57]377    }
378
[78]379    Arc oppositeArc(const Arc &arc) const {
380      return Parent::direct(arc, !Parent::direction(arc));
[57]381    }
382
383    using Parent::direct;
[78]384    Arc direct(const Edge &edge, const Node &node) const {
[125]385      return Parent::direct(edge, Parent::u(edge) == node);
[57]386    }
387
388    // Alterable extension
389
390    typedef AlterationNotifier<GraphExtender, Node> NodeNotifier;
391    typedef AlterationNotifier<GraphExtender, Arc> ArcNotifier;
392    typedef AlterationNotifier<GraphExtender, Edge> EdgeNotifier;
393
394
395  protected:
396
397    mutable NodeNotifier node_notifier;
398    mutable ArcNotifier arc_notifier;
399    mutable EdgeNotifier edge_notifier;
400
401  public:
402
403    NodeNotifier& notifier(Node) const {
404      return node_notifier;
405    }
[209]406
[57]407    ArcNotifier& notifier(Arc) const {
408      return arc_notifier;
409    }
410
411    EdgeNotifier& notifier(Edge) const {
412      return edge_notifier;
413    }
414
415
416
[209]417    class NodeIt : public Node {
[78]418      const Graph* _graph;
[57]419    public:
420
421      NodeIt() {}
422
423      NodeIt(Invalid i) : Node(i) { }
424
[78]425      explicit NodeIt(const Graph& graph) : _graph(&graph) {
[209]426        _graph->first(static_cast<Node&>(*this));
[57]427      }
428
[209]429      NodeIt(const Graph& graph, const Node& node)
430        : Node(node), _graph(&graph) {}
[57]431
[209]432      NodeIt& operator++() {
433        _graph->next(*this);
434        return *this;
[57]435      }
436
437    };
438
439
[209]440    class ArcIt : public Arc {
[78]441      const Graph* _graph;
[57]442    public:
443
444      ArcIt() { }
445
446      ArcIt(Invalid i) : Arc(i) { }
447
[78]448      explicit ArcIt(const Graph& graph) : _graph(&graph) {
[209]449        _graph->first(static_cast<Arc&>(*this));
[57]450      }
451
[209]452      ArcIt(const Graph& graph, const Arc& arc) :
453        Arc(arc), _graph(&graph) { }
[57]454
[209]455      ArcIt& operator++() {
456        _graph->next(*this);
457        return *this;
[57]458      }
459
460    };
461
462
[209]463    class OutArcIt : public Arc {
[78]464      const Graph* _graph;
[57]465    public:
466
467      OutArcIt() { }
468
469      OutArcIt(Invalid i) : Arc(i) { }
470
[209]471      OutArcIt(const Graph& graph, const Node& node)
472        : _graph(&graph) {
473        _graph->firstOut(*this, node);
[57]474      }
475
[209]476      OutArcIt(const Graph& graph, const Arc& arc)
477        : Arc(arc), _graph(&graph) {}
[57]478
[209]479      OutArcIt& operator++() {
480        _graph->nextOut(*this);
481        return *this;
[57]482      }
483
484    };
485
486
[209]487    class InArcIt : public Arc {
[78]488      const Graph* _graph;
[57]489    public:
490
491      InArcIt() { }
492
493      InArcIt(Invalid i) : Arc(i) { }
494
[209]495      InArcIt(const Graph& graph, const Node& node)
496        : _graph(&graph) {
497        _graph->firstIn(*this, node);
[57]498      }
499
[209]500      InArcIt(const Graph& graph, const Arc& arc) :
501        Arc(arc), _graph(&graph) {}
[57]502
[209]503      InArcIt& operator++() {
504        _graph->nextIn(*this);
505        return *this;
[57]506      }
507
508    };
509
510
[209]511    class EdgeIt : public Parent::Edge {
[78]512      const Graph* _graph;
[57]513    public:
514
515      EdgeIt() { }
516
517      EdgeIt(Invalid i) : Edge(i) { }
518
[78]519      explicit EdgeIt(const Graph& graph) : _graph(&graph) {
[209]520        _graph->first(static_cast<Edge&>(*this));
[57]521      }
522
[209]523      EdgeIt(const Graph& graph, const Edge& edge) :
524        Edge(edge), _graph(&graph) { }
[57]525
[209]526      EdgeIt& operator++() {
527        _graph->next(*this);
528        return *this;
[57]529      }
530
531    };
532
[78]533    class IncEdgeIt : public Parent::Edge {
[57]534      friend class GraphExtender;
[78]535      const Graph* _graph;
536      bool _direction;
[57]537    public:
538
[78]539      IncEdgeIt() { }
[57]540
[78]541      IncEdgeIt(Invalid i) : Edge(i), _direction(false) { }
[57]542
[78]543      IncEdgeIt(const Graph& graph, const Node &node) : _graph(&graph) {
[209]544        _graph->firstInc(*this, _direction, node);
[57]545      }
546
[78]547      IncEdgeIt(const Graph& graph, const Edge &edge, const Node &node)
[209]548        : _graph(&graph), Edge(edge) {
549        _direction = (_graph->source(edge) == node);
[57]550      }
551
[78]552      IncEdgeIt& operator++() {
[209]553        _graph->nextInc(*this, _direction);
554        return *this;
[57]555      }
556    };
557
[314]558    // \brief Base node of the iterator
559    //
560    // Returns the base node (ie. the source in this case) of the iterator
[78]561    Node baseNode(const OutArcIt &arc) const {
562      return Parent::source(static_cast<const Arc&>(arc));
[57]563    }
[314]564    // \brief Running node of the iterator
565    //
566    // Returns the running node (ie. the target in this case) of the
567    // iterator
[78]568    Node runningNode(const OutArcIt &arc) const {
569      return Parent::target(static_cast<const Arc&>(arc));
[57]570    }
571
[314]572    // \brief Base node of the iterator
573    //
574    // Returns the base node (ie. the target in this case) of the iterator
[78]575    Node baseNode(const InArcIt &arc) const {
576      return Parent::target(static_cast<const Arc&>(arc));
[57]577    }
[314]578    // \brief Running node of the iterator
579    //
580    // Returns the running node (ie. the source in this case) of the
581    // iterator
[78]582    Node runningNode(const InArcIt &arc) const {
583      return Parent::source(static_cast<const Arc&>(arc));
[57]584    }
585
[314]586    // Base node of the iterator
587    //
588    // Returns the base node of the iterator
[78]589    Node baseNode(const IncEdgeIt &edge) const {
[1157]590      return edge._direction ? this->u(edge) : this->v(edge);
[57]591    }
[314]592    // Running node of the iterator
593    //
594    // Returns the running node of the iterator
[78]595    Node runningNode(const IncEdgeIt &edge) const {
[1157]596      return edge._direction ? this->v(edge) : this->u(edge);
[57]597    }
598
599    // Mappable extension
600
601    template <typename _Value>
[209]602    class NodeMap
[78]603      : public MapExtender<DefaultMap<Graph, Node, _Value> > {
604      typedef MapExtender<DefaultMap<Graph, Node, _Value> > Parent;
[57]605
[664]606    public:
[732]607      explicit NodeMap(const Graph& graph)
[209]608        : Parent(graph) {}
609      NodeMap(const Graph& graph, const _Value& value)
610        : Parent(graph, value) {}
[57]611
[263]612    private:
[57]613      NodeMap& operator=(const NodeMap& cmap) {
[209]614        return operator=<NodeMap>(cmap);
[57]615      }
616
617      template <typename CMap>
618      NodeMap& operator=(const CMap& cmap) {
619        Parent::operator=(cmap);
[209]620        return *this;
[57]621      }
622
623    };
624
625    template <typename _Value>
[209]626    class ArcMap
[78]627      : public MapExtender<DefaultMap<Graph, Arc, _Value> > {
628      typedef MapExtender<DefaultMap<Graph, Arc, _Value> > Parent;
[57]629
[664]630    public:
[732]631      explicit ArcMap(const Graph& graph)
[209]632        : Parent(graph) {}
633      ArcMap(const Graph& graph, const _Value& value)
634        : Parent(graph, value) {}
[57]635
[263]636    private:
[57]637      ArcMap& operator=(const ArcMap& cmap) {
[209]638        return operator=<ArcMap>(cmap);
[57]639      }
640
641      template <typename CMap>
642      ArcMap& operator=(const CMap& cmap) {
643        Parent::operator=(cmap);
[209]644        return *this;
[57]645      }
646    };
647
648
649    template <typename _Value>
[209]650    class EdgeMap
[78]651      : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
652      typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
[57]653
[664]654    public:
[732]655      explicit EdgeMap(const Graph& graph)
[209]656        : Parent(graph) {}
[57]657
[209]658      EdgeMap(const Graph& graph, const _Value& value)
659        : Parent(graph, value) {}
[57]660
[263]661    private:
[57]662      EdgeMap& operator=(const EdgeMap& cmap) {
[209]663        return operator=<EdgeMap>(cmap);
[57]664      }
665
666      template <typename CMap>
667      EdgeMap& operator=(const CMap& cmap) {
668        Parent::operator=(cmap);
[209]669        return *this;
[57]670      }
671
672    };
673
674    // Alteration extension
675
676    Node addNode() {
677      Node node = Parent::addNode();
678      notifier(Node()).add(node);
679      return node;
680    }
681
682    Edge addEdge(const Node& from, const Node& to) {
683      Edge edge = Parent::addEdge(from, to);
684      notifier(Edge()).add(edge);
685      std::vector<Arc> ev;
686      ev.push_back(Parent::direct(edge, true));
[209]687      ev.push_back(Parent::direct(edge, false));
[57]688      notifier(Arc()).add(ev);
689      return edge;
690    }
[209]691
[57]692    void clear() {
693      notifier(Arc()).clear();
694      notifier(Edge()).clear();
695      notifier(Node()).clear();
696      Parent::clear();
697    }
698
[78]699    template <typename Graph, typename NodeRefMap, typename EdgeRefMap>
[209]700    void build(const Graph& graph, NodeRefMap& nodeRef,
[57]701               EdgeRefMap& edgeRef) {
[78]702      Parent::build(graph, nodeRef, edgeRef);
[57]703      notifier(Node()).build();
704      notifier(Edge()).build();
705      notifier(Arc()).build();
706    }
707
708    void erase(const Node& node) {
709      Arc arc;
710      Parent::firstOut(arc, node);
711      while (arc != INVALID ) {
[209]712        erase(arc);
713        Parent::firstOut(arc, node);
714      }
[57]715
716      Parent::firstIn(arc, node);
717      while (arc != INVALID ) {
[209]718        erase(arc);
719        Parent::firstIn(arc, node);
[57]720      }
721
722      notifier(Node()).erase(node);
723      Parent::erase(node);
724    }
725
726    void erase(const Edge& edge) {
[78]727      std::vector<Arc> av;
728      av.push_back(Parent::direct(edge, true));
[209]729      av.push_back(Parent::direct(edge, false));
[78]730      notifier(Arc()).erase(av);
[57]731      notifier(Edge()).erase(edge);
732      Parent::erase(edge);
733    }
734
735    GraphExtender() {
[209]736      node_notifier.setContainer(*this);
[57]737      arc_notifier.setContainer(*this);
738      edge_notifier.setContainer(*this);
[209]739    }
[57]740
741    ~GraphExtender() {
742      edge_notifier.clear();
743      arc_notifier.clear();
[209]744      node_notifier.clear();
745    }
[57]746
747  };
748
[1187]749  // \ingroup _graphbits
750  //
751  // \brief Extender for the BpGraphs
752  template <typename Base>
753  class BpGraphExtender : public Base {
754    typedef Base Parent;
755
756  public:
757
758    typedef BpGraphExtender BpGraph;
759
760    typedef True UndirectedTag;
761
762    typedef typename Parent::Node Node;
[1193]763    typedef typename Parent::RedNode RedNode;
764    typedef typename Parent::BlueNode BlueNode;
[1187]765    typedef typename Parent::Arc Arc;
766    typedef typename Parent::Edge Edge;
767
768    // BpGraph extension
769
770    using Parent::first;
771    using Parent::next;
772    using Parent::id;
773
774    int maxId(Node) const {
775      return Parent::maxNodeId();
776    }
777
778    int maxId(RedNode) const {
779      return Parent::maxRedId();
780    }
781
782    int maxId(BlueNode) const {
783      return Parent::maxBlueId();
784    }
785
786    int maxId(Arc) const {
787      return Parent::maxArcId();
788    }
789
790    int maxId(Edge) const {
791      return Parent::maxEdgeId();
792    }
793
794    static Node fromId(int id, Node) {
795      return Parent::nodeFromId(id);
796    }
797
798    static Arc fromId(int id, Arc) {
799      return Parent::arcFromId(id);
800    }
801
802    static Edge fromId(int id, Edge) {
803      return Parent::edgeFromId(id);
804    }
805
[1188]806    Node u(Edge e) const { return this->redNode(e); }
807    Node v(Edge e) const { return this->blueNode(e); }
808
[1187]809    Node oppositeNode(const Node &n, const Edge &e) const {
[1188]810      if( n == u(e))
811        return v(e);
812      else if( n == v(e))
813        return u(e);
[1187]814      else
815        return INVALID;
816    }
817
818    Arc oppositeArc(const Arc &arc) const {
819      return Parent::direct(arc, !Parent::direction(arc));
820    }
821
822    using Parent::direct;
823    Arc direct(const Edge &edge, const Node &node) const {
[1188]824      return Parent::direct(edge, Parent::redNode(edge) == node);
[1187]825    }
826
[1193]827    RedNode asRedNode(const Node& node) const {
828      if (node == INVALID || Parent::blue(node)) {
829        return INVALID;
830      } else {
831        return Parent::asRedNodeUnsafe(node);
832      }
833    }
834
835    BlueNode asBlueNode(const Node& node) const {
836      if (node == INVALID || Parent::red(node)) {
837        return INVALID;
838      } else {
839        return Parent::asBlueNodeUnsafe(node);
840      }
841    }
842
843    std::pair<RedNode, BlueNode> asRedBlueNode(const Node& node) const {
844      if (node == INVALID) {
845        return std::make_pair(RedNode(INVALID), BlueNode(INVALID));
846      } else if (Parent::red(node)) {
847        return std::make_pair(Parent::asRedNodeUnsafe(node), BlueNode(INVALID));
848      } else {
849        return std::make_pair(RedNode(INVALID), Parent::asBlueNodeUnsafe(node));
850      }
851    }
852
[1187]853    // Alterable extension
854
855    typedef AlterationNotifier<BpGraphExtender, Node> NodeNotifier;
856    typedef AlterationNotifier<BpGraphExtender, RedNode> RedNodeNotifier;
857    typedef AlterationNotifier<BpGraphExtender, BlueNode> BlueNodeNotifier;
858    typedef AlterationNotifier<BpGraphExtender, Arc> ArcNotifier;
859    typedef AlterationNotifier<BpGraphExtender, Edge> EdgeNotifier;
860
861
862  protected:
863
864    mutable NodeNotifier node_notifier;
865    mutable RedNodeNotifier red_node_notifier;
866    mutable BlueNodeNotifier blue_node_notifier;
867    mutable ArcNotifier arc_notifier;
868    mutable EdgeNotifier edge_notifier;
869
870  public:
871
872    NodeNotifier& notifier(Node) const {
873      return node_notifier;
874    }
875
876    RedNodeNotifier& notifier(RedNode) const {
877      return red_node_notifier;
878    }
879
880    BlueNodeNotifier& notifier(BlueNode) const {
881      return blue_node_notifier;
882    }
883
884    ArcNotifier& notifier(Arc) const {
885      return arc_notifier;
886    }
887
888    EdgeNotifier& notifier(Edge) const {
889      return edge_notifier;
890    }
891
892
893
894    class NodeIt : public Node {
895      const BpGraph* _graph;
896    public:
897
898      NodeIt() {}
899
900      NodeIt(Invalid i) : Node(i) { }
901
902      explicit NodeIt(const BpGraph& graph) : _graph(&graph) {
903        _graph->first(static_cast<Node&>(*this));
904      }
905
906      NodeIt(const BpGraph& graph, const Node& node)
907        : Node(node), _graph(&graph) {}
908
909      NodeIt& operator++() {
910        _graph->next(*this);
911        return *this;
912      }
913
914    };
915
[1194]916    class RedNodeIt : public RedNode {
[1187]917      const BpGraph* _graph;
918    public:
919
[1194]920      RedNodeIt() {}
[1187]921
[1194]922      RedNodeIt(Invalid i) : RedNode(i) { }
[1187]923
[1194]924      explicit RedNodeIt(const BpGraph& graph) : _graph(&graph) {
[1193]925        _graph->first(static_cast<RedNode&>(*this));
[1187]926      }
927
[1194]928      RedNodeIt(const BpGraph& graph, const RedNode& node)
[1193]929        : RedNode(node), _graph(&graph) {}
[1187]930
[1194]931      RedNodeIt& operator++() {
[1193]932        _graph->next(static_cast<RedNode&>(*this));
[1187]933        return *this;
934      }
935
936    };
937
[1194]938    class BlueNodeIt : public BlueNode {
[1187]939      const BpGraph* _graph;
940    public:
941
[1194]942      BlueNodeIt() {}
[1187]943
[1194]944      BlueNodeIt(Invalid i) : BlueNode(i) { }
[1187]945
[1194]946      explicit BlueNodeIt(const BpGraph& graph) : _graph(&graph) {
[1193]947        _graph->first(static_cast<BlueNode&>(*this));
[1187]948      }
949
[1194]950      BlueNodeIt(const BpGraph& graph, const BlueNode& node)
[1193]951        : BlueNode(node), _graph(&graph) {}
[1187]952
[1194]953      BlueNodeIt& operator++() {
[1193]954        _graph->next(static_cast<BlueNode&>(*this));
[1187]955        return *this;
956      }
957
958    };
959
960
961    class ArcIt : public Arc {
962      const BpGraph* _graph;
963    public:
964
965      ArcIt() { }
966
967      ArcIt(Invalid i) : Arc(i) { }
968
969      explicit ArcIt(const BpGraph& graph) : _graph(&graph) {
970        _graph->first(static_cast<Arc&>(*this));
971      }
972
973      ArcIt(const BpGraph& graph, const Arc& arc) :
974        Arc(arc), _graph(&graph) { }
975
976      ArcIt& operator++() {
977        _graph->next(*this);
978        return *this;
979      }
980
981    };
982
983
984    class OutArcIt : public Arc {
985      const BpGraph* _graph;
986    public:
987
988      OutArcIt() { }
989
990      OutArcIt(Invalid i) : Arc(i) { }
991
992      OutArcIt(const BpGraph& graph, const Node& node)
993        : _graph(&graph) {
994        _graph->firstOut(*this, node);
995      }
996
997      OutArcIt(const BpGraph& graph, const Arc& arc)
998        : Arc(arc), _graph(&graph) {}
999
1000      OutArcIt& operator++() {
1001        _graph->nextOut(*this);
1002        return *this;
1003      }
1004
1005    };
1006
1007
1008    class InArcIt : public Arc {
1009      const BpGraph* _graph;
1010    public:
1011
1012      InArcIt() { }
1013
1014      InArcIt(Invalid i) : Arc(i) { }
1015
1016      InArcIt(const BpGraph& graph, const Node& node)
1017        : _graph(&graph) {
1018        _graph->firstIn(*this, node);
1019      }
1020
1021      InArcIt(const BpGraph& graph, const Arc& arc) :
1022        Arc(arc), _graph(&graph) {}
1023
1024      InArcIt& operator++() {
1025        _graph->nextIn(*this);
1026        return *this;
1027      }
1028
1029    };
1030
1031
1032    class EdgeIt : public Parent::Edge {
1033      const BpGraph* _graph;
1034    public:
1035
1036      EdgeIt() { }
1037
1038      EdgeIt(Invalid i) : Edge(i) { }
1039
1040      explicit EdgeIt(const BpGraph& graph) : _graph(&graph) {
1041        _graph->first(static_cast<Edge&>(*this));
1042      }
1043
1044      EdgeIt(const BpGraph& graph, const Edge& edge) :
1045        Edge(edge), _graph(&graph) { }
1046
1047      EdgeIt& operator++() {
1048        _graph->next(*this);
1049        return *this;
1050      }
1051
1052    };
1053
1054    class IncEdgeIt : public Parent::Edge {
1055      friend class BpGraphExtender;
1056      const BpGraph* _graph;
1057      bool _direction;
1058    public:
1059
1060      IncEdgeIt() { }
1061
1062      IncEdgeIt(Invalid i) : Edge(i), _direction(false) { }
1063
1064      IncEdgeIt(const BpGraph& graph, const Node &node) : _graph(&graph) {
1065        _graph->firstInc(*this, _direction, node);
1066      }
1067
1068      IncEdgeIt(const BpGraph& graph, const Edge &edge, const Node &node)
1069        : _graph(&graph), Edge(edge) {
1070        _direction = (_graph->source(edge) == node);
1071      }
1072
1073      IncEdgeIt& operator++() {
1074        _graph->nextInc(*this, _direction);
1075        return *this;
1076      }
1077    };
1078
1079    // \brief Base node of the iterator
1080    //
1081    // Returns the base node (ie. the source in this case) of the iterator
1082    Node baseNode(const OutArcIt &arc) const {
1083      return Parent::source(static_cast<const Arc&>(arc));
1084    }
1085    // \brief Running node of the iterator
1086    //
1087    // Returns the running node (ie. the target in this case) of the
1088    // iterator
1089    Node runningNode(const OutArcIt &arc) const {
1090      return Parent::target(static_cast<const Arc&>(arc));
1091    }
1092
1093    // \brief Base node of the iterator
1094    //
1095    // Returns the base node (ie. the target in this case) of the iterator
1096    Node baseNode(const InArcIt &arc) const {
1097      return Parent::target(static_cast<const Arc&>(arc));
1098    }
1099    // \brief Running node of the iterator
1100    //
1101    // Returns the running node (ie. the source in this case) of the
1102    // iterator
1103    Node runningNode(const InArcIt &arc) const {
1104      return Parent::source(static_cast<const Arc&>(arc));
1105    }
1106
1107    // Base node of the iterator
1108    //
1109    // Returns the base node of the iterator
1110    Node baseNode(const IncEdgeIt &edge) const {
1111      return edge._direction ? this->u(edge) : this->v(edge);
1112    }
1113    // Running node of the iterator
1114    //
1115    // Returns the running node of the iterator
1116    Node runningNode(const IncEdgeIt &edge) const {
1117      return edge._direction ? this->v(edge) : this->u(edge);
1118    }
1119
1120    // Mappable extension
1121
1122    template <typename _Value>
1123    class NodeMap
1124      : public MapExtender<DefaultMap<BpGraph, Node, _Value> > {
1125      typedef MapExtender<DefaultMap<BpGraph, Node, _Value> > Parent;
1126
1127    public:
1128      explicit NodeMap(const BpGraph& bpgraph)
1129        : Parent(bpgraph) {}
1130      NodeMap(const BpGraph& bpgraph, const _Value& value)
1131        : Parent(bpgraph, value) {}
1132
1133    private:
1134      NodeMap& operator=(const NodeMap& cmap) {
1135        return operator=<NodeMap>(cmap);
1136      }
1137
1138      template <typename CMap>
1139      NodeMap& operator=(const CMap& cmap) {
1140        Parent::operator=(cmap);
1141        return *this;
1142      }
1143
1144    };
1145
1146    template <typename _Value>
[1194]1147    class RedNodeMap
[1187]1148      : public MapExtender<DefaultMap<BpGraph, RedNode, _Value> > {
1149      typedef MapExtender<DefaultMap<BpGraph, RedNode, _Value> > Parent;
1150
1151    public:
[1194]1152      explicit RedNodeMap(const BpGraph& bpgraph)
[1187]1153        : Parent(bpgraph) {}
[1194]1154      RedNodeMap(const BpGraph& bpgraph, const _Value& value)
[1187]1155        : Parent(bpgraph, value) {}
1156
1157    private:
[1194]1158      RedNodeMap& operator=(const RedNodeMap& cmap) {
1159        return operator=<RedNodeMap>(cmap);
[1187]1160      }
1161
1162      template <typename CMap>
[1194]1163      RedNodeMap& operator=(const CMap& cmap) {
[1187]1164        Parent::operator=(cmap);
1165        return *this;
1166      }
1167
1168    };
1169
1170    template <typename _Value>
[1194]1171    class BlueNodeMap
[1187]1172      : public MapExtender<DefaultMap<BpGraph, BlueNode, _Value> > {
1173      typedef MapExtender<DefaultMap<BpGraph, BlueNode, _Value> > Parent;
1174
1175    public:
[1194]1176      explicit BlueNodeMap(const BpGraph& bpgraph)
[1187]1177        : Parent(bpgraph) {}
[1194]1178      BlueNodeMap(const BpGraph& bpgraph, const _Value& value)
[1187]1179        : Parent(bpgraph, value) {}
1180
1181    private:
[1194]1182      BlueNodeMap& operator=(const BlueNodeMap& cmap) {
1183        return operator=<BlueNodeMap>(cmap);
[1187]1184      }
1185
1186      template <typename CMap>
[1194]1187      BlueNodeMap& operator=(const CMap& cmap) {
[1187]1188        Parent::operator=(cmap);
1189        return *this;
1190      }
1191
1192    };
1193
1194    template <typename _Value>
1195    class ArcMap
1196      : public MapExtender<DefaultMap<BpGraph, Arc, _Value> > {
1197      typedef MapExtender<DefaultMap<BpGraph, Arc, _Value> > Parent;
1198
1199    public:
1200      explicit ArcMap(const BpGraph& graph)
1201        : Parent(graph) {}
1202      ArcMap(const BpGraph& graph, const _Value& value)
1203        : Parent(graph, value) {}
1204
1205    private:
1206      ArcMap& operator=(const ArcMap& cmap) {
1207        return operator=<ArcMap>(cmap);
1208      }
1209
1210      template <typename CMap>
1211      ArcMap& operator=(const CMap& cmap) {
1212        Parent::operator=(cmap);
1213        return *this;
1214      }
1215    };
1216
1217
1218    template <typename _Value>
1219    class EdgeMap
1220      : public MapExtender<DefaultMap<BpGraph, Edge, _Value> > {
1221      typedef MapExtender<DefaultMap<BpGraph, Edge, _Value> > Parent;
1222
1223    public:
1224      explicit EdgeMap(const BpGraph& graph)
1225        : Parent(graph) {}
1226
1227      EdgeMap(const BpGraph& graph, const _Value& value)
1228        : Parent(graph, value) {}
1229
1230    private:
1231      EdgeMap& operator=(const EdgeMap& cmap) {
1232        return operator=<EdgeMap>(cmap);
1233      }
1234
1235      template <typename CMap>
1236      EdgeMap& operator=(const CMap& cmap) {
1237        Parent::operator=(cmap);
1238        return *this;
1239      }
1240
1241    };
1242
1243    // Alteration extension
1244
[1193]1245    RedNode addRedNode() {
1246      RedNode node = Parent::addRedNode();
[1187]1247      notifier(RedNode()).add(node);
1248      notifier(Node()).add(node);
1249      return node;
1250    }
1251
[1193]1252    BlueNode addBlueNode() {
1253      BlueNode node = Parent::addBlueNode();
[1187]1254      notifier(BlueNode()).add(node);
1255      notifier(Node()).add(node);
1256      return node;
1257    }
1258
[1193]1259    Edge addEdge(const RedNode& from, const BlueNode& to) {
[1187]1260      Edge edge = Parent::addEdge(from, to);
1261      notifier(Edge()).add(edge);
1262      std::vector<Arc> av;
1263      av.push_back(Parent::direct(edge, true));
1264      av.push_back(Parent::direct(edge, false));
1265      notifier(Arc()).add(av);
1266      return edge;
1267    }
1268
1269    void clear() {
1270      notifier(Arc()).clear();
1271      notifier(Edge()).clear();
1272      notifier(Node()).clear();
1273      notifier(BlueNode()).clear();
1274      notifier(RedNode()).clear();
1275      Parent::clear();
1276    }
1277
1278    template <typename BpGraph, typename NodeRefMap, typename EdgeRefMap>
1279    void build(const BpGraph& graph, NodeRefMap& nodeRef,
1280               EdgeRefMap& edgeRef) {
1281      Parent::build(graph, nodeRef, edgeRef);
1282      notifier(RedNode()).build();
1283      notifier(BlueNode()).build();
1284      notifier(Node()).build();
1285      notifier(Edge()).build();
1286      notifier(Arc()).build();
1287    }
1288
1289    void erase(const Node& node) {
1290      Arc arc;
1291      Parent::firstOut(arc, node);
1292      while (arc != INVALID ) {
1293        erase(arc);
1294        Parent::firstOut(arc, node);
1295      }
1296
1297      Parent::firstIn(arc, node);
1298      while (arc != INVALID ) {
1299        erase(arc);
1300        Parent::firstIn(arc, node);
1301      }
1302
1303      if (Parent::red(node)) {
[1193]1304        notifier(RedNode()).erase(this->asRedNodeUnsafe(node));
[1187]1305      } else {
[1193]1306        notifier(BlueNode()).erase(this->asBlueNodeUnsafe(node));
[1187]1307      }
1308
1309      notifier(Node()).erase(node);
1310      Parent::erase(node);
1311    }
1312
1313    void erase(const Edge& edge) {
1314      std::vector<Arc> av;
1315      av.push_back(Parent::direct(edge, true));
1316      av.push_back(Parent::direct(edge, false));
1317      notifier(Arc()).erase(av);
1318      notifier(Edge()).erase(edge);
1319      Parent::erase(edge);
1320    }
1321
1322    BpGraphExtender() {
1323      red_node_notifier.setContainer(*this);
1324      blue_node_notifier.setContainer(*this);
1325      node_notifier.setContainer(*this);
1326      arc_notifier.setContainer(*this);
1327      edge_notifier.setContainer(*this);
1328    }
1329
1330    ~BpGraphExtender() {
1331      edge_notifier.clear();
1332      arc_notifier.clear();
1333      node_notifier.clear();
1334      blue_node_notifier.clear();
1335      red_node_notifier.clear();
1336    }
1337
1338  };
1339
[57]1340}
1341
1342#endif
Note: See TracBrowser for help on using the repository browser.