lemon/concept/graph_component.h
author alpar
Wed, 13 Jul 2005 20:02:29 +0000
changeset 1556 caf0f91e16a7
parent 1435 8e85e6bbefdf
child 1563 0853ed07a677
permissions -rw-r--r--
Avoid ambiguity.
     1 /* -*- C++ -*-
     2  * lemon/concept/graph_component.h - Part of LEMON, a generic C++ optimization library
     3  *
     4  * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     5  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     6  *
     7  * Permission to use, modify and distribute this software is granted
     8  * provided that this copyright notice appears in all copies. For
     9  * precise terms see the accompanying LICENSE file.
    10  *
    11  * This software is provided "AS IS" with no warranty of any kind,
    12  * express or implied, and with no claim as to its suitability for any
    13  * purpose.
    14  *
    15  */
    16 
    17 ///\ingroup graph_concepts
    18 ///\file
    19 ///\brief The graph components.
    20 
    21 
    22 #ifndef LEMON_CONCEPT_GRAPH_COMPONENT_H
    23 #define LEMON_CONCEPT_GRAPH_COMPONENT_H
    24 
    25 #include <lemon/invalid.h>
    26 #include <lemon/concept/maps.h>
    27 
    28 #include <lemon/bits/alteration_notifier.h>
    29 
    30 namespace lemon {
    31   namespace concept {
    32 
    33     /// \addtogroup graph_concepts
    34     /// @{
    35 
    36     /****************   Graph iterator concepts   ****************/
    37 
    38     /// Skeleton class for graph Node and Edge types
    39 
    40     /// This class describes the interface of Node and Edge (and UndirEdge
    41     /// in undirected graphs) subtypes of graph types.
    42     ///
    43     /// \note This class is a template class so that we can use it to
    44     /// create graph skeleton classes. The reason for this is than Node
    45     /// and Edge types should \em not derive from the same base class.
    46     /// For Node you should instantiate it with character 'n' and for Edge
    47     /// with 'e'.
    48 
    49 #ifndef DOXYGEN
    50     template <char _selector = '0'>
    51 #endif
    52     class GraphItem {
    53     public:
    54       /// Default constructor.
    55       
    56       /// \warning The default constructor is not required to set
    57       /// the item to some well-defined value. So you should consider it
    58       /// as uninitialized.
    59       GraphItem() {}
    60       /// Copy constructor.
    61       
    62       /// Copy constructor.
    63       ///
    64       GraphItem(GraphItem const&) {}
    65       /// Invalid constructor \& conversion.
    66 
    67       /// This constructor initializes the item to be invalid.
    68       /// \sa Invalid for more details.
    69       GraphItem(Invalid) {}
    70       /// Assign operator for nodes.
    71 
    72       /// The nodes are assignable. 
    73       ///
    74       GraphItem& operator=(GraphItem const&) { return *this; }
    75       /// Equality operator.
    76       
    77       /// Two iterators are equal if and only if they represents the
    78       /// same node in the graph or both are invalid.
    79       bool operator==(GraphItem) const { return false; }
    80       /// Inequality operator.
    81 	
    82       /// \sa operator==(const Node& n)
    83       ///
    84       bool operator!=(GraphItem) const { return false; }
    85 
    86       /// Artificial ordering operator.
    87 
    88       /// To allow the use of graph descriptors as key type in std::map or
    89       /// similar associative container we require this.
    90       ///
    91       /// \note This operator only have to define some strict ordering of
    92       /// the items; this order has nothing to do with the iteration
    93       /// ordering of the items.
    94       ///
    95       /// \bug This is a technical requirement. Do we really need this?
    96       bool operator<(GraphItem) const { return false; }
    97 
    98       template<typename _GraphItem>
    99       struct Constraints {
   100 	void constraints() {
   101 	  _GraphItem i1;
   102 	  _GraphItem i2 = i1;
   103 	  _GraphItem i3 = INVALID;
   104 	  
   105 	  i1 = i2 = i3;
   106 
   107 	  bool b;
   108 	  //	  b = (ia == ib) && (ia != ib) && (ia < ib);
   109 	  b = (ia == ib) && (ia != ib);
   110 	  b = (ia == INVALID) && (ib != INVALID);
   111 	  //	  b = (ia < ib);
   112 	}
   113 
   114 	const _GraphItem &ia;
   115 	const _GraphItem &ib;
   116       };
   117     };
   118 
   119     /// A type describing the concept of graph node
   120 
   121     /// This is an instantiation of \ref GraphItem which can be used as a
   122     /// Node subtype in graph skeleton definitions
   123     typedef GraphItem<'n'> GraphNode;
   124 
   125     /// A type describing the concept of graph edge
   126 
   127     /// This is an instantiation of \ref GraphItem which can be used as a
   128     /// Edge subtype in graph skeleton definitions
   129     typedef GraphItem<'e'> GraphEdge;
   130 
   131 
   132     /**************** Basic features of graphs ****************/
   133 
   134     /// An empty base graph class.
   135   
   136     /// This class provides the minimal set of features needed for a graph
   137     /// structure. All graph concepts have to be conform to this base
   138     /// graph.
   139     ///
   140     /// \bug This is not true. The minimal graph concept is the
   141     /// BaseIterableGraphComponent.
   142 
   143     class BaseGraphComponent {
   144     public:
   145 
   146       typedef BaseGraphComponent Graph;
   147       
   148       /// Node class of the graph.
   149 
   150       /// This class represents the Nodes of the graph. 
   151       ///
   152       typedef GraphItem<'n'> Node;
   153 
   154       /// Edge class of the graph.
   155 
   156       /// This class represents the Edges of the graph. 
   157       ///
   158       typedef GraphItem<'e'> Edge;
   159 
   160       ///Gives back the target node of an edge.
   161 
   162       ///Gives back the target node of an edge.
   163       ///
   164       Node target(const Edge&) const { return INVALID;}
   165 
   166       ///Gives back the source node of an edge.
   167 
   168       ///Gives back the source node of an edge.
   169       ///
   170       Node source(const Edge&) const { return INVALID;}
   171 
   172 
   173       template <typename _Graph>
   174       struct Constraints {
   175 	typedef typename _Graph::Node Node;
   176 	typedef typename _Graph::Edge Edge;
   177       
   178 	void constraints() {
   179 	  checkConcept<GraphItem<'n'>, Node>();
   180 	  checkConcept<GraphItem<'e'>, Edge>();
   181 	  {
   182 	    Node n;
   183 	    Edge e;
   184 	    n = graph.source(e);
   185 	    n = graph.target(e);
   186 	  }      
   187 	}
   188       
   189 	const _Graph& graph;
   190       };
   191     };
   192 
   193     /// An empty iterable base graph class.
   194   
   195     /// This class provides beside the core graph features
   196     /// core iterable interface for the graph structure.
   197     /// Most of the base graphs should be conform to this concept.
   198 
   199     class BaseIterableGraphComponent : virtual public BaseGraphComponent {
   200     public:
   201 
   202       typedef BaseGraphComponent::Node Node;
   203       typedef BaseGraphComponent::Edge Edge;
   204 
   205       /// Gives back the first Node in the iterating order.
   206       
   207       /// Gives back the first Node in the iterating order.
   208       ///     
   209       void first(Node&) const {}
   210 
   211       /// Gives back the next Node in the iterating order.
   212       
   213       /// Gives back the next Node in the iterating order.
   214       ///     
   215       void next(Node&) const {}
   216 
   217       /// Gives back the first Edge in the iterating order.
   218       
   219       /// Gives back the first Edge in the iterating order.
   220       ///     
   221       void first(Edge&) const {}
   222       /// Gives back the next Edge in the iterating order.
   223       
   224       /// Gives back the next Edge in the iterating order.
   225       ///     
   226       void next(Edge&) const {}
   227 
   228 
   229       /// Gives back the first of the Edges point to the given Node.
   230       
   231       /// Gives back the first of the Edges point to the given Node.
   232       ///     
   233       void firstIn(Edge&, const Node&) const {}
   234 
   235       /// Gives back the next of the Edges points to the given Node.
   236 
   237 
   238       /// Gives back the next of the Edges points to the given Node.
   239       ///
   240       void nextIn(Edge&) const {}
   241 
   242       /// Gives back the first of the Edges start from the given Node.
   243       
   244       /// Gives back the first of the Edges start from the given Node.
   245       ///     
   246       void firstOut(Edge&, const Node&) const {}
   247 
   248       /// Gives back the next of the Edges start from the given Node.
   249       
   250       /// Gives back the next of the Edges start from the given Node.
   251       ///     
   252       void nextOut(Edge&) const {}
   253 
   254 
   255       template <typename _Graph>
   256       struct Constraints {
   257       
   258 	void constraints() {
   259 	  checkConcept< BaseGraphComponent, _Graph >();
   260 	  typename _Graph::Node node;      
   261 	  typename _Graph::Edge edge;
   262 	  {
   263 	    graph.first(node);
   264 	    graph.next(node);
   265 	  }
   266 	  {
   267 	    graph.first(edge);
   268 	    graph.next(edge);
   269 	  }
   270 	  {
   271 	    graph.firstIn(edge, node);
   272 	    graph.nextIn(edge);
   273 	  }
   274 	  {
   275 	    graph.firstOut(edge, node);
   276 	    graph.nextOut(edge);
   277 	  }
   278 	}
   279 
   280 	const _Graph& graph;
   281       };
   282     };
   283 
   284     /// An empty idable base graph class.
   285   
   286     /// This class provides beside the core graph features
   287     /// core id functions for the graph structure.
   288     /// The most of the base graphs should be conform to this concept.
   289     /// The id's are unique and immutable.
   290     class IDableGraphComponent : virtual public BaseGraphComponent {
   291     public:
   292 
   293       typedef BaseGraphComponent::Node Node;
   294       typedef BaseGraphComponent::Edge Edge;
   295 
   296       /// Gives back an unique integer id for the Node. 
   297 
   298       /// Gives back an unique integer id for the Node. 
   299       ///
   300       int id(const Node&) const { return -1;}
   301 
   302       /// \brief Gives back the node by the unique id.
   303       ///
   304       /// Gives back the node by the unique id.
   305       /// If the graph does not contain node with the given id
   306       /// then the result of the function is undetermined. 
   307       Node fromId(int , Node) const { return INVALID;}
   308 
   309       /// \brief Gives back an unique integer id for the Edge. 
   310       ///
   311       /// Gives back an unique integer id for the Edge. 
   312       ///
   313       int id(const Edge&) const { return -1;}
   314 
   315       /// \brief Gives back the edge by the unique id.
   316       ///
   317       /// Gives back the edge by the unique id.
   318       /// If the graph does not contain edge with the given id
   319       /// then the result of the function is undetermined. 
   320       Edge fromId(int, Edge) const { return INVALID;}
   321 
   322       template <typename _Graph>
   323       struct Constraints {
   324 
   325 	void constraints() {
   326 	  checkConcept< BaseGraphComponent, _Graph >();
   327 	  typename _Graph::Node node;
   328 	  int nid = graph.id(node);
   329 	  nid = graph.id(node);
   330 	  node = graph.fromId(nid, Node());
   331 	  typename _Graph::Edge edge;
   332 	  int eid = graph.id(edge);
   333 	  eid = graph.id(edge);
   334 	  edge = graph.fromId(eid, Edge());
   335 	}
   336 
   337 	const _Graph& graph;
   338       };
   339     };
   340 
   341 
   342     /// An empty max-idable base graph class.
   343   
   344     /// This class provides beside the core graph features
   345     /// core max id functions for the graph structure.
   346     /// The most of the base graphs should be conform to this concept.
   347     /// The id's are unique and immutable.
   348     class MaxIDableGraphComponent : virtual public BaseGraphComponent {
   349     public:
   350 
   351       /// Gives back an integer greater or equal to the maximum Node id. 
   352 
   353       /// Gives back an integer greater or equal to the maximum Node id. 
   354       ///
   355       int maxId(Node = INVALID) const { return -1;}
   356 
   357       /// Gives back an integer greater or equal to the maximum Edge id. 
   358 
   359       /// Gives back an integer greater or equal to the maximum Edge id. 
   360       ///
   361       int maxId(Edge = INVALID) const { return -1;}
   362 
   363       template <typename _Graph>
   364       struct Constraints {
   365 
   366 	void constraints() {
   367 	  checkConcept<BaseGraphComponent, _Graph>();
   368 	  int nid = graph.maxId(typename _Graph::Node());
   369 	  ignore_unused_variable_warning(nid);
   370 	  int eid = graph.maxId(typename _Graph::Edge());
   371 	  ignore_unused_variable_warning(eid);
   372 	}
   373       
   374 	const _Graph& graph;
   375       };
   376     };
   377 
   378     /// An empty extendable base graph class.
   379   
   380     /// This class provides beside the core graph features
   381     /// core graph extend interface for the graph structure.
   382     /// The most of the base graphs should be conform to this concept.
   383     class BaseExtendableGraphComponent : virtual public BaseGraphComponent {
   384     public:
   385 
   386       typedef BaseGraphComponent::Node Node;
   387       typedef BaseGraphComponent::Edge Edge;
   388 
   389       /// Adds a new Node to the graph.
   390 
   391       /// Adds a new Node to the graph.
   392       ///
   393       Node addNode() {
   394 	return INVALID;
   395       }
   396     
   397       /// Adds a new Edge connects the two Nodes to the graph.
   398 
   399       /// Adds a new Edge connects the two Nodes to the graph.
   400       ///
   401       Edge addEdge(const Node&, const Node&) {
   402 	return INVALID;
   403       }
   404 
   405       template <typename _Graph>
   406       struct Constraints {
   407 	void constraints() {
   408 	  checkConcept<BaseGraphComponent, _Graph >();
   409 	  typename _Graph::Node node_a, node_b;
   410 	  node_a = graph.addNode();
   411 	  node_b = graph.addNode();
   412 	  typename _Graph::Edge edge;
   413 	  edge = graph.addEdge(node_a, node_b);
   414 	}
   415 
   416 	_Graph& graph;
   417       };
   418     };
   419 
   420     /// An empty erasable base graph class.
   421   
   422     /// This class provides beside the core graph features
   423     /// core erase functions for the graph structure.
   424     /// The most of the base graphs should be conform to this concept.
   425     class BaseErasableGraphComponent : virtual public BaseGraphComponent {
   426     public:
   427 
   428       typedef BaseGraphComponent::Node Node;
   429       typedef BaseGraphComponent::Edge Edge;
   430 
   431       /// Erase a Node from the graph.
   432       
   433       /// Erase a Node from the graph. This function should not
   434       /// erase edges connecting to the Node.
   435       void erase(const Node&) {}    
   436 
   437       /// Erase an Edge from the graph.
   438 
   439       /// Erase an Edge from the graph.
   440       ///
   441       void erase(const Edge&) {}
   442 
   443       template <typename _Graph>
   444       struct Constraints {
   445 	void constraints() {
   446 	  checkConcept<BaseGraphComponent, _Graph>();
   447 	  typename _Graph::Node node;
   448 	  graph.erase(node);
   449 	  typename _Graph::Edge edge;
   450 	  graph.erase(edge);
   451 	}
   452 
   453 	_Graph& graph;
   454       };
   455     };
   456 
   457     /// An empty clearable base graph class.
   458   
   459     /// This class provides beside the core graph features
   460     /// core clear functions for the graph structure.
   461     /// The most of the base graphs should be conform to this concept.
   462     class ClearableGraphComponent : virtual public BaseGraphComponent {
   463     public:
   464 
   465       /// Erase all the Nodes and Edges from the graph.
   466 
   467       /// Erase all the Nodes and Edges from the graph.
   468       ///
   469       void clear() {}    
   470 
   471       template <typename _Graph>
   472       struct Constraints {
   473 	void constraints() {
   474 	  checkConcept<BaseGraphComponent, _Graph>();
   475 	  graph.clear();
   476 	}
   477 
   478 	_Graph graph;
   479       };
   480     };
   481 
   482 
   483     /// Skeleton class for graph NodeIt and EdgeIt
   484 
   485     /// Skeleton class for graph NodeIt and EdgeIt.
   486     ///
   487     template <typename _Graph, typename _Item>
   488     class GraphIterator : public _Item {
   489     public:
   490       /// \todo Don't we need the Item type as typedef?
   491 
   492       /// Default constructor.
   493       
   494       /// @warning The default constructor sets the iterator
   495       /// to an undefined value.
   496       GraphIterator() {}
   497       /// Copy constructor.
   498       
   499       /// Copy constructor.
   500       ///
   501       GraphIterator(GraphIterator const&) {}
   502       /// Sets the iterator to the first item.
   503       
   504       /// Sets the iterator to the first item of \c the graph.
   505       ///
   506       explicit GraphIterator(const _Graph&) {}
   507       /// Invalid constructor \& conversion.
   508 
   509       /// This constructor initializes the item to be invalid.
   510       /// \sa Invalid for more details.
   511       GraphIterator(Invalid) {}
   512       /// Assign operator for items.
   513 
   514       /// The items are assignable. 
   515       ///
   516       GraphIterator& operator=(GraphIterator const&) { return *this; }      
   517       /// Next item.
   518 
   519       /// Assign the iterator to the next item.
   520       ///
   521       GraphIterator& operator++() { return *this; }
   522       //	Node operator*() const { return INVALID; }
   523       /// Equality operator
   524 
   525       /// Two iterators are equal if and only if they point to the
   526       /// same object or both are invalid.
   527       bool operator==(const GraphIterator&) const { return true;}
   528       /// Inequality operator
   529 	
   530       /// \sa operator==(Node n)
   531       ///
   532       bool operator!=(const GraphIterator&) const { return true;}
   533       
   534       template<typename _GraphIterator>
   535       struct Constraints {
   536 	void constraints() {
   537 	  //	  checkConcept< Item, _GraphIterator >();
   538 	  _GraphIterator it1(g);
   539 	
   540 	  /// \todo Do we need NodeIt(Node) kind of constructor?
   541 	  //	_GraphIterator it2(bj);
   542 	  _GraphIterator it2;
   543 
   544 	  it2 = ++it1;
   545 	  ++it2 = it1;
   546 	  ++(++it1);
   547 	  /// \bug This should be: is_base_and_derived<BaseItem, _GraphIterator>
   548 	  _Item bi = it1;
   549 	  bi = it2;
   550 	}
   551 	_Graph& g;
   552       };
   553     };
   554 
   555     /// Skeleton class for graph InEdgeIt and OutEdgeIt
   556 
   557     /// \note Because InEdgeIt and OutEdgeIt may not inherit from the same
   558     /// base class, the _selector is a additional template parameter. For 
   559     /// InEdgeIt you should instantiate it with character 'i' and for 
   560     /// OutEdgeIt with 'o'.
   561     /// \todo Is this a good name for this concept?
   562     template <typename Graph,
   563 	      typename Edge = typename Graph::Edge,
   564 	      char _selector = '0'>
   565     class GraphIncIterator : public Edge {
   566     public:
   567       /// Default constructor.
   568       
   569       /// @warning The default constructor sets the iterator
   570       /// to an undefined value.
   571       GraphIncIterator() {}
   572       /// Copy constructor.
   573       
   574       /// Copy constructor.
   575       ///
   576       GraphIncIterator(GraphIncIterator const& gi) :Edge(gi) {}
   577       /// Sets the iterator to the first edge incoming into or outgoing 
   578       /// from the node.
   579       
   580       /// Sets the iterator to the first edge incoming into or outgoing 
   581       /// from the node.
   582       ///
   583       explicit GraphIncIterator(const Graph&, const typename Graph::Node&) {}
   584       /// Invalid constructor \& conversion.
   585 
   586       /// This constructor initializes the item to be invalid.
   587       /// \sa Invalid for more details.
   588       GraphIncIterator(Invalid) {}
   589       /// Assign operator for nodes.
   590 
   591       /// The nodes are assignable. 
   592       ///
   593       GraphIncIterator& operator=(GraphIncIterator const&) { return *this; }      
   594       /// Next edge.
   595 
   596       /// Assign the iterator to the next node.
   597       ///
   598       GraphIncIterator& operator++() { return *this; }
   599 
   600       //	Node operator*() const { return INVALID; }
   601 
   602       /// Equality operator
   603 
   604       /// Two iterators are equal if and only if they point to the
   605       /// same object or both are invalid.
   606       bool operator==(const GraphIncIterator&) const { return true;}
   607 
   608       /// Inequality operator
   609 	
   610       /// \sa operator==(Node n)
   611       ///
   612       bool operator!=(const GraphIncIterator&) const { return true;}
   613 
   614       template <typename _GraphIncIterator>
   615       struct Constraints {
   616 	typedef typename Graph::Node Node;
   617 	void constraints() {
   618 	  checkConcept<GraphItem<'e'>, _GraphIncIterator>();
   619 	  _GraphIncIterator it1(graph, node);
   620 	  /// \todo Do we need OutEdgeIt(Edge) kind of constructor?
   621 	  //	_GraphIncIterator it2(edge);
   622 	  _GraphIncIterator it2;
   623 
   624 	  it2 = ++it1;
   625 	  ++it2 = it1;
   626 	  ++(++it1);
   627 	  Edge e = it1;
   628 	  e = it2;
   629 
   630 	  const_constraits();
   631 	}
   632 
   633 	void const_constraits() {
   634 	  Node n = graph.baseNode(it);
   635 	  n = graph.runningNode(it);
   636 	}
   637 
   638 	Edge edge;
   639 	Node node;
   640 	Graph graph;
   641 	_GraphIncIterator it;
   642       };
   643     };
   644 
   645 
   646     /// An empty iterable base graph class.
   647   
   648     /// This class provides beside the core graph features
   649     /// iterator based iterable interface for the graph structure.
   650     /// This concept is part of the StaticGraphConcept.
   651     class IterableGraphComponent : virtual public BaseGraphComponent {
   652 
   653     public:
   654     
   655       typedef IterableGraphComponent Graph;
   656 
   657       typedef BaseGraphComponent::Node Node;
   658       typedef BaseGraphComponent::Edge Edge;
   659 
   660       /// This iterator goes through each node.
   661 
   662       /// This iterator goes through each node.
   663       ///
   664       typedef GraphIterator<Graph, Node> NodeIt;
   665       /// This iterator goes through each node.
   666 
   667       /// This iterator goes through each node.
   668       ///
   669       typedef GraphIterator<Graph, Edge> EdgeIt;
   670       /// This iterator goes trough the incoming edges of a node.
   671 
   672       /// This iterator goes trough the \e inccoming edges of a certain node
   673       /// of a graph.
   674       typedef GraphIncIterator<Graph, Edge, 'i'> InEdgeIt;
   675       /// This iterator goes trough the outgoing edges of a node.
   676 
   677       /// This iterator goes trough the \e outgoing edges of a certain node
   678       /// of a graph.
   679       typedef GraphIncIterator<Graph, Edge, 'o'> OutEdgeIt;
   680     };
   681     
   682     template <typename _Graph> 
   683     struct Constraints {
   684       void constraints() {
   685   	checkConcept< BaseGraphComponent, _Graph>();
   686 
   687 	checkConcept<GraphIterator<_Graph, typename _Graph::Edge>,
   688 	  typename _Graph::EdgeIt >();
   689 	checkConcept<GraphIterator<_Graph, typename _Graph::Node>,
   690 	  typename _Graph::NodeIt >();
   691 	checkConcept<GraphIncIterator<_Graph>, typename _Graph::InEdgeIt >();
   692 	checkConcept<GraphIncIterator<_Graph>, typename _Graph::OutEdgeIt >();
   693       }
   694     };
   695 
   696     /// An empty alteration notifier base graph class.
   697   
   698     /// This class provides beside the core graph features
   699     /// alteration notifier interface for the graph structure.
   700     /// This is an observer-notifier pattern. More Obsevers can
   701     /// be registered into the notifier and whenever an alteration
   702     /// occured in the graph all the observers will notified about it.
   703     class AlterableGraphComponent : virtual public BaseGraphComponent {
   704     public:
   705 
   706       /// The edge observer registry.
   707       typedef AlterationNotifier<Edge> EdgeNotifier;
   708       /// The node observer registry.
   709       typedef AlterationNotifier<Node> NodeNotifier;
   710       
   711       /// \brief Gives back the edge alteration notifier.
   712       ///
   713       /// Gives back the edge alteration notifier.
   714       EdgeNotifier getNotifier(Edge) const {
   715 	return EdgeNotifier();
   716       }
   717       
   718       /// \brief Gives back the node alteration notifier.
   719       ///
   720       /// Gives back the node alteration notifier.
   721       NodeNotifier getNotifier(Node) const {
   722 	return NodeNotifier();
   723       }
   724       
   725     };
   726 
   727 
   728     /// Class describing the concept of graph maps
   729 
   730     /// This class describes the common interface of the graph maps
   731     /// (NodeMap, EdgeMap), that is \ref maps-pages "maps" which can be used to
   732     /// associate data to graph descriptors (nodes or edges).
   733     template <typename Graph, typename Item, typename _Value>
   734     class GraphMap : public ReadWriteMap<Item, _Value> {
   735     protected:      
   736       GraphMap() {}
   737     public:
   738       /// \brief Construct a new map.
   739       ///
   740       /// Construct a new map for the graph.
   741       explicit GraphMap(const Graph&) {}
   742       /// \brief Construct a new map with default value.
   743       ///
   744       /// Construct a new map for the graph and initalise the values.
   745       GraphMap(const Graph&, const _Value&) {}
   746       /// \brief Copy constructor.
   747       ///
   748       /// Copy Constructor.
   749       GraphMap(const GraphMap& gm) :ReadWriteMap<Item, _Value>(gm) {}
   750       
   751       /// \brief Assign operator.
   752       ///
   753       /// Assign operator.
   754       GraphMap& operator=(const GraphMap&) { return *this;}
   755 
   756       template<typename _Map>
   757       struct Constraints {
   758 	void constraints() {
   759 	  checkConcept<ReadWriteMap<Item, _Value>, _Map >();
   760 	  // Construction with a graph parameter
   761 	  _Map a(g);
   762 	  // Constructor with a graph and a default value parameter
   763 	  _Map a2(g,t);
   764 	  // Copy constructor. Do we need it?
   765 	  _Map b=c;
   766 	  // Copy operator. Do we need it?
   767 	  a=b;
   768 
   769 	  ignore_unused_variable_warning(a2);
   770 	}
   771 
   772 	const _Map &c;
   773 	const Graph &g;
   774 	const typename GraphMap::Value &t;
   775       };
   776 
   777     };
   778 
   779     /// An empty mappable base graph class.
   780   
   781     /// This class provides beside the core graph features
   782     /// map interface for the graph structure.
   783     /// This concept is part of the StaticGraphConcept.
   784     class MappableGraphComponent : virtual public BaseGraphComponent {
   785     public:
   786 
   787       typedef MappableGraphComponent Graph;
   788 
   789       typedef BaseGraphComponent::Node Node;
   790       typedef BaseGraphComponent::Edge Edge;
   791 
   792       /// ReadWrite map of the nodes.
   793     
   794       /// ReadWrite map of the nodes.
   795       ///
   796       template <typename _Value>
   797       class NodeMap : public GraphMap<Graph, Node, _Value> {
   798       private:
   799 	NodeMap();
   800       public:
   801 	/// \brief Construct a new map.
   802 	///
   803 	/// Construct a new map for the graph.
   804 	/// \todo call the right parent class constructor
   805 	explicit NodeMap(const Graph&) {}
   806 	/// \brief Construct a new map with default value.
   807 	///
   808 	/// Construct a new map for the graph and initalise the values.
   809 	NodeMap(const Graph&, const _Value&) {}
   810 	/// \brief Copy constructor.
   811 	///
   812 	/// Copy Constructor.
   813 	NodeMap(const NodeMap& nm) : GraphMap<Graph, Node, _Value>(nm) {}
   814 
   815 	/// \brief Assign operator.
   816 	///
   817 	/// Assign operator.
   818 	NodeMap& operator=(const NodeMap&) { return *this;}
   819 
   820       };
   821 
   822       /// ReadWrite map of the edges.
   823     
   824       /// ReadWrite map of the edges.
   825       ///
   826       template <typename _Value>
   827       class EdgeMap : public GraphMap<Graph, Edge, _Value> {
   828       private:
   829 	EdgeMap();
   830       public:
   831 	/// \brief Construct a new map.
   832 	///
   833 	/// Construct a new map for the graph.
   834 	/// \todo call the right parent class constructor
   835 	explicit EdgeMap(const Graph&) {}
   836 	/// \brief Construct a new map with default value.
   837 	///
   838 	/// Construct a new map for the graph and initalise the values.
   839 	EdgeMap(const Graph&, const _Value&) {}
   840 	/// \brief Copy constructor.
   841 	///
   842 	/// Copy Constructor.
   843 	EdgeMap(const EdgeMap& em) :GraphMap<Graph, Edge, _Value>(em) {}
   844 
   845 	/// \brief Assign operator.
   846 	///
   847 	/// Assign operator.
   848 	EdgeMap& operator=(const EdgeMap&) { return *this;}
   849 
   850       };
   851 
   852       template <typename _Graph>
   853       struct Constraints {
   854 
   855 	struct Type {
   856 	  int value;
   857 	  Type() : value(0) {}
   858 	  Type(int _v) : value(_v) {}
   859 	};
   860 
   861 	void constraints() {
   862 	  checkConcept<BaseGraphComponent, _Graph>();
   863 	  { // int map test
   864 	    typedef typename _Graph::template NodeMap<int> IntNodeMap;
   865 	    checkConcept<GraphMap<_Graph, typename _Graph::Node, int>, 
   866 	      IntNodeMap >();
   867 	  } { // bool map test
   868 	    typedef typename _Graph::template NodeMap<bool> BoolNodeMap;
   869 	    checkConcept<GraphMap<_Graph, typename _Graph::Node, bool>,
   870 	      BoolNodeMap >();
   871 	  } { // Type map test
   872 	    typedef typename _Graph::template NodeMap<Type> TypeNodeMap;
   873 	    checkConcept<GraphMap<_Graph, typename _Graph::Node, Type>,
   874 	      TypeNodeMap >();
   875 	  } 
   876 
   877 	  { // int map test
   878 	    typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
   879 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
   880 	      IntEdgeMap >();
   881 	  } { // bool map test
   882 	    typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
   883 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
   884 	      BoolEdgeMap >();
   885 	  } { // Type map test
   886 	    typedef typename _Graph::template EdgeMap<Type> TypeEdgeMap;
   887 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, Type>, 
   888 	      TypeEdgeMap >();
   889 	  } 
   890 	}
   891 
   892 	_Graph& graph;
   893       };
   894     };
   895 
   896     /// \brief An empty extendable extended graph class.
   897     ///
   898     /// This class provides beside the core graph features
   899     /// item addition interface for the graph structure.
   900     /// The difference between this class and the 
   901     /// \c BaseExtendableGraphComponent is that it should
   902     /// notify the item alteration observers.
   903     class ExtendableGraphComponent : virtual public BaseGraphComponent {
   904     public:
   905 
   906       typedef ExtendableGraphComponent Graph;
   907 
   908       typedef BaseGraphComponent::Node Node;
   909       typedef BaseGraphComponent::Edge Edge;
   910 
   911       /// \brief Add a node to the graph.
   912       ///
   913       /// Add a node to the graph and notify the observers.
   914       Node addNode() {
   915 	return INVALID;
   916       }
   917     
   918       /// \brief Add an edge to the graph.
   919       ///
   920       /// Add an edge to the graph and notify the observers.
   921       Edge addEdge(const Node&, const Node&) {
   922 	return INVALID;
   923       }
   924 
   925       template <typename _Graph>
   926       struct Constraints {
   927 	void constraints() {
   928 	  checkConcept<BaseGraphComponent, _Graph >();
   929 	  typename _Graph::Node node_a, node_b;
   930 	  node_a = graph.addNode();
   931 	  node_b = graph.addNode();
   932 	  typename _Graph::Edge edge;
   933 	  edge = graph.addEdge(node_a, node_b);      
   934 	}
   935 	_Graph& graph;
   936       };
   937     };
   938 
   939     /// \brief An empty erasable extended graph class.
   940     ///
   941     /// This class provides beside the core graph features
   942     /// item erase interface for the graph structure.
   943     /// The difference between this class and the 
   944     /// \c BaseErasableGraphComponent is that it should
   945     /// notify the item alteration observers.
   946     class ErasableGraphComponent : virtual public BaseGraphComponent {
   947     public:
   948 
   949       typedef ErasableGraphComponent Graph;
   950 
   951       typedef BaseGraphComponent::Node Node;
   952       typedef BaseGraphComponent::Edge Edge;
   953 
   954       /// \brief Erase the Node and notify the node alteration observers.
   955       ///
   956       ///  Erase the Node and notify the node alteration observers.
   957       void erase(const Node&) {}    
   958 
   959       /// \brief Erase the Edge and notify the edge alteration observers.
   960       ///
   961       ///  Erase the Edge and notify the edge alteration observers.
   962       void erase(const Edge&) {}
   963 
   964       template <typename _Graph>
   965       struct Constraints {
   966 	void constraints() {
   967 	  checkConcept<BaseGraphComponent, _Graph >();
   968 	  typename _Graph::Node node;
   969 	  graph.erase(node);
   970 	  typename _Graph::Edge edge;
   971 	  graph.erase(edge);      
   972 	}
   973 
   974 	_Graph& graph;
   975       };
   976     };
   977 
   978     /// @}
   979 
   980   }
   981 
   982 }
   983 
   984 #endif