# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1239290144 -7200
# Node ID 63e0373c4caa2e888dfdfb0403353f3b0c0f7e83
# Parent add8195ad331e8e75b4abe4f09a323a1dbca061f
Standard graph maps are required to be reference maps (#190)
diff --git a/lemon/bits/graph_adaptor_extender.h b/lemon/bits/graph_adaptor_extender.h
a
|
b
|
|
22 | 22 | #include <lemon/core.h> |
23 | 23 | #include <lemon/error.h> |
24 | 24 | |
25 | | #include <lemon/bits/default_map.h> |
26 | | |
27 | 25 | namespace lemon { |
28 | 26 | |
29 | 27 | template <typename _Digraph> |
diff --git a/lemon/bits/map_extender.h b/lemon/bits/map_extender.h
a
|
b
|
|
47 | 47 | |
48 | 48 | typedef typename Parent::Key Key; |
49 | 49 | typedef typename Parent::Value Value; |
| 50 | typedef typename Parent::Reference Reference; |
| 51 | typedef typename Parent::ConstReference ConstReference; |
50 | 52 | |
51 | 53 | class MapIt; |
52 | 54 | class ConstMapIt; |
… |
… |
|
187 | 189 | |
188 | 190 | typedef typename Parent::Key Key; |
189 | 191 | typedef typename Parent::Value Value; |
| 192 | typedef typename Parent::Reference Reference; |
| 193 | typedef typename Parent::ConstReference ConstReference; |
190 | 194 | |
191 | 195 | class MapIt; |
192 | 196 | class ConstMapIt; |
diff --git a/lemon/concepts/digraph.h b/lemon/concepts/digraph.h
a
|
b
|
|
421 | 421 | /// Gives back the opposite node on the given arc. |
422 | 422 | Node oppositeNode(const Node&, const Arc&) const { return INVALID; } |
423 | 423 | |
424 | | /// \brief Read write map of the nodes to type \c T. |
| 424 | /// \brief Reference map of the nodes to type \c T. |
425 | 425 | /// |
426 | | /// ReadWrite map of the nodes to type \c T. |
427 | | /// \sa Reference |
| 426 | /// Reference map of the nodes to type \c T. |
428 | 427 | template<class T> |
429 | | class NodeMap : public ReadWriteMap< Node, T > { |
| 428 | class NodeMap : public ReferenceMap<Node, T, T&, const T&> { |
430 | 429 | public: |
431 | 430 | |
432 | 431 | ///\e |
… |
… |
|
436 | 435 | |
437 | 436 | private: |
438 | 437 | ///Copy constructor |
439 | | NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { } |
| 438 | NodeMap(const NodeMap& nm) : |
| 439 | ReferenceMap<Node, T, T&, const T&>(nm) { } |
440 | 440 | ///Assignment operator |
441 | 441 | template <typename CMap> |
442 | 442 | NodeMap& operator=(const CMap&) { |
… |
… |
|
445 | 445 | } |
446 | 446 | }; |
447 | 447 | |
448 | | /// \brief Read write map of the arcs to type \c T. |
| 448 | /// \brief Reference map of the arcs to type \c T. |
449 | 449 | /// |
450 | 450 | /// Reference map of the arcs to type \c T. |
451 | | /// \sa Reference |
452 | 451 | template<class T> |
453 | | class ArcMap : public ReadWriteMap<Arc,T> { |
| 452 | class ArcMap : public ReferenceMap<Arc, T, T&, const T&> { |
454 | 453 | public: |
455 | 454 | |
456 | 455 | ///\e |
… |
… |
|
459 | 458 | ArcMap(const Digraph&, T) { } |
460 | 459 | private: |
461 | 460 | ///Copy constructor |
462 | | ArcMap(const ArcMap& em) : ReadWriteMap<Arc,T>(em) { } |
| 461 | ArcMap(const ArcMap& em) : |
| 462 | ReferenceMap<Arc, T, T&, const T&>(em) { } |
463 | 463 | ///Assignment operator |
464 | 464 | template <typename CMap> |
465 | 465 | ArcMap& operator=(const CMap&) { |
… |
… |
|
471 | 471 | template <typename _Digraph> |
472 | 472 | struct Constraints { |
473 | 473 | void constraints() { |
| 474 | checkConcept<BaseDigraphComponent, _Digraph>(); |
474 | 475 | checkConcept<IterableDigraphComponent<>, _Digraph>(); |
475 | 476 | checkConcept<IDableDigraphComponent<>, _Digraph>(); |
476 | 477 | checkConcept<MappableDigraphComponent<>, _Digraph>(); |
diff --git a/lemon/concepts/graph.h b/lemon/concepts/graph.h
a
|
b
|
|
497 | 497 | InArcIt& operator++() { return *this; } |
498 | 498 | }; |
499 | 499 | |
500 | | /// \brief Read write map of the nodes to type \c T. |
| 500 | /// \brief Reference map of the nodes to type \c T. |
501 | 501 | /// |
502 | | /// ReadWrite map of the nodes to type \c T. |
503 | | /// \sa Reference |
| 502 | /// Reference map of the nodes to type \c T. |
504 | 503 | template<class T> |
505 | | class NodeMap : public ReadWriteMap< Node, T > |
| 504 | class NodeMap : public ReferenceMap<Node, T, T&, const T&> |
506 | 505 | { |
507 | 506 | public: |
508 | 507 | |
… |
… |
|
513 | 512 | |
514 | 513 | private: |
515 | 514 | ///Copy constructor |
516 | | NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { } |
| 515 | NodeMap(const NodeMap& nm) : |
| 516 | ReferenceMap<Node, T, T&, const T&>(nm) { } |
517 | 517 | ///Assignment operator |
518 | 518 | template <typename CMap> |
519 | 519 | NodeMap& operator=(const CMap&) { |
… |
… |
|
522 | 522 | } |
523 | 523 | }; |
524 | 524 | |
525 | | /// \brief Read write map of the directed arcs to type \c T. |
| 525 | /// \brief Reference map of the arcs to type \c T. |
526 | 526 | /// |
527 | | /// Reference map of the directed arcs to type \c T. |
528 | | /// \sa Reference |
| 527 | /// Reference map of the arcs to type \c T. |
529 | 528 | template<class T> |
530 | | class ArcMap : public ReadWriteMap<Arc,T> |
| 529 | class ArcMap : public ReferenceMap<Arc, T, T&, const T&> |
531 | 530 | { |
532 | 531 | public: |
533 | 532 | |
… |
… |
|
537 | 536 | ArcMap(const Graph&, T) { } |
538 | 537 | private: |
539 | 538 | ///Copy constructor |
540 | | ArcMap(const ArcMap& em) : ReadWriteMap<Arc,T>(em) { } |
| 539 | ArcMap(const ArcMap& em) : |
| 540 | ReferenceMap<Arc, T, T&, const T&>(em) { } |
541 | 541 | ///Assignment operator |
542 | 542 | template <typename CMap> |
543 | 543 | ArcMap& operator=(const CMap&) { |
… |
… |
|
546 | 546 | } |
547 | 547 | }; |
548 | 548 | |
549 | | /// Read write map of the edges to type \c T. |
| 549 | /// Reference map of the edges to type \c T. |
550 | 550 | |
551 | | /// Reference map of the arcs to type \c T. |
552 | | /// \sa Reference |
| 551 | /// Reference map of the edges to type \c T. |
553 | 552 | template<class T> |
554 | | class EdgeMap : public ReadWriteMap<Edge,T> |
| 553 | class EdgeMap : public ReferenceMap<Edge, T, T&, const T&> |
555 | 554 | { |
556 | 555 | public: |
557 | 556 | |
… |
… |
|
561 | 560 | EdgeMap(const Graph&, T) { } |
562 | 561 | private: |
563 | 562 | ///Copy constructor |
564 | | EdgeMap(const EdgeMap& em) : ReadWriteMap<Edge,T>(em) {} |
| 563 | EdgeMap(const EdgeMap& em) : |
| 564 | ReferenceMap<Edge, T, T&, const T&>(em) {} |
565 | 565 | ///Assignment operator |
566 | 566 | template <typename CMap> |
567 | 567 | EdgeMap& operator=(const CMap&) { |
… |
… |
|
748 | 748 | template <typename _Graph> |
749 | 749 | struct Constraints { |
750 | 750 | void constraints() { |
| 751 | checkConcept<BaseGraphComponent, _Graph>(); |
751 | 752 | checkConcept<IterableGraphComponent<>, _Graph>(); |
752 | 753 | checkConcept<IDableGraphComponent<>, _Graph>(); |
753 | 754 | checkConcept<MappableGraphComponent<>, _Graph>(); |
diff --git a/lemon/concepts/graph_components.h b/lemon/concepts/graph_components.h
a
|
b
|
|
988 | 988 | /// This class describes the concept of standard graph maps, i.e. |
989 | 989 | /// the \c NodeMap, \c ArcMap and \c EdgeMap subtypes of digraph and |
990 | 990 | /// graph types, which can be used for associating data to graph items. |
| 991 | /// The standard graph maps must conform to the ReferenceMap concept. |
991 | 992 | template <typename GR, typename K, typename V> |
992 | | class GraphMap : public ReadWriteMap<K, V> { |
| 993 | class GraphMap : public ReferenceMap<K, V, V&, const V&> { |
993 | 994 | public: |
994 | 995 | |
995 | 996 | typedef ReadWriteMap<K, V> Parent; |
… |
… |
|
1000 | 1001 | typedef K Key; |
1001 | 1002 | /// The value type of the map. |
1002 | 1003 | typedef V Value; |
| 1004 | /// The reference type of the map. |
| 1005 | typedef Value& Reference; |
| 1006 | /// The const reference type of the map. |
| 1007 | typedef const Value& ConstReference; |
| 1008 | |
| 1009 | // The reference map tag. |
| 1010 | typedef True ReferenceMapTag; |
1003 | 1011 | |
1004 | 1012 | /// \brief Construct a new map. |
1005 | 1013 | /// |
… |
… |
|
1031 | 1039 | template<typename _Map> |
1032 | 1040 | struct Constraints { |
1033 | 1041 | void constraints() { |
1034 | | checkConcept<ReadWriteMap<Key, Value>, _Map >(); |
| 1042 | checkConcept |
| 1043 | <ReferenceMap<Key, Value, Value&, const Value&>, _Map>(); |
1035 | 1044 | _Map m1(g); |
1036 | 1045 | _Map m2(g,t); |
1037 | 1046 | |
… |
… |
|
1073 | 1082 | /// \brief Standard graph map for the nodes. |
1074 | 1083 | /// |
1075 | 1084 | /// Standard graph map for the nodes. |
| 1085 | /// It conforms to the ReferenceMap concept. |
1076 | 1086 | template <typename V> |
1077 | | class NodeMap : public GraphMap<Digraph, Node, V> { |
| 1087 | class NodeMap : public GraphMap<MappableDigraphComponent, Node, V> { |
1078 | 1088 | public: |
1079 | 1089 | typedef GraphMap<MappableDigraphComponent, Node, V> Parent; |
1080 | 1090 | |
… |
… |
|
1110 | 1120 | /// \brief Standard graph map for the arcs. |
1111 | 1121 | /// |
1112 | 1122 | /// Standard graph map for the arcs. |
| 1123 | /// It conforms to the ReferenceMap concept. |
1113 | 1124 | template <typename V> |
1114 | | class ArcMap : public GraphMap<Digraph, Arc, V> { |
| 1125 | class ArcMap : public GraphMap<MappableDigraphComponent, Arc, V> { |
1115 | 1126 | public: |
1116 | 1127 | typedef GraphMap<MappableDigraphComponent, Arc, V> Parent; |
1117 | 1128 | |
… |
… |
|
1207 | 1218 | /// \brief Standard graph map for the edges. |
1208 | 1219 | /// |
1209 | 1220 | /// Standard graph map for the edges. |
| 1221 | /// It conforms to the ReferenceMap concept. |
1210 | 1222 | template <typename V> |
1211 | | class EdgeMap : public GraphMap<Graph, Edge, V> { |
| 1223 | class EdgeMap : public GraphMap<MappableGraphComponent, Edge, V> { |
1212 | 1224 | public: |
1213 | 1225 | typedef GraphMap<MappableGraphComponent, Edge, V> Parent; |
1214 | 1226 | |