3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2006
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
9 * Permission to use, modify and distribute this software is granted
10 * provided that this copyright notice appears in all copies. For
11 * precise terms see the accompanying LICENSE file.
13 * This software is provided "AS IS" with no warranty of any kind,
14 * express or implied, and with no claim as to its suitability for any
19 #ifndef LEMON_BITS_GRAPH_EXTENDER_H
20 #define LEMON_BITS_GRAPH_EXTENDER_H
22 #include <lemon/bits/invalid.h>
23 #include <lemon/error.h>
25 #include <lemon/bits/default_map.h>
29 ///\brief Extenders for the graph types
32 /// \ingroup graphbits
34 /// \brief Extender for the Graphs
35 template <typename Base>
36 class GraphExtender : public Base {
40 typedef GraphExtender Graph;
44 typedef typename Parent::Node Node;
45 typedef typename Parent::Edge Edge;
47 int maxId(Node) const {
48 return Parent::maxNodeId();
51 int maxId(Edge) const {
52 return Parent::maxEdgeId();
55 Node fromId(int id, Node) const {
56 return Parent::nodeFromId(id);
59 Edge fromId(int id, Edge) const {
60 return Parent::edgeFromId(id);
63 Node oppositeNode(const Node &n, const Edge &e) const {
64 if (n == Parent::source(e))
65 return Parent::target(e);
66 else if(n==Parent::target(e))
67 return Parent::source(e);
72 // Alterable extension
74 typedef AlterationNotifier<Node> NodeNotifier;
75 typedef AlterationNotifier<Edge> EdgeNotifier;
80 mutable NodeNotifier node_notifier;
81 mutable EdgeNotifier edge_notifier;
85 NodeNotifier& getNotifier(Node) const {
89 EdgeNotifier& getNotifier(Edge) const {
93 class NodeIt : public Node {
99 NodeIt(Invalid i) : Node(i) { }
101 explicit NodeIt(const Graph& _graph) : graph(&_graph) {
102 _graph.first(*static_cast<Node*>(this));
105 NodeIt(const Graph& _graph, const Node& node)
106 : Node(node), graph(&_graph) {}
108 NodeIt& operator++() {
116 class EdgeIt : public Edge {
122 EdgeIt(Invalid i) : Edge(i) { }
124 explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
125 _graph.first(*static_cast<Edge*>(this));
128 EdgeIt(const Graph& _graph, const Edge& e) :
129 Edge(e), graph(&_graph) { }
131 EdgeIt& operator++() {
139 class OutEdgeIt : public Edge {
145 OutEdgeIt(Invalid i) : Edge(i) { }
147 OutEdgeIt(const Graph& _graph, const Node& node)
149 _graph.firstOut(*this, node);
152 OutEdgeIt(const Graph& _graph, const Edge& edge)
153 : Edge(edge), graph(&_graph) {}
155 OutEdgeIt& operator++() {
156 graph->nextOut(*this);
163 class InEdgeIt : public Edge {
169 InEdgeIt(Invalid i) : Edge(i) { }
171 InEdgeIt(const Graph& _graph, const Node& node)
173 _graph.firstIn(*this, node);
176 InEdgeIt(const Graph& _graph, const Edge& edge) :
177 Edge(edge), graph(&_graph) {}
179 InEdgeIt& operator++() {
180 graph->nextIn(*this);
186 /// \brief Base node of the iterator
188 /// Returns the base node (ie. the source in this case) of the iterator
189 Node baseNode(const OutEdgeIt &e) const {
190 return Parent::source(e);
192 /// \brief Running node of the iterator
194 /// Returns the running node (ie. the target in this case) of the
196 Node runningNode(const OutEdgeIt &e) const {
197 return Parent::target(e);
200 /// \brief Base node of the iterator
202 /// Returns the base node (ie. the target in this case) of the iterator
203 Node baseNode(const InEdgeIt &e) const {
204 return Parent::target(e);
206 /// \brief Running node of the iterator
208 /// Returns the running node (ie. the source in this case) of the
210 Node runningNode(const InEdgeIt &e) const {
211 return Parent::source(e);
215 template <typename _Value>
217 : public IterableMapExtender<DefaultMap<Graph, Node, _Value> > {
219 typedef GraphExtender Graph;
220 typedef IterableMapExtender<DefaultMap<Graph, Node, _Value> > Parent;
222 NodeMap(const Graph& _g)
224 NodeMap(const Graph& _g, const _Value& _v)
227 NodeMap& operator=(const NodeMap& cmap) {
228 return operator=<NodeMap>(cmap);
232 /// \brief Template assign operator.
234 /// The given parameter should be conform to the ReadMap
235 /// concecpt and could be indiced by the current item set of
236 /// the NodeMap. In this case the value for each item
237 /// is assigned by the value of the given ReadMap.
238 template <typename CMap>
239 NodeMap& operator=(const CMap& cmap) {
240 checkConcept<concept::ReadMap<Node, _Value>, CMap>();
241 const typename Parent::Graph* graph = Parent::getGraph();
243 for (graph->first(it); it != INVALID; graph->next(it)) {
244 Parent::set(it, cmap[it]);
251 template <typename _Value>
253 : public IterableMapExtender<DefaultMap<Graph, Edge, _Value> > {
255 typedef GraphExtender Graph;
256 typedef IterableMapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
258 EdgeMap(const Graph& _g)
260 EdgeMap(const Graph& _g, const _Value& _v)
263 EdgeMap& operator=(const EdgeMap& cmap) {
264 return operator=<EdgeMap>(cmap);
267 template <typename CMap>
268 EdgeMap& operator=(const CMap& cmap) {
269 checkConcept<concept::ReadMap<Edge, _Value>, CMap>();
270 const typename Parent::Graph* graph = Parent::getGraph();
272 for (graph->first(it); it != INVALID; graph->next(it)) {
273 Parent::set(it, cmap[it]);
281 Node node = Parent::addNode();
282 getNotifier(Node()).add(node);
286 Edge addEdge(const Node& from, const Node& to) {
287 Edge edge = Parent::addEdge(from, to);
288 getNotifier(Edge()).add(edge);
293 getNotifier(Edge()).clear();
294 getNotifier(Node()).clear();
299 void erase(const Node& node) {
301 Parent::firstOut(edge, node);
302 while (edge != INVALID ) {
304 Parent::firstOut(edge, node);
307 Parent::firstIn(edge, node);
308 while (edge != INVALID ) {
310 Parent::firstIn(edge, node);
313 getNotifier(Node()).erase(node);
317 void erase(const Edge& edge) {
318 getNotifier(Edge()).erase(edge);
324 getNotifier(Edge()).clear();
325 getNotifier(Node()).clear();
329 /// \ingroup graphbits
331 /// \brief BaseExtender for the UGraphs
332 template <typename Base>
333 class UGraphBaseExtender : public Base {
338 typedef typename Parent::Edge UEdge;
339 typedef typename Parent::Node Node;
341 typedef True UndirectedTag;
343 class Edge : public UEdge {
344 friend class UGraphBaseExtender;
349 Edge(const UEdge &ue, bool _forward) :
350 UEdge(ue), forward(_forward) {}
355 /// Invalid edge constructor
356 Edge(Invalid i) : UEdge(i), forward(true) {}
358 bool operator==(const Edge &that) const {
359 return forward==that.forward && UEdge(*this)==UEdge(that);
361 bool operator!=(const Edge &that) const {
362 return forward!=that.forward || UEdge(*this)!=UEdge(that);
364 bool operator<(const Edge &that) const {
365 return forward<that.forward ||
366 (!(that.forward<forward) && UEdge(*this)<UEdge(that));
372 using Parent::source;
374 /// Source of the given Edge.
375 Node source(const Edge &e) const {
376 return e.forward ? Parent::source(e) : Parent::target(e);
379 using Parent::target;
381 /// Target of the given Edge.
382 Node target(const Edge &e) const {
383 return e.forward ? Parent::target(e) : Parent::source(e);
386 /// \brief Directed edge from an undirected edge.
388 /// Returns a directed edge corresponding to the specified UEdge.
389 /// If the given bool is true the given undirected edge and the
390 /// returned edge have the same source node.
391 static Edge direct(const UEdge &ue, bool d) {
395 /// Returns whether the given directed edge is same orientation as the
396 /// corresponding undirected edge.
398 /// \todo reference to the corresponding point of the undirected graph
399 /// concept. "What does the direction of an undirected edge mean?"
400 static bool direction(const Edge &e) { return e.forward; }
406 void first(Edge &e) const {
411 void next(Edge &e) const {
421 void firstOut(Edge &e, const Node &n) const {
422 Parent::firstIn(e,n);
423 if( UEdge(e) != INVALID ) {
427 Parent::firstOut(e,n);
431 void nextOut(Edge &e) const {
433 Node n = Parent::target(e);
435 if( UEdge(e) == INVALID ) {
436 Parent::firstOut(e, n);
445 void firstIn(Edge &e, const Node &n) const {
446 Parent::firstOut(e,n);
447 if( UEdge(e) != INVALID ) {
451 Parent::firstIn(e,n);
455 void nextIn(Edge &e) const {
457 Node n = Parent::source(e);
459 if( UEdge(e) == INVALID ) {
460 Parent::firstIn(e, n);
469 void firstInc(UEdge &e, bool &d, const Node &n) const {
471 Parent::firstOut(e, n);
472 if (e != INVALID) return;
474 Parent::firstIn(e, n);
477 void nextInc(UEdge &e, bool &d) const {
479 Node s = Parent::source(e);
481 if (e != INVALID) return;
483 Parent::firstIn(e, s);
489 Node nodeFromId(int id) const {
490 return Parent::nodeFromId(id);
493 Edge edgeFromId(int id) const {
494 return direct(Parent::edgeFromId(id >> 1), bool(id & 1));
497 UEdge uEdgeFromId(int id) const {
498 return Parent::edgeFromId(id >> 1);
501 int id(const Node &n) const {
502 return Parent::id(n);
505 int id(const UEdge &e) const {
506 return Parent::id(e);
509 int id(const Edge &e) const {
510 return 2 * Parent::id(e) + int(e.forward);
513 int maxNodeId() const {
514 return Parent::maxNodeId();
517 int maxEdgeId() const {
518 return 2 * Parent::maxEdgeId() + 1;
521 int maxUEdgeId() const {
522 return Parent::maxEdgeId();
526 int edgeNum() const {
527 return 2 * Parent::edgeNum();
530 int uEdgeNum() const {
531 return Parent::edgeNum();
534 Edge findEdge(Node source, Node target, Edge prev) const {
535 if (prev == INVALID) {
536 UEdge edge = Parent::findEdge(source, target);
537 if (edge != INVALID) return direct(edge, true);
538 edge = Parent::findEdge(target, source);
539 if (edge != INVALID) return direct(edge, false);
540 } else if (direction(prev)) {
541 UEdge edge = Parent::findEdge(source, target, prev);
542 if (edge != INVALID) return direct(edge, true);
543 edge = Parent::findEdge(target, source);
544 if (edge != INVALID) return direct(edge, false);
546 UEdge edge = Parent::findEdge(target, source, prev);
547 if (edge != INVALID) return direct(edge, false);
552 UEdge findUEdge(Node source, Node target, UEdge prev) const {
553 if (prev == INVALID) {
554 UEdge edge = Parent::findEdge(source, target);
555 if (edge != INVALID) return edge;
556 edge = Parent::findEdge(target, source);
557 if (edge != INVALID) return edge;
558 } else if (Parent::source(prev) == source) {
559 UEdge edge = Parent::findEdge(source, target, prev);
560 if (edge != INVALID) return edge;
561 edge = Parent::findEdge(target, source);
562 if (edge != INVALID) return edge;
564 UEdge edge = Parent::findEdge(target, source, prev);
565 if (edge != INVALID) return edge;
572 /// \ingroup graphbits
574 /// \brief Extender for the UGraphs
575 template <typename Base>
576 class UGraphExtender : public Base {
580 typedef UGraphExtender Graph;
582 typedef typename Parent::Node Node;
583 typedef typename Parent::Edge Edge;
584 typedef typename Parent::UEdge UEdge;
588 int maxId(Node) const {
589 return Parent::maxNodeId();
592 int maxId(Edge) const {
593 return Parent::maxEdgeId();
596 int maxId(UEdge) const {
597 return Parent::maxUEdgeId();
600 Node fromId(int id, Node) const {
601 return Parent::nodeFromId(id);
604 Edge fromId(int id, Edge) const {
605 return Parent::edgeFromId(id);
608 UEdge fromId(int id, UEdge) const {
609 return Parent::uEdgeFromId(id);
612 Node oppositeNode(const Node &n, const UEdge &e) const {
613 if( n == Parent::source(e))
614 return Parent::target(e);
615 else if( n == Parent::target(e))
616 return Parent::source(e);
621 Edge oppositeEdge(const Edge &e) const {
622 return Parent::direct(e, !Parent::direction(e));
625 using Parent::direct;
626 Edge direct(const UEdge &ue, const Node &s) const {
627 return Parent::direct(ue, Parent::source(ue) == s);
630 // Alterable extension
632 typedef AlterationNotifier<Node> NodeNotifier;
633 typedef AlterationNotifier<Edge> EdgeNotifier;
634 typedef AlterationNotifier<UEdge> UEdgeNotifier;
639 mutable NodeNotifier node_notifier;
640 mutable EdgeNotifier edge_notifier;
641 mutable UEdgeNotifier uedge_notifier;
645 NodeNotifier& getNotifier(Node) const {
646 return node_notifier;
649 EdgeNotifier& getNotifier(Edge) const {
650 return edge_notifier;
653 UEdgeNotifier& getNotifier(UEdge) const {
654 return uedge_notifier;
659 class NodeIt : public Node {
665 NodeIt(Invalid i) : Node(i) { }
667 explicit NodeIt(const Graph& _graph) : graph(&_graph) {
668 _graph.first(*static_cast<Node*>(this));
671 NodeIt(const Graph& _graph, const Node& node)
672 : Node(node), graph(&_graph) {}
674 NodeIt& operator++() {
682 class EdgeIt : public Edge {
688 EdgeIt(Invalid i) : Edge(i) { }
690 explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
691 _graph.first(*static_cast<Edge*>(this));
694 EdgeIt(const Graph& _graph, const Edge& e) :
695 Edge(e), graph(&_graph) { }
697 EdgeIt& operator++() {
705 class OutEdgeIt : public Edge {
711 OutEdgeIt(Invalid i) : Edge(i) { }
713 OutEdgeIt(const Graph& _graph, const Node& node)
715 _graph.firstOut(*this, node);
718 OutEdgeIt(const Graph& _graph, const Edge& edge)
719 : Edge(edge), graph(&_graph) {}
721 OutEdgeIt& operator++() {
722 graph->nextOut(*this);
729 class InEdgeIt : public Edge {
735 InEdgeIt(Invalid i) : Edge(i) { }
737 InEdgeIt(const Graph& _graph, const Node& node)
739 _graph.firstIn(*this, node);
742 InEdgeIt(const Graph& _graph, const Edge& edge) :
743 Edge(edge), graph(&_graph) {}
745 InEdgeIt& operator++() {
746 graph->nextIn(*this);
753 class UEdgeIt : public Parent::UEdge {
759 UEdgeIt(Invalid i) : UEdge(i) { }
761 explicit UEdgeIt(const Graph& _graph) : graph(&_graph) {
762 _graph.first(*static_cast<UEdge*>(this));
765 UEdgeIt(const Graph& _graph, const UEdge& e) :
766 UEdge(e), graph(&_graph) { }
768 UEdgeIt& operator++() {
775 class IncEdgeIt : public Parent::UEdge {
776 friend class UGraphExtender;
783 IncEdgeIt(Invalid i) : UEdge(i), direction(false) { }
785 IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
786 _graph.firstInc(*this, direction, n);
789 IncEdgeIt(const Graph& _graph, const UEdge &ue, const Node &n)
790 : graph(&_graph), UEdge(ue) {
791 direction = (_graph.source(ue) == n);
794 IncEdgeIt& operator++() {
795 graph->nextInc(*this, direction);
800 /// \brief Base node of the iterator
802 /// Returns the base node (ie. the source in this case) of the iterator
803 Node baseNode(const OutEdgeIt &e) const {
804 return Parent::source((Edge)e);
806 /// \brief Running node of the iterator
808 /// Returns the running node (ie. the target in this case) of the
810 Node runningNode(const OutEdgeIt &e) const {
811 return Parent::target((Edge)e);
814 /// \brief Base node of the iterator
816 /// Returns the base node (ie. the target in this case) of the iterator
817 Node baseNode(const InEdgeIt &e) const {
818 return Parent::target((Edge)e);
820 /// \brief Running node of the iterator
822 /// Returns the running node (ie. the source in this case) of the
824 Node runningNode(const InEdgeIt &e) const {
825 return Parent::source((Edge)e);
828 /// Base node of the iterator
830 /// Returns the base node of the iterator
831 Node baseNode(const IncEdgeIt &e) const {
832 return e.direction ? source(e) : target(e);
834 /// Running node of the iterator
836 /// Returns the running node of the iterator
837 Node runningNode(const IncEdgeIt &e) const {
838 return e.direction ? target(e) : source(e);
841 // Mappable extension
843 template <typename _Value>
845 : public IterableMapExtender<DefaultMap<Graph, Node, _Value> > {
847 typedef UGraphExtender Graph;
848 typedef IterableMapExtender<DefaultMap<Graph, Node, _Value> > Parent;
850 NodeMap(const Graph& _g)
852 NodeMap(const Graph& _g, const _Value& _v)
855 NodeMap& operator=(const NodeMap& cmap) {
856 return operator=<NodeMap>(cmap);
860 /// \brief Template assign operator.
862 /// The given parameter should be conform to the ReadMap
863 /// concecpt and could be indiced by the current item set of
864 /// the NodeMap. In this case the value for each item
865 /// is assigned by the value of the given ReadMap.
866 template <typename CMap>
867 NodeMap& operator=(const CMap& cmap) {
868 checkConcept<concept::ReadMap<Node, _Value>, CMap>();
869 const typename Parent::Graph* graph = Parent::getGraph();
871 for (graph->first(it); it != INVALID; graph->next(it)) {
872 Parent::set(it, cmap[it]);
879 template <typename _Value>
881 : public IterableMapExtender<DefaultMap<Graph, Edge, _Value> > {
883 typedef UGraphExtender Graph;
884 typedef IterableMapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
886 EdgeMap(const Graph& _g)
888 EdgeMap(const Graph& _g, const _Value& _v)
891 EdgeMap& operator=(const EdgeMap& cmap) {
892 return operator=<EdgeMap>(cmap);
895 template <typename CMap>
896 EdgeMap& operator=(const CMap& cmap) {
897 checkConcept<concept::ReadMap<Edge, _Value>, CMap>();
898 const typename Parent::Graph* graph = Parent::getGraph();
900 for (graph->first(it); it != INVALID; graph->next(it)) {
901 Parent::set(it, cmap[it]);
908 template <typename _Value>
910 : public IterableMapExtender<DefaultMap<Graph, UEdge, _Value> > {
912 typedef UGraphExtender Graph;
913 typedef IterableMapExtender<DefaultMap<Graph, UEdge, _Value> > Parent;
915 UEdgeMap(const Graph& _g)
917 UEdgeMap(const Graph& _g, const _Value& _v)
920 UEdgeMap& operator=(const UEdgeMap& cmap) {
921 return operator=<UEdgeMap>(cmap);
924 template <typename CMap>
925 UEdgeMap& operator=(const CMap& cmap) {
926 checkConcept<concept::ReadMap<UEdge, _Value>, CMap>();
927 const typename Parent::Graph* graph = Parent::getGraph();
929 for (graph->first(it); it != INVALID; graph->next(it)) {
930 Parent::set(it, cmap[it]);
936 // Alteration extension
939 Node node = Parent::addNode();
940 getNotifier(Node()).add(node);
944 UEdge addEdge(const Node& from, const Node& to) {
945 UEdge uedge = Parent::addEdge(from, to);
946 getNotifier(UEdge()).add(uedge);
947 getNotifier(Edge()).add(Parent::direct(uedge, true));
948 getNotifier(Edge()).add(Parent::direct(uedge, false));
953 getNotifier(Edge()).clear();
954 getNotifier(UEdge()).clear();
955 getNotifier(Node()).clear();
959 void erase(const Node& node) {
961 Parent::firstOut(edge, node);
962 while (edge != INVALID ) {
964 Parent::firstOut(edge, node);
967 Parent::firstIn(edge, node);
968 while (edge != INVALID ) {
970 Parent::firstIn(edge, node);
973 getNotifier(Node()).erase(node);
977 void erase(const UEdge& uedge) {
978 getNotifier(Edge()).erase(Parent::direct(uedge, true));
979 getNotifier(Edge()).erase(Parent::direct(uedge, false));
980 getNotifier(UEdge()).erase(uedge);
981 Parent::erase(uedge);
985 getNotifier(Edge()).clear();
986 getNotifier(UEdge()).clear();
987 getNotifier(Node()).clear();
993 /// \ingroup graphbits
995 /// \brief BaseExtender for the BpUGraphs
996 template <typename Base>
997 class BpUGraphBaseExtender : public Base {
1000 typedef BpUGraphBaseExtender Graph;
1002 typedef typename Parent::Node Node;
1003 typedef typename Parent::Edge UEdge;
1006 using Parent::first;
1011 class ANode : public Node {
1012 friend class BpUGraphBaseExtender;
1015 ANode(const Node& node) : Node(node) {
1016 LEMON_ASSERT(Parent::aNode(node) || node == INVALID,
1017 typename Parent::NodeSetError());
1019 ANode(Invalid) : Node(INVALID) {}
1022 void first(ANode& node) const {
1023 Parent::firstANode(static_cast<Node&>(node));
1025 void next(ANode& node) const {
1026 Parent::nextANode(static_cast<Node&>(node));
1029 int id(const ANode& node) const {
1030 return Parent::aNodeId(node);
1033 class BNode : public Node {
1034 friend class BpUGraphBaseExtender;
1037 BNode(const Node& node) : Node(node) {
1038 LEMON_ASSERT(Parent::bNode(node) || node == INVALID,
1039 typename Parent::NodeSetError());
1041 BNode(Invalid) : Node(INVALID) {}
1044 void first(BNode& node) const {
1045 Parent::firstBNode(static_cast<Node&>(node));
1047 void next(BNode& node) const {
1048 Parent::nextBNode(static_cast<Node&>(node));
1051 int id(const BNode& node) const {
1052 return Parent::aNodeId(node);
1055 Node source(const UEdge& edge) const {
1058 Node target(const UEdge& edge) const {
1062 void firstInc(UEdge& edge, bool& direction, const Node& node) const {
1063 if (Parent::aNode(node)) {
1064 Parent::firstOut(edge, node);
1067 Parent::firstIn(edge, node);
1068 direction = static_cast<UEdge&>(edge) == INVALID;
1071 void nextInc(UEdge& edge, bool& direction) const {
1073 Parent::nextOut(edge);
1075 Parent::nextIn(edge);
1076 if (edge == INVALID) direction = true;
1080 int maxUEdgeId() const {
1081 return Parent::maxEdgeId();
1084 UEdge uEdgeFromId(int id) const {
1085 return Parent::edgeFromId(id);
1088 class Edge : public UEdge {
1089 friend class BpUGraphBaseExtender;
1093 Edge(const UEdge& edge, bool _forward)
1094 : UEdge(edge), forward(_forward) {}
1098 Edge (Invalid) : UEdge(INVALID), forward(true) {}
1099 bool operator==(const Edge& i) const {
1100 return UEdge::operator==(i) && forward == i.forward;
1102 bool operator!=(const Edge& i) const {
1103 return UEdge::operator!=(i) || forward != i.forward;
1105 bool operator<(const Edge& i) const {
1106 return UEdge::operator<(i) ||
1107 (!(i.forward<forward) && UEdge(*this)<UEdge(i));
1111 void first(Edge& edge) const {
1112 Parent::first(static_cast<UEdge&>(edge));
1113 edge.forward = true;
1116 void next(Edge& edge) const {
1117 if (!edge.forward) {
1118 Parent::next(static_cast<UEdge&>(edge));
1120 edge.forward = !edge.forward;
1123 void firstOut(Edge& edge, const Node& node) const {
1124 if (Parent::aNode(node)) {
1125 Parent::firstOut(edge, node);
1126 edge.forward = true;
1128 Parent::firstIn(edge, node);
1129 edge.forward = static_cast<UEdge&>(edge) == INVALID;
1132 void nextOut(Edge& edge) const {
1134 Parent::nextOut(edge);
1136 Parent::nextIn(edge);
1137 edge.forward = static_cast<UEdge&>(edge) == INVALID;
1141 void firstIn(Edge& edge, const Node& node) const {
1142 if (Parent::bNode(node)) {
1143 Parent::firstIn(edge, node);
1144 edge.forward = true;
1146 Parent::firstOut(edge, node);
1147 edge.forward = static_cast<UEdge&>(edge) == INVALID;
1150 void nextIn(Edge& edge) const {
1152 Parent::nextIn(edge);
1154 Parent::nextOut(edge);
1155 edge.forward = static_cast<UEdge&>(edge) == INVALID;
1159 Node source(const Edge& edge) const {
1160 return edge.forward ? Parent::aNode(edge) : Parent::bNode(edge);
1162 Node target(const Edge& edge) const {
1163 return edge.forward ? Parent::bNode(edge) : Parent::aNode(edge);
1166 int id(const Edge& edge) const {
1167 return (Parent::id(edge) << 1) + (edge.forward ? 0 : 1);
1169 Edge edgeFromId(int id) const {
1170 return Edge(Parent::fromId(id >> 1, UEdge()), (id & 1) == 0);
1172 int maxEdgeId() const {
1173 return (Parent::maxId(UEdge()) << 1) + 1;
1176 bool direction(const Edge& edge) const {
1177 return edge.forward;
1180 Edge direct(const UEdge& edge, bool direction) const {
1181 return Edge(edge, direction);
1185 /// \ingroup graphbits
1187 /// \brief Extender for the BpUGraphs
1188 template <typename Base>
1189 class BpUGraphExtender : public Base {
1191 typedef Base Parent;
1192 typedef BpUGraphExtender Graph;
1194 typedef typename Parent::Node Node;
1195 typedef typename Parent::BNode BNode;
1196 typedef typename Parent::ANode ANode;
1197 typedef typename Parent::Edge Edge;
1198 typedef typename Parent::UEdge UEdge;
1200 Node oppositeNode(const UEdge& edge, const Node& node) const {
1201 return source(edge) == node ?
1202 target(edge) : source(edge);
1205 using Parent::direct;
1206 Edge direct(const UEdge& edge, const Node& node) const {
1207 return Edge(edge, node == Parent::source(edge));
1210 Edge oppositeEdge(const Edge& edge) const {
1211 return Parent::direct(edge, !Parent::direction(edge));
1215 int maxId(Node) const {
1216 return Parent::maxNodeId();
1218 int maxId(BNode) const {
1219 return Parent::maxBNodeId();
1221 int maxId(ANode) const {
1222 return Parent::maxANodeId();
1224 int maxId(Edge) const {
1225 return Parent::maxEdgeId();
1227 int maxId(UEdge) const {
1228 return Parent::maxUEdgeId();
1232 Node fromId(int id, Node) const {
1233 return Parent::nodeFromId(id);
1235 ANode fromId(int id, ANode) const {
1236 return Parent::fromANodeId(id);
1238 BNode fromId(int id, BNode) const {
1239 return Parent::fromBNodeId(id);
1241 Edge fromId(int id, Edge) const {
1242 return Parent::edgeFromId(id);
1244 UEdge fromId(int id, UEdge) const {
1245 return Parent::uEdgeFromId(id);
1248 typedef AlterationNotifier<Node> NodeNotifier;
1249 typedef AlterationNotifier<BNode> BNodeNotifier;
1250 typedef AlterationNotifier<ANode> ANodeNotifier;
1251 typedef AlterationNotifier<Edge> EdgeNotifier;
1252 typedef AlterationNotifier<UEdge> UEdgeNotifier;
1256 mutable NodeNotifier nodeNotifier;
1257 mutable BNodeNotifier bNodeNotifier;
1258 mutable ANodeNotifier aNodeNotifier;
1259 mutable EdgeNotifier edgeNotifier;
1260 mutable UEdgeNotifier uEdgeNotifier;
1264 NodeNotifier& getNotifier(Node) const {
1265 return nodeNotifier;
1268 BNodeNotifier& getNotifier(BNode) const {
1269 return bNodeNotifier;
1272 ANodeNotifier& getNotifier(ANode) const {
1273 return aNodeNotifier;
1276 EdgeNotifier& getNotifier(Edge) const {
1277 return edgeNotifier;
1280 UEdgeNotifier& getNotifier(UEdge) const {
1281 return uEdgeNotifier;
1284 class NodeIt : public Node {
1290 NodeIt(Invalid i) : Node(INVALID) { }
1292 explicit NodeIt(const Graph& _graph) : graph(&_graph) {
1293 graph->first(static_cast<Node&>(*this));
1296 NodeIt(const Graph& _graph, const Node& node)
1297 : Node(node), graph(&_graph) { }
1299 NodeIt& operator++() {
1306 class ANodeIt : public Node {
1307 friend class BpUGraphExtender;
1313 ANodeIt(Invalid i) : Node(INVALID) { }
1315 explicit ANodeIt(const Graph& _graph) : graph(&_graph) {
1316 graph->firstANode(static_cast<Node&>(*this));
1319 ANodeIt(const Graph& _graph, const Node& node)
1320 : Node(node), graph(&_graph) {}
1322 ANodeIt& operator++() {
1323 graph->nextANode(*this);
1328 class BNodeIt : public Node {
1329 friend class BpUGraphExtender;
1335 BNodeIt(Invalid i) : Node(INVALID) { }
1337 explicit BNodeIt(const Graph& _graph) : graph(&_graph) {
1338 graph->firstBNode(static_cast<Node&>(*this));
1341 BNodeIt(const Graph& _graph, const Node& node)
1342 : Node(node), graph(&_graph) {}
1344 BNodeIt& operator++() {
1345 graph->nextBNode(*this);
1350 class EdgeIt : public Edge {
1351 friend class BpUGraphExtender;
1357 EdgeIt(Invalid i) : Edge(INVALID) { }
1359 explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
1360 graph->first(static_cast<Edge&>(*this));
1363 EdgeIt(const Graph& _graph, const Edge& edge)
1364 : Edge(edge), graph(&_graph) { }
1366 EdgeIt& operator++() {
1373 class UEdgeIt : public UEdge {
1374 friend class BpUGraphExtender;
1380 UEdgeIt(Invalid i) : UEdge(INVALID) { }
1382 explicit UEdgeIt(const Graph& _graph) : graph(&_graph) {
1383 graph->first(static_cast<UEdge&>(*this));
1386 UEdgeIt(const Graph& _graph, const UEdge& edge)
1387 : UEdge(edge), graph(&_graph) { }
1389 UEdgeIt& operator++() {
1395 class OutEdgeIt : public Edge {
1396 friend class BpUGraphExtender;
1402 OutEdgeIt(Invalid i) : Edge(i) { }
1404 OutEdgeIt(const Graph& _graph, const Node& node)
1406 graph->firstOut(*this, node);
1409 OutEdgeIt(const Graph& _graph, const Edge& edge)
1410 : Edge(edge), graph(&_graph) {}
1412 OutEdgeIt& operator++() {
1413 graph->nextOut(*this);
1420 class InEdgeIt : public Edge {
1421 friend class BpUGraphExtender;
1427 InEdgeIt(Invalid i) : Edge(i) { }
1429 InEdgeIt(const Graph& _graph, const Node& node)
1431 graph->firstIn(*this, node);
1434 InEdgeIt(const Graph& _graph, const Edge& edge) :
1435 Edge(edge), graph(&_graph) {}
1437 InEdgeIt& operator++() {
1438 graph->nextIn(*this);
1444 /// \brief Base node of the iterator
1446 /// Returns the base node (ie. the source in this case) of the iterator
1447 Node baseNode(const OutEdgeIt &e) const {
1448 return Parent::source((Edge&)e);
1450 /// \brief Running node of the iterator
1452 /// Returns the running node (ie. the target in this case) of the
1454 Node runningNode(const OutEdgeIt &e) const {
1455 return Parent::target((Edge&)e);
1458 /// \brief Base node of the iterator
1460 /// Returns the base node (ie. the target in this case) of the iterator
1461 Node baseNode(const InEdgeIt &e) const {
1462 return Parent::target((Edge&)e);
1464 /// \brief Running node of the iterator
1466 /// Returns the running node (ie. the source in this case) of the
1468 Node runningNode(const InEdgeIt &e) const {
1469 return Parent::source((Edge&)e);
1472 class IncEdgeIt : public Parent::UEdge {
1473 friend class BpUGraphExtender;
1480 IncEdgeIt(Invalid i) : UEdge(i), direction(true) { }
1482 IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
1483 graph->firstInc(*this, direction, n);
1486 IncEdgeIt(const Graph& _graph, const UEdge &ue, const Node &n)
1487 : graph(&_graph), UEdge(ue) {
1488 direction = (graph->source(ue) == n);
1491 IncEdgeIt& operator++() {
1492 graph->nextInc(*this, direction);
1498 /// Base node of the iterator
1500 /// Returns the base node of the iterator
1501 Node baseNode(const IncEdgeIt &e) const {
1502 return e.direction ? source(e) : target(e);
1505 /// Running node of the iterator
1507 /// Returns the running node of the iterator
1508 Node runningNode(const IncEdgeIt &e) const {
1509 return e.direction ? target(e) : source(e);
1512 template <typename _Value>
1514 : public IterableMapExtender<DefaultMap<Graph, ANode, _Value> > {
1516 typedef BpUGraphExtender Graph;
1517 typedef IterableMapExtender<DefaultMap<Graph, ANode, _Value> >
1520 ANodeMap(const Graph& _g)
1522 ANodeMap(const Graph& _g, const _Value& _v)
1525 ANodeMap& operator=(const ANodeMap& cmap) {
1526 return operator=<ANodeMap>(cmap);
1530 /// \brief Template assign operator.
1532 /// The given parameter should be conform to the ReadMap
1533 /// concept and could be indiced by the current item set of
1534 /// the ANodeMap. In this case the value for each item
1535 /// is assigned by the value of the given ReadMap.
1536 template <typename CMap>
1537 ANodeMap& operator=(const CMap& cmap) {
1538 checkConcept<concept::ReadMap<ANode, _Value>, CMap>();
1539 const typename Parent::Graph* graph = Parent::getGraph();
1541 for (graph->first(it); it != INVALID; graph->next(it)) {
1542 Parent::set(it, cmap[it]);
1549 template <typename _Value>
1551 : public IterableMapExtender<DefaultMap<Graph, BNode, _Value> > {
1553 typedef BpUGraphExtender Graph;
1554 typedef IterableMapExtender<DefaultMap<Graph, BNode, _Value> >
1557 BNodeMap(const Graph& _g)
1559 BNodeMap(const Graph& _g, const _Value& _v)
1562 BNodeMap& operator=(const BNodeMap& cmap) {
1563 return operator=<BNodeMap>(cmap);
1567 /// \brief Template assign operator.
1569 /// The given parameter should be conform to the ReadMap
1570 /// concept and could be indiced by the current item set of
1571 /// the BNodeMap. In this case the value for each item
1572 /// is assigned by the value of the given ReadMap.
1573 template <typename CMap>
1574 BNodeMap& operator=(const CMap& cmap) {
1575 checkConcept<concept::ReadMap<BNode, _Value>, CMap>();
1576 const typename Parent::Graph* graph = Parent::getGraph();
1578 for (graph->first(it); it != INVALID; graph->next(it)) {
1579 Parent::set(it, cmap[it]);
1588 template <typename _Value>
1591 typedef BpUGraphExtender Graph;
1594 typedef _Value Value;
1596 /// The reference type of the map;
1597 typedef typename BNodeMap<_Value>::Reference Reference;
1598 /// The pointer type of the map;
1599 typedef typename BNodeMap<_Value>::Pointer Pointer;
1601 /// The const value type of the map.
1602 typedef const Value ConstValue;
1603 /// The const reference type of the map;
1604 typedef typename BNodeMap<_Value>::ConstReference ConstReference;
1605 /// The pointer type of the map;
1606 typedef typename BNodeMap<_Value>::ConstPointer ConstPointer;
1608 typedef True ReferenceMapTag;
1610 NodeMapBase(const Graph& _g)
1611 : aNodeMap(_g), bNodeMap(_g) {}
1612 NodeMapBase(const Graph& _g, const _Value& _v)
1613 : aNodeMap(_g, _v), bNodeMap(_g, _v) {}
1615 ConstReference operator[](const Key& node) const {
1616 if (Parent::aNode(node)) {
1617 return aNodeMap[node];
1619 return bNodeMap[node];
1623 Reference operator[](const Key& node) {
1624 if (Parent::aNode(node)) {
1625 return aNodeMap[node];
1627 return bNodeMap[node];
1631 void set(const Key& node, const Value& value) {
1632 if (Parent::aNode(node)) {
1633 aNodeMap.set(node, value);
1635 bNodeMap.set(node, value);
1639 const Graph* getGraph() const {
1640 return aNodeMap.getGraph();
1644 ANodeMap<_Value> aNodeMap;
1645 BNodeMap<_Value> bNodeMap;
1650 template <typename _Value>
1652 : public IterableMapExtender<NodeMapBase<_Value> > {
1654 typedef BpUGraphExtender Graph;
1655 typedef IterableMapExtender< NodeMapBase<_Value> > Parent;
1657 NodeMap(const Graph& _g)
1659 NodeMap(const Graph& _g, const _Value& _v)
1662 NodeMap& operator=(const NodeMap& cmap) {
1663 return operator=<NodeMap>(cmap);
1667 /// \brief Template assign operator.
1669 /// The given parameter should be conform to the ReadMap
1670 /// concept and could be indiced by the current item set of
1671 /// the NodeMap. In this case the value for each item
1672 /// is assigned by the value of the given ReadMap.
1673 template <typename CMap>
1674 NodeMap& operator=(const CMap& cmap) {
1675 checkConcept<concept::ReadMap<Node, _Value>, CMap>();
1676 const typename Parent::Graph* graph = Parent::getGraph();
1678 for (graph->first(it); it != INVALID; graph->next(it)) {
1679 Parent::set(it, cmap[it]);
1688 template <typename _Value>
1690 : public IterableMapExtender<DefaultMap<Graph, Edge, _Value> > {
1692 typedef BpUGraphExtender Graph;
1693 typedef IterableMapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
1695 EdgeMap(const Graph& _g)
1697 EdgeMap(const Graph& _g, const _Value& _v)
1700 EdgeMap& operator=(const EdgeMap& cmap) {
1701 return operator=<EdgeMap>(cmap);
1704 template <typename CMap>
1705 EdgeMap& operator=(const CMap& cmap) {
1706 checkConcept<concept::ReadMap<Edge, _Value>, CMap>();
1707 const typename Parent::Graph* graph = Parent::getGraph();
1709 for (graph->first(it); it != INVALID; graph->next(it)) {
1710 Parent::set(it, cmap[it]);
1716 template <typename _Value>
1718 : public IterableMapExtender<DefaultMap<Graph, UEdge, _Value> > {
1720 typedef BpUGraphExtender Graph;
1721 typedef IterableMapExtender<DefaultMap<Graph, UEdge, _Value> >
1724 UEdgeMap(const Graph& _g)
1726 UEdgeMap(const Graph& _g, const _Value& _v)
1729 UEdgeMap& operator=(const UEdgeMap& cmap) {
1730 return operator=<UEdgeMap>(cmap);
1733 template <typename CMap>
1734 UEdgeMap& operator=(const CMap& cmap) {
1735 checkConcept<concept::ReadMap<UEdge, _Value>, CMap>();
1736 const typename Parent::Graph* graph = Parent::getGraph();
1738 for (graph->first(it); it != INVALID; graph->next(it)) {
1739 Parent::set(it, cmap[it]);
1747 Node node = Parent::addANode();
1748 getNotifier(ANode()).add(node);
1749 getNotifier(Node()).add(node);
1754 Node node = Parent::addBNode();
1755 getNotifier(BNode()).add(node);
1756 getNotifier(Node()).add(node);
1760 UEdge addEdge(const Node& source, const Node& target) {
1761 UEdge uedge = Parent::addEdge(source, target);
1762 getNotifier(UEdge()).add(uedge);
1764 std::vector<Edge> edges;
1765 edges.push_back(direct(uedge, true));
1766 edges.push_back(direct(uedge, false));
1767 getNotifier(Edge()).add(edges);
1773 getNotifier(Edge()).clear();
1774 getNotifier(UEdge()).clear();
1775 getNotifier(Node()).clear();
1776 getNotifier(BNode()).clear();
1777 getNotifier(ANode()).clear();
1781 void erase(const Node& node) {
1784 Parent::firstInc(uedge, dir, node);
1785 while (uedge != INVALID ) {
1787 Parent::firstInc(uedge, dir, node);
1790 getNotifier(Node()).erase(node);
1791 Parent::erase(node);
1794 void erase(const UEdge& uedge) {
1795 std::vector<Edge> edges;
1796 edges.push_back(direct(uedge, true));
1797 edges.push_back(direct(uedge, false));
1798 getNotifier(Edge()).erase(edges);
1799 getNotifier(UEdge()).erase(uedge);
1800 Parent::erase(uedge);
1804 ~BpUGraphExtender() {
1805 getNotifier(Edge()).clear();
1806 getNotifier(UEdge()).clear();
1807 getNotifier(Node()).clear();
1808 getNotifier(BNode()).clear();
1809 getNotifier(ANode()).clear();