COIN-OR::LEMON - Graph Library

source: lemon-main/lemon/bits/graph_extender.h @ 1019:4c89e925cfe2

Last change on this file since 1019:4c89e925cfe2 was 1019:4c89e925cfe2, checked in by Balazs Dezso <deba@…>, 13 years ago

SmartBpGraph? implementation (#69)

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