Correcting the structure of the graph's and adaptor's map.
The template assign operators and map iterators can be used for adaptors also.
Some bugfix in the adaptors
New class SwapBpUGraphAdaptor which swaps the two nodeset of the graph.
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 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 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::BNode BNode;
738 typedef typename Parent::ANode ANode;
739 typedef typename Parent::Edge Edge;
740 typedef typename Parent::UEdge UEdge;
742 Node oppositeNode(const UEdge& edge, const Node& node) const {
743 return source(edge) == node ?
744 target(edge) : source(edge);
747 using Parent::direct;
748 Edge direct(const UEdge& edge, const Node& node) const {
749 return Edge(edge, node == Parent::source(edge));
752 Edge oppositeEdge(const Edge& edge) const {
753 return Parent::direct(edge, !Parent::direction(edge));
757 int maxId(Node) const {
758 return Parent::maxNodeId();
760 int maxId(BNode) const {
761 return Parent::maxBNodeId();
763 int maxId(ANode) const {
764 return Parent::maxANodeId();
766 int maxId(Edge) const {
767 return Parent::maxEdgeId();
769 int maxId(UEdge) const {
770 return Parent::maxUEdgeId();
774 Node fromId(int id, Node) const {
775 return Parent::nodeFromId(id);
777 ANode fromId(int id, ANode) const {
778 return Parent::fromANodeId(id);
780 BNode fromId(int id, BNode) const {
781 return Parent::fromBNodeId(id);
783 Edge fromId(int id, Edge) const {
784 return Parent::edgeFromId(id);
786 UEdge fromId(int id, UEdge) const {
787 return Parent::uEdgeFromId(id);
790 typedef AlterationNotifier<BpUGraphExtender, ANode> ANodeNotifier;
791 typedef AlterationNotifier<BpUGraphExtender, BNode> BNodeNotifier;
792 typedef AlterationNotifier<BpUGraphExtender, Node> NodeNotifier;
793 typedef AlterationNotifier<BpUGraphExtender, Edge> EdgeNotifier;
794 typedef AlterationNotifier<BpUGraphExtender, UEdge> UEdgeNotifier;
798 mutable ANodeNotifier anode_notifier;
799 mutable BNodeNotifier bnode_notifier;
800 mutable NodeNotifier node_notifier;
801 mutable EdgeNotifier edge_notifier;
802 mutable UEdgeNotifier uedge_notifier;
806 NodeNotifier& getNotifier(Node) const {
807 return node_notifier;
810 ANodeNotifier& getNotifier(ANode) const {
811 return anode_notifier;
814 BNodeNotifier& getNotifier(BNode) const {
815 return bnode_notifier;
818 EdgeNotifier& getNotifier(Edge) const {
819 return edge_notifier;
822 UEdgeNotifier& getNotifier(UEdge) const {
823 return uedge_notifier;
826 class NodeIt : public Node {
832 NodeIt(Invalid i) : Node(INVALID) { }
834 explicit NodeIt(const Graph& _graph) : graph(&_graph) {
835 graph->first(static_cast<Node&>(*this));
838 NodeIt(const Graph& _graph, const Node& node)
839 : Node(node), graph(&_graph) { }
841 NodeIt& operator++() {
848 class ANodeIt : public Node {
849 friend class BpUGraphExtender;
855 ANodeIt(Invalid i) : Node(INVALID) { }
857 explicit ANodeIt(const Graph& _graph) : graph(&_graph) {
858 graph->firstANode(static_cast<Node&>(*this));
861 ANodeIt(const Graph& _graph, const Node& node)
862 : Node(node), graph(&_graph) {}
864 ANodeIt& operator++() {
865 graph->nextANode(*this);
870 class BNodeIt : public Node {
871 friend class BpUGraphExtender;
877 BNodeIt(Invalid i) : Node(INVALID) { }
879 explicit BNodeIt(const Graph& _graph) : graph(&_graph) {
880 graph->firstBNode(static_cast<Node&>(*this));
883 BNodeIt(const Graph& _graph, const Node& node)
884 : Node(node), graph(&_graph) {}
886 BNodeIt& operator++() {
887 graph->nextBNode(*this);
892 class EdgeIt : public Edge {
893 friend class BpUGraphExtender;
899 EdgeIt(Invalid i) : Edge(INVALID) { }
901 explicit EdgeIt(const Graph& _graph) : graph(&_graph) {
902 graph->first(static_cast<Edge&>(*this));
905 EdgeIt(const Graph& _graph, const Edge& edge)
906 : Edge(edge), graph(&_graph) { }
908 EdgeIt& operator++() {
915 class UEdgeIt : public UEdge {
916 friend class BpUGraphExtender;
922 UEdgeIt(Invalid i) : UEdge(INVALID) { }
924 explicit UEdgeIt(const Graph& _graph) : graph(&_graph) {
925 graph->first(static_cast<UEdge&>(*this));
928 UEdgeIt(const Graph& _graph, const UEdge& edge)
929 : UEdge(edge), graph(&_graph) { }
931 UEdgeIt& operator++() {
937 class OutEdgeIt : public Edge {
938 friend class BpUGraphExtender;
944 OutEdgeIt(Invalid i) : Edge(i) { }
946 OutEdgeIt(const Graph& _graph, const Node& node)
948 graph->firstOut(*this, node);
951 OutEdgeIt(const Graph& _graph, const Edge& edge)
952 : Edge(edge), graph(&_graph) {}
954 OutEdgeIt& operator++() {
955 graph->nextOut(*this);
962 class InEdgeIt : public Edge {
963 friend class BpUGraphExtender;
969 InEdgeIt(Invalid i) : Edge(i) { }
971 InEdgeIt(const Graph& _graph, const Node& node)
973 graph->firstIn(*this, node);
976 InEdgeIt(const Graph& _graph, const Edge& edge) :
977 Edge(edge), graph(&_graph) {}
979 InEdgeIt& operator++() {
980 graph->nextIn(*this);
986 /// \brief Base node of the iterator
988 /// Returns the base node (ie. the source in this case) of the iterator
989 Node baseNode(const OutEdgeIt &e) const {
990 return Parent::source((Edge&)e);
992 /// \brief Running node of the iterator
994 /// Returns the running node (ie. the target in this case) of the
996 Node runningNode(const OutEdgeIt &e) const {
997 return Parent::target((Edge&)e);
1000 /// \brief Base node of the iterator
1002 /// Returns the base node (ie. the target in this case) of the iterator
1003 Node baseNode(const InEdgeIt &e) const {
1004 return Parent::target((Edge&)e);
1006 /// \brief Running node of the iterator
1008 /// Returns the running node (ie. the source in this case) of the
1010 Node runningNode(const InEdgeIt &e) const {
1011 return Parent::source((Edge&)e);
1014 class IncEdgeIt : public Parent::UEdge {
1015 friend class BpUGraphExtender;
1022 IncEdgeIt(Invalid i) : UEdge(i), direction(true) { }
1024 IncEdgeIt(const Graph& _graph, const Node &n) : graph(&_graph) {
1025 graph->firstInc(*this, direction, n);
1028 IncEdgeIt(const Graph& _graph, const UEdge &ue, const Node &n)
1029 : graph(&_graph), UEdge(ue) {
1030 direction = (graph->source(ue) == n);
1033 IncEdgeIt& operator++() {
1034 graph->nextInc(*this, direction);
1040 /// Base node of the iterator
1042 /// Returns the base node of the iterator
1043 Node baseNode(const IncEdgeIt &e) const {
1044 return e.direction ? source(e) : target(e);
1047 /// Running node of the iterator
1049 /// Returns the running node of the iterator
1050 Node runningNode(const IncEdgeIt &e) const {
1051 return e.direction ? target(e) : source(e);
1054 template <typename _Value>
1056 : public MapExtender<DefaultMap<Graph, ANode, _Value> > {
1058 typedef BpUGraphExtender Graph;
1059 typedef MapExtender<DefaultMap<Graph, ANode, _Value> > Parent;
1061 ANodeMap(const Graph& graph)
1063 ANodeMap(const Graph& graph, const _Value& value)
1064 : Parent(graph, value) {}
1066 ANodeMap& operator=(const ANodeMap& cmap) {
1067 return operator=<ANodeMap>(cmap);
1070 template <typename CMap>
1071 ANodeMap& operator=(const CMap& cmap) {
1072 Parent::operator=(cmap);
1078 template <typename _Value>
1080 : public MapExtender<DefaultMap<Graph, BNode, _Value> > {
1082 typedef BpUGraphExtender Graph;
1083 typedef MapExtender<DefaultMap<Graph, BNode, _Value> > Parent;
1085 BNodeMap(const Graph& graph)
1087 BNodeMap(const Graph& graph, const _Value& value)
1088 : Parent(graph, value) {}
1090 BNodeMap& operator=(const BNodeMap& cmap) {
1091 return operator=<BNodeMap>(cmap);
1094 template <typename CMap>
1095 BNodeMap& operator=(const CMap& cmap) {
1096 Parent::operator=(cmap);
1104 template <typename _Value>
1107 typedef BpUGraphExtender Graph;
1110 typedef _Value Value;
1112 /// The reference type of the map;
1113 typedef typename ANodeMap<_Value>::Reference Reference;
1114 /// The const reference type of the map;
1115 typedef typename ANodeMap<_Value>::ConstReference ConstReference;
1117 typedef True ReferenceMapTag;
1119 NodeMap(const Graph& _graph)
1120 : graph(_graph), aNodeMap(_graph), bNodeMap(_graph) {}
1121 NodeMap(const Graph& _graph, const _Value& _value)
1122 : graph(_graph), aNodeMap(_graph, _value), bNodeMap(_graph, _value) {}
1124 NodeMap& operator=(const NodeMap& cmap) {
1125 return operator=<NodeMap>(cmap);
1128 template <typename CMap>
1129 NodeMap& operator=(const CMap& cmap) {
1130 checkConcept<concept::ReadMap<Node, _Value>, CMap>();
1131 const typename Parent::Notifier* notifier = Parent::getNotifier();
1133 for (graph.first(it); it != INVALID; graph.next(it)) {
1134 Parent::set(it, cmap[it]);
1139 ConstReference operator[](const Key& node) const {
1140 if (Parent::aNode(node)) {
1141 return aNodeMap[node];
1143 return bNodeMap[node];
1147 Reference operator[](const Key& node) {
1148 if (Parent::aNode(node)) {
1149 return aNodeMap[node];
1151 return bNodeMap[node];
1155 void set(const Key& node, const Value& value) {
1156 if (Parent::aNode(node)) {
1157 aNodeMap.set(node, value);
1159 bNodeMap.set(node, value);
1163 class MapIt : public NodeIt {
1166 typedef NodeIt Parent;
1168 explicit MapIt(NodeMap& _map)
1169 : Parent(_map.graph), map(_map) {}
1171 typename MapTraits<NodeMap>::ConstReturnValue operator*() const {
1175 typename MapTraits<NodeMap>::ReturnValue operator*() {
1179 void set(const Value& value) {
1180 map.set(*this, value);
1187 class ConstMapIt : public NodeIt {
1190 typedef NodeIt Parent;
1192 explicit ConstMapIt(const NodeMap& _map)
1193 : Parent(_map.graph), map(_map) {}
1195 typename MapTraits<NodeMap>::ConstReturnValue operator*() const {
1203 class ItemIt : public NodeIt {
1206 typedef NodeIt Parent;
1208 explicit ItemIt(const NodeMap& _map)
1209 : Parent(_map.graph) {}
1215 ANodeMap<_Value> aNodeMap;
1216 BNodeMap<_Value> bNodeMap;
1220 template <typename _Value>
1222 : public MapExtender<DefaultMap<Graph, Edge, _Value> > {
1224 typedef BpUGraphExtender Graph;
1225 typedef MapExtender<DefaultMap<Graph, Edge, _Value> > Parent;
1227 EdgeMap(const Graph& graph)
1229 EdgeMap(const Graph& graph, const _Value& value)
1230 : Parent(graph, value) {}
1232 EdgeMap& operator=(const EdgeMap& cmap) {
1233 return operator=<EdgeMap>(cmap);
1236 template <typename CMap>
1237 EdgeMap& operator=(const CMap& cmap) {
1238 Parent::operator=(cmap);
1243 template <typename _Value>
1245 : public MapExtender<DefaultMap<Graph, UEdge, _Value> > {
1247 typedef BpUGraphExtender Graph;
1248 typedef MapExtender<DefaultMap<Graph, UEdge, _Value> > Parent;
1250 UEdgeMap(const Graph& graph)
1252 UEdgeMap(const Graph& graph, const _Value& value)
1253 : Parent(graph, value) {}
1255 UEdgeMap& operator=(const UEdgeMap& cmap) {
1256 return operator=<UEdgeMap>(cmap);
1259 template <typename CMap>
1260 UEdgeMap& operator=(const CMap& cmap) {
1261 Parent::operator=(cmap);
1268 Node node = Parent::addANode();
1269 getNotifier(ANode()).add(node);
1270 getNotifier(Node()).add(node);
1275 Node node = Parent::addBNode();
1276 getNotifier(BNode()).add(node);
1277 getNotifier(Node()).add(node);
1281 UEdge addEdge(const Node& source, const Node& target) {
1282 UEdge uedge = Parent::addEdge(source, target);
1283 getNotifier(UEdge()).add(uedge);
1285 std::vector<Edge> edges;
1286 edges.push_back(direct(uedge, true));
1287 edges.push_back(direct(uedge, false));
1288 getNotifier(Edge()).add(edges);
1294 getNotifier(Edge()).clear();
1295 getNotifier(UEdge()).clear();
1296 getNotifier(Node()).clear();
1297 getNotifier(BNode()).clear();
1298 getNotifier(ANode()).clear();
1302 void erase(const Node& node) {
1305 Parent::firstInc(uedge, dir, node);
1306 while (uedge != INVALID ) {
1308 Parent::firstInc(uedge, dir, node);
1311 getNotifier(Node()).erase(node);
1312 Parent::erase(node);
1315 void erase(const UEdge& uedge) {
1316 std::vector<Edge> edges;
1317 edges.push_back(direct(uedge, true));
1318 edges.push_back(direct(uedge, false));
1319 getNotifier(Edge()).erase(edges);
1320 getNotifier(UEdge()).erase(uedge);
1321 Parent::erase(uedge);
1325 BpUGraphExtender() {
1326 anode_notifier.setContainer(*this);
1327 bnode_notifier.setContainer(*this);
1328 node_notifier.setContainer(*this);
1329 edge_notifier.setContainer(*this);
1330 uedge_notifier.setContainer(*this);
1333 ~BpUGraphExtender() {
1334 uedge_notifier.clear();
1335 edge_notifier.clear();
1336 node_notifier.clear();
1337 anode_notifier.clear();
1338 bnode_notifier.clear();