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/map_extender.h>
26 #include <lemon/bits/default_map.h>
28 #include <lemon/concept_check.h>
29 #include <lemon/concept/maps.h>
33 ///\brief Extenders for the graph types
36 /// \ingroup graphbits
38 /// \brief Extender for the Graphs
39 template <typename Base>
40 class GraphExtender : public Base {
44 typedef GraphExtender Graph;
48 typedef typename Parent::Node Node;
49 typedef typename Parent::Edge Edge;
51 int maxId(Node) const {
52 return Parent::maxNodeId();
55 int maxId(Edge) const {
56 return Parent::maxEdgeId();
59 Node fromId(int id, Node) const {
60 return Parent::nodeFromId(id);
63 Edge fromId(int id, Edge) const {
64 return Parent::edgeFromId(id);
67 Node oppositeNode(const Node &n, const Edge &e) const {
68 if (n == Parent::source(e))
69 return Parent::target(e);
70 else if(n==Parent::target(e))
71 return Parent::source(e);
76 // Alterable extension
78 typedef AlterationNotifier<GraphExtender, Node> NodeNotifier;
79 typedef AlterationNotifier<GraphExtender, Edge> EdgeNotifier;
84 mutable NodeNotifier node_notifier;
85 mutable EdgeNotifier edge_notifier;
89 NodeNotifier& getNotifier(Node) const {
93 EdgeNotifier& getNotifier(Edge) const {
97 class NodeIt : public Node {
103 NodeIt(Invalid i) : Node(i) { }
105 explicit NodeIt(const Graph& _graph) : graph(&_graph) {
106 _graph.first(static_cast<Node&>(*this));
109 NodeIt(const Graph& _graph, const Node& node)
110 : Node(node), graph(&_graph) {}
112 NodeIt& operator++() {
120 class EdgeIt : public Edge {
126 EdgeIt(Invalid i) : Edge(i) { }
128 explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
129 _graph.first(static_cast<Edge&>(*this));
132 EdgeIt(const Graph& _graph, const Edge& e) :
133 Edge(e), graph(&_graph) { }
135 EdgeIt& operator++() {
143 class OutEdgeIt : public Edge {
149 OutEdgeIt(Invalid i) : Edge(i) { }
151 OutEdgeIt(const Graph& _graph, const Node& node)
153 _graph.firstOut(*this, node);
156 OutEdgeIt(const Graph& _graph, const Edge& edge)
157 : Edge(edge), graph(&_graph) {}
159 OutEdgeIt& operator++() {
160 graph->nextOut(*this);
167 class InEdgeIt : public Edge {
173 InEdgeIt(Invalid i) : Edge(i) { }
175 InEdgeIt(const Graph& _graph, const Node& node)
177 _graph.firstIn(*this, node);
180 InEdgeIt(const Graph& _graph, const Edge& edge) :
181 Edge(edge), graph(&_graph) {}
183 InEdgeIt& operator++() {
184 graph->nextIn(*this);
190 /// \brief Base node of the iterator
192 /// Returns the base node (ie. the source in this case) of the iterator
193 Node baseNode(const OutEdgeIt &e) const {
194 return Parent::source(e);
196 /// \brief Running node of the iterator
198 /// Returns the running node (ie. the target in this case) of the
200 Node runningNode(const OutEdgeIt &e) const {
201 return Parent::target(e);
204 /// \brief Base node of the iterator
206 /// Returns the base node (ie. the target in this case) of the iterator
207 Node baseNode(const InEdgeIt &e) const {
208 return Parent::target(e);
210 /// \brief Running node of the iterator
212 /// Returns the running node (ie. the source in this case) of the
214 Node runningNode(const InEdgeIt &e) const {
215 return Parent::source(e);
219 template <typename _Value>
221 : public MapExtender<DefaultMap<Graph, Node, _Value> > {
223 typedef GraphExtender Graph;
224 typedef MapExtender<DefaultMap<Graph, Node, _Value> > Parent;
226 explicit NodeMap(const Graph& graph)
228 NodeMap(const Graph& graph, const _Value& value)
229 : Parent(graph, value) {}
231 NodeMap& operator=(const NodeMap& cmap) {
232 return operator=<NodeMap>(cmap);
235 template <typename CMap>
236 NodeMap& operator=(const CMap& cmap) {
237 Parent::operator=(cmap);
243 template <typename _Value>
245 : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
247 typedef GraphExtender Graph;
248 typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
250 explicit EdgeMap(const Graph& graph)
252 EdgeMap(const Graph& graph, const _Value& value)
253 : Parent(graph, value) {}
255 EdgeMap& operator=(const EdgeMap& cmap) {
256 return operator=<EdgeMap>(cmap);
259 template <typename CMap>
260 EdgeMap& operator=(const CMap& cmap) {
261 Parent::operator=(cmap);
268 Node node = Parent::addNode();
269 getNotifier(Node()).add(node);
273 Edge addEdge(const Node& from, const Node& to) {
274 Edge edge = Parent::addEdge(from, to);
275 getNotifier(Edge()).add(edge);
280 getNotifier(Edge()).clear();
281 getNotifier(Node()).clear();
286 void erase(const Node& node) {
288 Parent::firstOut(edge, node);
289 while (edge != INVALID ) {
291 Parent::firstOut(edge, node);
294 Parent::firstIn(edge, node);
295 while (edge != INVALID ) {
297 Parent::firstIn(edge, node);
300 getNotifier(Node()).erase(node);
304 void erase(const Edge& edge) {
305 getNotifier(Edge()).erase(edge);
310 node_notifier.setContainer(*this);
311 edge_notifier.setContainer(*this);
316 edge_notifier.clear();
317 node_notifier.clear();
321 /// \ingroup graphbits
323 /// \brief Extender for the UGraphs
324 template <typename Base>
325 class UGraphExtender : public Base {
329 typedef UGraphExtender Graph;
331 typedef typename Parent::Node Node;
332 typedef typename Parent::Edge Edge;
333 typedef typename Parent::UEdge UEdge;
337 int maxId(Node) const {
338 return Parent::maxNodeId();
341 int maxId(Edge) const {
342 return Parent::maxEdgeId();
345 int maxId(UEdge) const {
346 return Parent::maxUEdgeId();
349 Node fromId(int id, Node) const {
350 return Parent::nodeFromId(id);
353 Edge fromId(int id, Edge) const {
354 return Parent::edgeFromId(id);
357 UEdge fromId(int id, UEdge) const {
358 return Parent::uEdgeFromId(id);
361 Node oppositeNode(const Node &n, const UEdge &e) const {
362 if( n == Parent::source(e))
363 return Parent::target(e);
364 else if( n == Parent::target(e))
365 return Parent::source(e);
370 Edge oppositeEdge(const Edge &e) const {
371 return Parent::direct(e, !Parent::direction(e));
374 using Parent::direct;
375 Edge direct(const UEdge &ue, const Node &s) const {
376 return Parent::direct(ue, Parent::source(ue) == s);
379 // Alterable extension
381 typedef AlterationNotifier<UGraphExtender, Node> NodeNotifier;
382 typedef AlterationNotifier<UGraphExtender, Edge> EdgeNotifier;
383 typedef AlterationNotifier<UGraphExtender, UEdge> UEdgeNotifier;
388 mutable NodeNotifier node_notifier;
389 mutable EdgeNotifier edge_notifier;
390 mutable UEdgeNotifier uedge_notifier;
394 NodeNotifier& getNotifier(Node) const {
395 return node_notifier;
398 EdgeNotifier& getNotifier(Edge) const {
399 return edge_notifier;
402 UEdgeNotifier& getNotifier(UEdge) const {
403 return uedge_notifier;
408 class NodeIt : public Node {
414 NodeIt(Invalid i) : Node(i) { }
416 explicit NodeIt(const Graph& _graph) : graph(&_graph) {
417 _graph.first(static_cast<Node&>(*this));
420 NodeIt(const Graph& _graph, const Node& node)
421 : Node(node), graph(&_graph) {}
423 NodeIt& operator++() {
431 class EdgeIt : public Edge {
437 EdgeIt(Invalid i) : Edge(i) { }
439 explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
440 _graph.first(static_cast<Edge&>(*this));
443 EdgeIt(const Graph& _graph, const Edge& e) :
444 Edge(e), graph(&_graph) { }
446 EdgeIt& operator++() {
454 class OutEdgeIt : public Edge {
460 OutEdgeIt(Invalid i) : Edge(i) { }
462 OutEdgeIt(const Graph& _graph, const Node& node)
464 _graph.firstOut(*this, node);
467 OutEdgeIt(const Graph& _graph, const Edge& edge)
468 : Edge(edge), graph(&_graph) {}
470 OutEdgeIt& operator++() {
471 graph->nextOut(*this);
478 class InEdgeIt : public Edge {
484 InEdgeIt(Invalid i) : Edge(i) { }
486 InEdgeIt(const Graph& _graph, const Node& node)
488 _graph.firstIn(*this, node);
491 InEdgeIt(const Graph& _graph, const Edge& edge) :
492 Edge(edge), graph(&_graph) {}
494 InEdgeIt& operator++() {
495 graph->nextIn(*this);
502 class UEdgeIt : public Parent::UEdge {
508 UEdgeIt(Invalid i) : UEdge(i) { }
510 explicit UEdgeIt(const Graph& _graph) : graph(&_graph) {
511 _graph.first(static_cast<UEdge&>(*this));
514 UEdgeIt(const Graph& _graph, const UEdge& e) :
515 UEdge(e), graph(&_graph) { }
517 UEdgeIt& operator++() {
524 class IncEdgeIt : public Parent::UEdge {
525 friend class UGraphExtender;
532 IncEdgeIt(Invalid i) : UEdge(i), direction(false) { }
534 IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
535 _graph.firstInc(*this, direction, n);
538 IncEdgeIt(const Graph& _graph, const UEdge &ue, const Node &n)
539 : graph(&_graph), UEdge(ue) {
540 direction = (_graph.source(ue) == n);
543 IncEdgeIt& operator++() {
544 graph->nextInc(*this, direction);
549 /// \brief Base node of the iterator
551 /// Returns the base node (ie. the source in this case) of the iterator
552 Node baseNode(const OutEdgeIt &e) const {
553 return Parent::source((Edge)e);
555 /// \brief Running node of the iterator
557 /// Returns the running node (ie. the target in this case) of the
559 Node runningNode(const OutEdgeIt &e) const {
560 return Parent::target((Edge)e);
563 /// \brief Base node of the iterator
565 /// Returns the base node (ie. the target in this case) of the iterator
566 Node baseNode(const InEdgeIt &e) const {
567 return Parent::target((Edge)e);
569 /// \brief Running node of the iterator
571 /// Returns the running node (ie. the source in this case) of the
573 Node runningNode(const InEdgeIt &e) const {
574 return Parent::source((Edge)e);
577 /// Base node of the iterator
579 /// Returns the base node of the iterator
580 Node baseNode(const IncEdgeIt &e) const {
581 return e.direction ? source(e) : target(e);
583 /// Running node of the iterator
585 /// Returns the running node of the iterator
586 Node runningNode(const IncEdgeIt &e) const {
587 return e.direction ? target(e) : source(e);
590 // Mappable extension
592 template <typename _Value>
594 : public MapExtender<DefaultMap<Graph, Node, _Value> > {
596 typedef UGraphExtender Graph;
597 typedef MapExtender<DefaultMap<Graph, Node, _Value> > Parent;
599 NodeMap(const Graph& graph)
601 NodeMap(const Graph& graph, const _Value& value)
602 : Parent(graph, value) {}
604 NodeMap& operator=(const NodeMap& cmap) {
605 return operator=<NodeMap>(cmap);
608 template <typename CMap>
609 NodeMap& operator=(const CMap& cmap) {
610 Parent::operator=(cmap);
616 template <typename _Value>
618 : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
620 typedef UGraphExtender Graph;
621 typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
623 EdgeMap(const Graph& graph)
625 EdgeMap(const Graph& graph, const _Value& value)
626 : Parent(graph, value) {}
628 EdgeMap& operator=(const EdgeMap& cmap) {
629 return operator=<EdgeMap>(cmap);
632 template <typename CMap>
633 EdgeMap& operator=(const CMap& cmap) {
634 Parent::operator=(cmap);
640 template <typename _Value>
642 : public MapExtender<DefaultMap<Graph, UEdge, _Value> > {
644 typedef UGraphExtender Graph;
645 typedef MapExtender<DefaultMap<Graph, UEdge, _Value> > Parent;
647 UEdgeMap(const Graph& graph)
650 UEdgeMap(const Graph& graph, const _Value& value)
651 : Parent(graph, value) {}
653 UEdgeMap& operator=(const UEdgeMap& cmap) {
654 return operator=<UEdgeMap>(cmap);
657 template <typename CMap>
658 UEdgeMap& operator=(const CMap& cmap) {
659 Parent::operator=(cmap);
665 // Alteration extension
668 Node node = Parent::addNode();
669 getNotifier(Node()).add(node);
673 UEdge addEdge(const Node& from, const Node& to) {
674 UEdge uedge = Parent::addEdge(from, to);
675 getNotifier(UEdge()).add(uedge);
676 getNotifier(Edge()).add(Parent::direct(uedge, true));
677 getNotifier(Edge()).add(Parent::direct(uedge, false));
682 getNotifier(Edge()).clear();
683 getNotifier(UEdge()).clear();
684 getNotifier(Node()).clear();
688 void erase(const Node& node) {
690 Parent::firstOut(edge, node);
691 while (edge != INVALID ) {
693 Parent::firstOut(edge, node);
696 Parent::firstIn(edge, node);
697 while (edge != INVALID ) {
699 Parent::firstIn(edge, node);
702 getNotifier(Node()).erase(node);
706 void erase(const UEdge& uedge) {
707 getNotifier(Edge()).erase(Parent::direct(uedge, true));
708 getNotifier(Edge()).erase(Parent::direct(uedge, false));
709 getNotifier(UEdge()).erase(uedge);
710 Parent::erase(uedge);
714 node_notifier.setContainer(*this);
715 edge_notifier.setContainer(*this);
716 uedge_notifier.setContainer(*this);
720 uedge_notifier.clear();
721 edge_notifier.clear();
722 node_notifier.clear();
727 /// \ingroup graphbits
729 /// \brief Extender for the BpUGraphs
730 template <typename Base>
731 class BpUGraphExtender : public Base {
734 typedef BpUGraphExtender Graph;
736 typedef typename Parent::Node Node;
737 typedef typename Parent::UEdge UEdge;
745 class ANode : public Node {
746 friend class BpUGraphExtender;
749 ANode(const Node& node) : Node(node) {
750 LEMON_ASSERT(Parent::aNode(node) || node == INVALID,
751 typename Parent::NodeSetError());
753 ANode(Invalid) : Node(INVALID) {}
756 void first(ANode& node) const {
757 Parent::firstANode(static_cast<Node&>(node));
759 void next(ANode& node) const {
760 Parent::nextANode(static_cast<Node&>(node));
763 int id(const ANode& node) const {
764 return Parent::aNodeId(node);
767 class BNode : public Node {
768 friend class BpUGraphExtender;
771 BNode(const Node& node) : Node(node) {
772 LEMON_ASSERT(Parent::bNode(node) || node == INVALID,
773 typename Parent::NodeSetError());
775 BNode(Invalid) : Node(INVALID) {}
778 void first(BNode& node) const {
779 Parent::firstBNode(static_cast<Node&>(node));
781 void next(BNode& node) const {
782 Parent::nextBNode(static_cast<Node&>(node));
785 int id(const BNode& node) const {
786 return Parent::aNodeId(node);
789 Node source(const UEdge& edge) const {
792 Node target(const UEdge& edge) const {
796 void firstInc(UEdge& edge, bool& direction, const Node& node) const {
797 if (Parent::aNode(node)) {
798 Parent::firstFromANode(edge, node);
801 Parent::firstFromBNode(edge, node);
802 direction = static_cast<UEdge&>(edge) == INVALID;
805 void nextInc(UEdge& edge, bool& direction) const {
807 Parent::nextFromANode(edge);
809 Parent::nextFromBNode(edge);
810 if (edge == INVALID) direction = true;
814 class Edge : public UEdge {
815 friend class BpUGraphExtender;
819 Edge(const UEdge& edge, bool _forward)
820 : UEdge(edge), forward(_forward) {}
824 Edge (Invalid) : UEdge(INVALID), forward(true) {}
825 bool operator==(const Edge& i) const {
826 return UEdge::operator==(i) && forward == i.forward;
828 bool operator!=(const Edge& i) const {
829 return UEdge::operator!=(i) || forward != i.forward;
831 bool operator<(const Edge& i) const {
832 return UEdge::operator<(i) ||
833 (!(i.forward<forward) && UEdge(*this)<UEdge(i));
837 void first(Edge& edge) const {
838 Parent::first(static_cast<UEdge&>(edge));
842 void next(Edge& edge) const {
844 Parent::next(static_cast<UEdge&>(edge));
846 edge.forward = !edge.forward;
849 void firstOut(Edge& edge, const Node& node) const {
850 if (Parent::aNode(node)) {
851 Parent::firstFromANode(edge, node);
854 Parent::firstFromBNode(edge, node);
855 edge.forward = static_cast<UEdge&>(edge) == INVALID;
858 void nextOut(Edge& edge) const {
860 Parent::nextFromANode(edge);
862 Parent::nextFromBNode(edge);
863 edge.forward = static_cast<UEdge&>(edge) == INVALID;
867 void firstIn(Edge& edge, const Node& node) const {
868 if (Parent::bNode(node)) {
869 Parent::firstFromBNode(edge, node);
872 Parent::firstFromANode(edge, node);
873 edge.forward = static_cast<UEdge&>(edge) == INVALID;
876 void nextIn(Edge& edge) const {
878 Parent::nextFromBNode(edge);
880 Parent::nextFromANode(edge);
881 edge.forward = static_cast<UEdge&>(edge) == INVALID;
885 Node source(const Edge& edge) const {
886 return edge.forward ? Parent::aNode(edge) : Parent::bNode(edge);
888 Node target(const Edge& edge) const {
889 return edge.forward ? Parent::bNode(edge) : Parent::aNode(edge);
892 int id(const Edge& edge) const {
893 return (Parent::id(static_cast<const UEdge&>(edge)) << 1) +
894 (edge.forward ? 0 : 1);
896 Edge edgeFromId(int id) const {
897 return Edge(Parent::fromUEdgeId(id >> 1), (id & 1) == 0);
899 int maxEdgeId() const {
900 return (Parent::maxUEdgeId(UEdge()) << 1) + 1;
903 bool direction(const Edge& edge) const {
907 Edge direct(const UEdge& edge, bool direction) const {
908 return Edge(edge, direction);
911 int edgeNum() const {
912 return 2 * Parent::uEdgeNum();
915 int uEdgeNum() const {
916 return Parent::uEdgeNum();
919 Node oppositeNode(const UEdge& edge, const Node& node) const {
920 return source(edge) == node ?
921 target(edge) : source(edge);
924 Edge direct(const UEdge& edge, const Node& node) const {
925 return Edge(edge, node == Parent::source(edge));
928 Edge oppositeEdge(const Edge& edge) const {
929 return Parent::direct(edge, !Parent::direction(edge));
933 int maxId(Node) const {
934 return Parent::maxNodeId();
936 int maxId(BNode) const {
937 return Parent::maxBNodeId();
939 int maxId(ANode) const {
940 return Parent::maxANodeId();
942 int maxId(Edge) const {
945 int maxId(UEdge) const {
946 return Parent::maxUEdgeId();
950 Node fromId(int id, Node) const {
951 return Parent::nodeFromId(id);
953 ANode fromId(int id, ANode) const {
954 return Parent::fromANodeId(id);
956 BNode fromId(int id, BNode) const {
957 return Parent::fromBNodeId(id);
959 Edge fromId(int id, Edge) const {
960 return Parent::edgeFromId(id);
962 UEdge fromId(int id, UEdge) const {
963 return Parent::uEdgeFromId(id);
966 typedef AlterationNotifier<BpUGraphExtender, ANode> ANodeNotifier;
967 typedef AlterationNotifier<BpUGraphExtender, BNode> BNodeNotifier;
968 typedef AlterationNotifier<BpUGraphExtender, Node> NodeNotifier;
969 typedef AlterationNotifier<BpUGraphExtender, Edge> EdgeNotifier;
970 typedef AlterationNotifier<BpUGraphExtender, UEdge> UEdgeNotifier;
974 mutable ANodeNotifier anode_notifier;
975 mutable BNodeNotifier bnode_notifier;
976 mutable NodeNotifier node_notifier;
977 mutable EdgeNotifier edge_notifier;
978 mutable UEdgeNotifier uedge_notifier;
982 NodeNotifier& getNotifier(Node) const {
983 return node_notifier;
986 ANodeNotifier& getNotifier(ANode) const {
987 return anode_notifier;
990 BNodeNotifier& getNotifier(BNode) const {
991 return bnode_notifier;
994 EdgeNotifier& getNotifier(Edge) const {
995 return edge_notifier;
998 UEdgeNotifier& getNotifier(UEdge) const {
999 return uedge_notifier;
1002 class NodeIt : public Node {
1008 NodeIt(Invalid i) : Node(INVALID) { }
1010 explicit NodeIt(const Graph& _graph) : graph(&_graph) {
1011 graph->first(static_cast<Node&>(*this));
1014 NodeIt(const Graph& _graph, const Node& node)
1015 : Node(node), graph(&_graph) { }
1017 NodeIt& operator++() {
1024 class ANodeIt : public Node {
1025 friend class BpUGraphExtender;
1031 ANodeIt(Invalid i) : Node(INVALID) { }
1033 explicit ANodeIt(const Graph& _graph) : graph(&_graph) {
1034 graph->firstANode(static_cast<Node&>(*this));
1037 ANodeIt(const Graph& _graph, const Node& node)
1038 : Node(node), graph(&_graph) {}
1040 ANodeIt& operator++() {
1041 graph->nextANode(*this);
1046 class BNodeIt : public Node {
1047 friend class BpUGraphExtender;
1053 BNodeIt(Invalid i) : Node(INVALID) { }
1055 explicit BNodeIt(const Graph& _graph) : graph(&_graph) {
1056 graph->firstBNode(static_cast<Node&>(*this));
1059 BNodeIt(const Graph& _graph, const Node& node)
1060 : Node(node), graph(&_graph) {}
1062 BNodeIt& operator++() {
1063 graph->nextBNode(*this);
1068 class EdgeIt : public Edge {
1069 friend class BpUGraphExtender;
1075 EdgeIt(Invalid i) : Edge(INVALID) { }
1077 explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
1078 graph->first(static_cast<Edge&>(*this));
1081 EdgeIt(const Graph& _graph, const Edge& edge)
1082 : Edge(edge), graph(&_graph) { }
1084 EdgeIt& operator++() {
1091 class UEdgeIt : public UEdge {
1092 friend class BpUGraphExtender;
1098 UEdgeIt(Invalid i) : UEdge(INVALID) { }
1100 explicit UEdgeIt(const Graph& _graph) : graph(&_graph) {
1101 graph->first(static_cast<UEdge&>(*this));
1104 UEdgeIt(const Graph& _graph, const UEdge& edge)
1105 : UEdge(edge), graph(&_graph) { }
1107 UEdgeIt& operator++() {
1113 class OutEdgeIt : public Edge {
1114 friend class BpUGraphExtender;
1120 OutEdgeIt(Invalid i) : Edge(i) { }
1122 OutEdgeIt(const Graph& _graph, const Node& node)
1124 graph->firstOut(*this, node);
1127 OutEdgeIt(const Graph& _graph, const Edge& edge)
1128 : Edge(edge), graph(&_graph) {}
1130 OutEdgeIt& operator++() {
1131 graph->nextOut(*this);
1138 class InEdgeIt : public Edge {
1139 friend class BpUGraphExtender;
1145 InEdgeIt(Invalid i) : Edge(i) { }
1147 InEdgeIt(const Graph& _graph, const Node& node)
1149 graph->firstIn(*this, node);
1152 InEdgeIt(const Graph& _graph, const Edge& edge) :
1153 Edge(edge), graph(&_graph) {}
1155 InEdgeIt& operator++() {
1156 graph->nextIn(*this);
1162 /// \brief Base node of the iterator
1164 /// Returns the base node (ie. the source in this case) of the iterator
1165 Node baseNode(const OutEdgeIt &e) const {
1166 return Parent::source((Edge&)e);
1168 /// \brief Running node of the iterator
1170 /// Returns the running node (ie. the target in this case) of the
1172 Node runningNode(const OutEdgeIt &e) const {
1173 return Parent::target((Edge&)e);
1176 /// \brief Base node of the iterator
1178 /// Returns the base node (ie. the target in this case) of the iterator
1179 Node baseNode(const InEdgeIt &e) const {
1180 return Parent::target((Edge&)e);
1182 /// \brief Running node of the iterator
1184 /// Returns the running node (ie. the source in this case) of the
1186 Node runningNode(const InEdgeIt &e) const {
1187 return Parent::source((Edge&)e);
1190 class IncEdgeIt : public Parent::UEdge {
1191 friend class BpUGraphExtender;
1198 IncEdgeIt(Invalid i) : UEdge(i), direction(true) { }
1200 IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
1201 graph->firstInc(*this, direction, n);
1204 IncEdgeIt(const Graph& _graph, const UEdge &ue, const Node &n)
1205 : graph(&_graph), UEdge(ue) {
1206 direction = (graph->source(ue) == n);
1209 IncEdgeIt& operator++() {
1210 graph->nextInc(*this, direction);
1216 /// Base node of the iterator
1218 /// Returns the base node of the iterator
1219 Node baseNode(const IncEdgeIt &e) const {
1220 return e.direction ? source(e) : target(e);
1223 /// Running node of the iterator
1225 /// Returns the running node of the iterator
1226 Node runningNode(const IncEdgeIt &e) const {
1227 return e.direction ? target(e) : source(e);
1230 template <typename _Value>
1232 : public MapExtender<DefaultMap<Graph, ANode, _Value> > {
1234 typedef BpUGraphExtender Graph;
1235 typedef MapExtender<DefaultMap<Graph, ANode, _Value> > Parent;
1237 ANodeMap(const Graph& graph)
1239 ANodeMap(const Graph& graph, const _Value& value)
1240 : Parent(graph, value) {}
1242 ANodeMap& operator=(const ANodeMap& cmap) {
1243 return operator=<ANodeMap>(cmap);
1246 template <typename CMap>
1247 ANodeMap& operator=(const CMap& cmap) {
1248 Parent::operator=(cmap);
1254 template <typename _Value>
1256 : public MapExtender<DefaultMap<Graph, BNode, _Value> > {
1258 typedef BpUGraphExtender Graph;
1259 typedef MapExtender<DefaultMap<Graph, BNode, _Value> > Parent;
1261 BNodeMap(const Graph& graph)
1263 BNodeMap(const Graph& graph, const _Value& value)
1264 : Parent(graph, value) {}
1266 BNodeMap& operator=(const BNodeMap& cmap) {
1267 return operator=<BNodeMap>(cmap);
1270 template <typename CMap>
1271 BNodeMap& operator=(const CMap& cmap) {
1272 Parent::operator=(cmap);
1280 template <typename _Value>
1283 typedef BpUGraphExtender Graph;
1286 typedef _Value Value;
1288 /// The reference type of the map;
1289 typedef typename ANodeMap<_Value>::Reference Reference;
1290 /// The const reference type of the map;
1291 typedef typename ANodeMap<_Value>::ConstReference ConstReference;
1293 typedef True ReferenceMapTag;
1295 NodeMap(const Graph& _graph)
1296 : graph(_graph), aNodeMap(_graph), bNodeMap(_graph) {}
1297 NodeMap(const Graph& _graph, const _Value& _value)
1298 : graph(_graph), aNodeMap(_graph, _value), bNodeMap(_graph, _value) {}
1300 NodeMap& operator=(const NodeMap& cmap) {
1301 return operator=<NodeMap>(cmap);
1304 template <typename CMap>
1305 NodeMap& operator=(const CMap& cmap) {
1306 checkConcept<concept::ReadMap<Node, _Value>, CMap>();
1307 const typename Parent::Notifier* notifier = Parent::getNotifier();
1309 for (graph.first(it); it != INVALID; graph.next(it)) {
1310 Parent::set(it, cmap[it]);
1315 ConstReference operator[](const Key& node) const {
1316 if (Parent::aNode(node)) {
1317 return aNodeMap[node];
1319 return bNodeMap[node];
1323 Reference operator[](const Key& node) {
1324 if (Parent::aNode(node)) {
1325 return aNodeMap[node];
1327 return bNodeMap[node];
1331 void set(const Key& node, const Value& value) {
1332 if (Parent::aNode(node)) {
1333 aNodeMap.set(node, value);
1335 bNodeMap.set(node, value);
1339 class MapIt : public NodeIt {
1342 typedef NodeIt Parent;
1344 explicit MapIt(NodeMap& _map)
1345 : Parent(_map.graph), map(_map) {}
1347 typename MapTraits<NodeMap>::ConstReturnValue operator*() const {
1351 typename MapTraits<NodeMap>::ReturnValue operator*() {
1355 void set(const Value& value) {
1356 map.set(*this, value);
1363 class ConstMapIt : public NodeIt {
1366 typedef NodeIt Parent;
1368 explicit ConstMapIt(const NodeMap& _map)
1369 : Parent(_map.graph), map(_map) {}
1371 typename MapTraits<NodeMap>::ConstReturnValue operator*() const {
1379 class ItemIt : public NodeIt {
1382 typedef NodeIt Parent;
1384 explicit ItemIt(const NodeMap& _map)
1385 : Parent(_map.graph) {}
1391 ANodeMap<_Value> aNodeMap;
1392 BNodeMap<_Value> bNodeMap;
1396 template <typename _Value>
1398 : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
1400 typedef BpUGraphExtender Graph;
1401 typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
1403 EdgeMap(const Graph& graph)
1405 EdgeMap(const Graph& graph, const _Value& value)
1406 : Parent(graph, value) {}
1408 EdgeMap& operator=(const EdgeMap& cmap) {
1409 return operator=<EdgeMap>(cmap);
1412 template <typename CMap>
1413 EdgeMap& operator=(const CMap& cmap) {
1414 Parent::operator=(cmap);
1419 template <typename _Value>
1421 : public MapExtender<DefaultMap<Graph, UEdge, _Value> > {
1423 typedef BpUGraphExtender Graph;
1424 typedef MapExtender<DefaultMap<Graph, UEdge, _Value> > Parent;
1426 UEdgeMap(const Graph& graph)
1428 UEdgeMap(const Graph& graph, const _Value& value)
1429 : Parent(graph, value) {}
1431 UEdgeMap& operator=(const UEdgeMap& cmap) {
1432 return operator=<UEdgeMap>(cmap);
1435 template <typename CMap>
1436 UEdgeMap& operator=(const CMap& cmap) {
1437 Parent::operator=(cmap);
1444 Node node = Parent::addANode();
1445 getNotifier(ANode()).add(node);
1446 getNotifier(Node()).add(node);
1451 Node node = Parent::addBNode();
1452 getNotifier(BNode()).add(node);
1453 getNotifier(Node()).add(node);
1457 UEdge addEdge(const Node& source, const Node& target) {
1458 UEdge uedge = Parent::addEdge(source, target);
1459 getNotifier(UEdge()).add(uedge);
1461 std::vector<Edge> edges;
1462 edges.push_back(direct(uedge, true));
1463 edges.push_back(direct(uedge, false));
1464 getNotifier(Edge()).add(edges);
1470 getNotifier(Edge()).clear();
1471 getNotifier(UEdge()).clear();
1472 getNotifier(Node()).clear();
1473 getNotifier(BNode()).clear();
1474 getNotifier(ANode()).clear();
1478 void erase(const Node& node) {
1480 if (Parent::aNode(node)) {
1481 Parent::firstFromANode(uedge, node);
1482 while (uedge != INVALID) {
1484 Parent::firstFromANode(uedge, node);
1487 Parent::firstFromBNode(uedge, node);
1488 while (uedge != INVALID) {
1490 Parent::firstFromBNode(uedge, node);
1494 getNotifier(Node()).erase(node);
1495 Parent::erase(node);
1498 void erase(const UEdge& uedge) {
1499 std::vector<Edge> edges;
1500 edges.push_back(direct(uedge, true));
1501 edges.push_back(direct(uedge, false));
1502 getNotifier(Edge()).erase(edges);
1503 getNotifier(UEdge()).erase(uedge);
1504 Parent::erase(uedge);
1508 BpUGraphExtender() {
1509 anode_notifier.setContainer(*this);
1510 bnode_notifier.setContainer(*this);
1511 node_notifier.setContainer(*this);
1512 edge_notifier.setContainer(*this);
1513 uedge_notifier.setContainer(*this);
1516 ~BpUGraphExtender() {
1517 uedge_notifier.clear();
1518 edge_notifier.clear();
1519 node_notifier.clear();
1520 anode_notifier.clear();
1521 bnode_notifier.clear();