src/lemon/concept/graph_component.h
changeset 959 c80ef5912903
child 961 289d80c33f04
equal deleted inserted replaced
-1:000000000000 0:bc1737f22e0f
       
     1 /* -*- C++ -*-
       
     2  * src/lemon/concept/graph_component.h - Part of LEMON, a generic C++ optimization library
       
     3  *
       
     4  * Copyright (C) 2004 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
       
     5  * (Egervary Combinatorial Optimization Research Group, 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 concept
       
    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 namespace lemon {
       
    29   namespace concept {
       
    30 
       
    31     /// An empty base graph class.
       
    32   
       
    33     /// This class provides the most minimal features of a graph structure.
       
    34     /// All the graph concepts have to be conform to this base graph.
       
    35 
       
    36     class BaseGraphComponent {
       
    37     public:
       
    38 
       
    39       typedef BaseGraphComponent Graph;
       
    40       
       
    41       /// Node class of the graph.
       
    42 
       
    43       /// This class represents the Nodes of the graph. 
       
    44       ///
       
    45       class Node {
       
    46       public:
       
    47 
       
    48 	/// Default constructor.
       
    49 
       
    50 	/// @warning The default constructor sets the iterator
       
    51 	/// to an undefined value.
       
    52 
       
    53 	Node() {}
       
    54 	/// Copy constructor.
       
    55 
       
    56 	/// Copy constructor.
       
    57 	///
       
    58 	Node(const Node&) {}
       
    59 
       
    60 	/// Invalid constructor \& conversion.
       
    61 
       
    62 	/// This constructor initializes the iterator to be invalid.
       
    63 	/// \sa Invalid for more details.
       
    64 	Node(Invalid) {}
       
    65 
       
    66 
       
    67 	Node& operator=(const Node&) { return *this;}
       
    68 
       
    69 	/// Equality operator.
       
    70 
       
    71 	/// Two iterators are equal if and only if they represents the
       
    72 	/// same node in the graph or both are invalid.
       
    73 	bool operator==(const Node&) { return true;}
       
    74 
       
    75 
       
    76 	/// Inequality operator.
       
    77 	
       
    78 	/// \sa operator==(const Node& n)
       
    79 	///
       
    80 	bool operator!=(const Node&) { return true;}
       
    81 
       
    82  	/// Comparison operator.
       
    83 
       
    84 	/// This is a strict ordering between the nodes.
       
    85 	///
       
    86 	/// This ordering can be different from the iterating order of nodes.
       
    87 	/// \todo Possibly we don't need it.
       
    88 	bool operator<(const Node&) { return true;}
       
    89       };
       
    90 
       
    91       /// Edge class of the graph.
       
    92 
       
    93       /// This class represents the Edges of the graph. 
       
    94       ///
       
    95       class Edge {
       
    96       public:
       
    97 
       
    98 	/// Default constructor.
       
    99 
       
   100 	/// @warning The default constructor sets the iterator
       
   101 	/// to an undefined value.
       
   102 
       
   103 	Edge() {}
       
   104 	/// Copy constructor.
       
   105 
       
   106 	/// Copy constructor.
       
   107 	///
       
   108 	Edge(const Edge&) {}
       
   109 
       
   110 	/// Invalid constructor \& conversion.
       
   111 
       
   112 	/// This constructor initializes the iterator to be invalid.
       
   113 	/// \sa Invalid for more details.
       
   114 	Edge(Invalid) {}
       
   115 
       
   116 
       
   117 	Edge& operator=(const Edge&) { return *this;}
       
   118 
       
   119 	/// Equality operator.
       
   120 
       
   121 	/// Two iterators are equal if and only if they represents the
       
   122 	/// same edge in the graph or both are invalid.
       
   123 	bool operator==(const Edge&) { return true;}
       
   124 
       
   125 
       
   126 	/// Inequality operator.
       
   127 	
       
   128 	/// \sa operator==(const Edge& n)
       
   129 	///
       
   130 	bool operator!=(const Edge&) { return true;}
       
   131 
       
   132  	/// Comparison operator.
       
   133 
       
   134 	/// This is a strict ordering between the edges.
       
   135 	///
       
   136 	/// This ordering can be different from the iterating order of edges.
       
   137 	/// \todo Possibly we don't need it.
       
   138 	bool operator<(const Edge&) { return true;}
       
   139       };
       
   140 
       
   141       ///Gives back the head node of an edge.
       
   142 
       
   143       ///Gives back the head node of an edge.
       
   144       ///
       
   145       Node head(const Edge&) const { return INVALID;}
       
   146 
       
   147       ///Gives back the tail node of an edge.
       
   148 
       
   149       ///Gives back the tail node of an edge.
       
   150       ///
       
   151       Node tail(const Edge&) const { return INVALID;}
       
   152     };
       
   153 
       
   154     /// Concept check structure for BaseGraph.
       
   155 
       
   156     /// Concept check structure for BaseGraph.
       
   157     ///
       
   158 
       
   159     template <typename Graph>
       
   160     struct BaseGraphComponentConcept {
       
   161       typedef typename Graph::Node Node;
       
   162       typedef typename Graph::Edge Edge;
       
   163       
       
   164       void constraints() {
       
   165 	{
       
   166 	  Node ni; 
       
   167 	  Node nj(ni); 
       
   168 	  Node nk(INVALID);
       
   169 	  ni = nj;
       
   170 	  bool b; b = true;
       
   171 	  b = (ni == INVALID); b = (ni != INVALID);
       
   172 	  b = (ni==nj); b = (ni != nj); b=( ni < nj);
       
   173 	}
       
   174 	{
       
   175 	  Edge ei; 
       
   176 	  Edge ej(ei); 
       
   177 	  Edge ek(INVALID);
       
   178 	  ei = ej;
       
   179 	  bool b; b = true;
       
   180 	  b = (ei == INVALID); b = (ei != INVALID);
       
   181 	  b = (ei==ej); b = (ei != ej); b=( ei < ej);
       
   182 	}
       
   183 	{
       
   184 	  const Graph& const_graph = graph;
       
   185 	  Node n;
       
   186 	  Edge e;
       
   187 	  n = const_graph.tail(e);
       
   188 	  n = const_graph.head(e);
       
   189 	}      
       
   190       }
       
   191       
       
   192       Graph& graph;
       
   193     };
       
   194 
       
   195     /// An empty iterable base graph class.
       
   196   
       
   197     /// This class provides beside the core graph features
       
   198     /// core iterable interface for the graph structure.
       
   199     /// Most of the base graphs should be conform to this concept.
       
   200 
       
   201     class BaseIterableGraphComponent : virtual public BaseGraphComponent {
       
   202     public:
       
   203 
       
   204       typedef BaseGraphComponent::Node Node;
       
   205       typedef BaseGraphComponent::Edge Edge;
       
   206 
       
   207       /// Gives back the first Node in the iterating order.
       
   208       
       
   209       /// Gives back the first Node in the iterating order.
       
   210       ///     
       
   211       void first(Node&) const {}
       
   212 
       
   213       /// Gives back the next Node in the iterating order.
       
   214       
       
   215       /// Gives back the next Node in the iterating order.
       
   216       ///     
       
   217       void next(Node&) const {}
       
   218 
       
   219       /// Gives back the first Edge in the iterating order.
       
   220       
       
   221       /// Gives back the first Edge in the iterating order.
       
   222       ///     
       
   223       void first(Edge&) const {}
       
   224       /// Gives back the next Edge in the iterating order.
       
   225       
       
   226       /// Gives back the next Edge in the iterating order.
       
   227       ///     
       
   228       void next(Edge&) const {}
       
   229 
       
   230 
       
   231       /// Gives back the first of the Edges point to the given Node.
       
   232       
       
   233       /// Gives back the first of the Edges point to the given Node.
       
   234       ///     
       
   235       void firstIn(Edge&, const Node&) const {}
       
   236 
       
   237       /// Gives back the next of the Edges points to the given Node.
       
   238 
       
   239 
       
   240       /// Gives back the next of the Edges points to the given Node.
       
   241       ///
       
   242       void nextIn(Edge&) const {}
       
   243 
       
   244       /// Gives back the first of the Edges start from the given Node.
       
   245       
       
   246       /// Gives back the first of the Edges start from the given Node.
       
   247       ///     
       
   248       void firstOut(Edge&, const Node&) const {}
       
   249 
       
   250       /// Gives back the next of the Edges start from the given Node.
       
   251       
       
   252       /// Gives back the next of the Edges start from the given Node.
       
   253       ///     
       
   254       void nextOut(Edge&) const {}
       
   255     };
       
   256 
       
   257 
       
   258     /// Concept check structure for IterableBaseGraph.
       
   259 
       
   260     /// Concept check structure for IterableBaseGraph.
       
   261     ///
       
   262     template <typename Graph>
       
   263     struct BaseIterableGraphComponentConcept {
       
   264       
       
   265       void constraints() { 
       
   266 	const Graph& const_graph = graph;
       
   267 	typename Graph::Node node;      
       
   268 	typename Graph::Edge edge;
       
   269 	{
       
   270 	  const_graph.first(node);
       
   271 	  const_graph.next(node);
       
   272 	}
       
   273 	{
       
   274 	  const_graph.first(edge);
       
   275 	  const_graph.next(edge);
       
   276 	}
       
   277 	{
       
   278 	  const_graph.firstIn(edge, node);
       
   279 	  const_graph.nextIn(edge);
       
   280 	}
       
   281 	{
       
   282 	  const_graph.firstOut(edge, node);
       
   283 	  const_graph.nextOut(edge);
       
   284 	}
       
   285       }
       
   286 
       
   287       Graph& graph;
       
   288     };
       
   289 
       
   290     /// An empty idable base graph class.
       
   291   
       
   292     /// This class provides beside the core graph features
       
   293     /// core id functions for the graph structure.
       
   294     /// The most of the base graphs should be conform to this concept.
       
   295     /// The id's are unique and immutable.
       
   296 
       
   297     class IDableGraphComponent : virtual public BaseGraphComponent {
       
   298     public:
       
   299 
       
   300       typedef BaseGraphComponent::Node Node;
       
   301       typedef BaseGraphComponent::Edge Edge;
       
   302 
       
   303       /// Gives back an unique integer id for the Node. 
       
   304 
       
   305       /// Gives back an unique integer id for the Node. 
       
   306       ///
       
   307       int id(const Node&) const { return -1;}
       
   308 
       
   309       /// 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 
       
   316 
       
   317     /// Concept check structure for IdableBaseGraph.
       
   318 
       
   319     /// Concept check structure for IdableBaseGraph.
       
   320     ///
       
   321     template <typename Graph>
       
   322     struct IDableGraphComponentConcept {
       
   323 
       
   324       void constraints() {
       
   325 	const Graph& const_graph = graph;
       
   326 	typename Graph::Node node;
       
   327 	int nid = const_graph.id(node);
       
   328 	nid = const_graph.id(node);
       
   329 	typename Graph::Edge edge;
       
   330 	int eid = const_graph.id(edge);
       
   331 	eid = const_graph.id(edge);
       
   332       }
       
   333 
       
   334       Graph& graph;
       
   335     };
       
   336 
       
   337 
       
   338     /// An empty max-idable base graph class.
       
   339   
       
   340     /// This class provides beside the core graph features
       
   341     /// core max id functions for the graph structure.
       
   342     /// The most of the base graphs should be conform to this concept.
       
   343     /// The id's are unique and immutable.
       
   344     class MaxIDableGraphComponent : virtual public BaseGraphComponent {
       
   345     public:
       
   346 
       
   347       /// Gives back an integer greater or equal to the maximum Node id. 
       
   348 
       
   349       /// Gives back an integer greater or equal to the maximum Node id. 
       
   350       ///
       
   351       int maxEdgeId() const { return -1;}
       
   352 
       
   353       /// Gives back an integer greater or equal to the maximum Edge id. 
       
   354 
       
   355       /// Gives back an integer greater or equal to the maximum Edge id. 
       
   356       ///
       
   357       int maxNodeId() const { return -1;}
       
   358     };
       
   359 
       
   360     /// Concept check structure for MaxIdableBaseGraph.
       
   361 
       
   362     /// Concept check structure for MaxIdableBaseGraph.
       
   363     ///
       
   364     template <typename Graph>
       
   365     struct MaxIDableGraphComponentConcept {
       
   366 
       
   367       void constraints() {
       
   368 	const Graph& const_graph = graph;
       
   369 	int nid = const_graph.maxEdgeId();
       
   370 	ignore_unused_variable_warning(nid);
       
   371 	int eid = const_graph.maxNodeId();
       
   372 	ignore_unused_variable_warning(eid);
       
   373       }
       
   374 
       
   375       Graph& graph;
       
   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& from, const Node& to) {
       
   402 	return INVALID;
       
   403       }
       
   404 
       
   405     };
       
   406 
       
   407     /// Concept check structure for ExtendableBaseGraph.
       
   408 
       
   409     /// Concept check structure for ExtendableBaseGraph.
       
   410     ///
       
   411     template <typename Graph>
       
   412     struct BaseExtendableGraphComponentConcept {
       
   413       void constraints() {
       
   414 	typename Graph::Node node_a, node_b;
       
   415 	node_a = graph.addNode();
       
   416 	typename Graph::Edge edge;
       
   417 	edge = graph.addEdge(node_a, node_b);
       
   418       }
       
   419 
       
   420       Graph& graph;
       
   421     };
       
   422 
       
   423     /// An empty erasable base graph class.
       
   424   
       
   425     /// This class provides beside the core graph features
       
   426     /// core erase functions for the graph structure.
       
   427     /// The most of the base graphs should be conform to this concept.
       
   428     class BaseErasableGraphComponent : virtual public BaseGraphComponent {
       
   429     public:
       
   430 
       
   431       typedef BaseGraphComponent::Node Node;
       
   432       typedef BaseGraphComponent::Edge Edge;
       
   433 
       
   434       /// Erase a Node from the graph.
       
   435       
       
   436       /// Erase a Node from the graph. This function should not
       
   437       /// erase edges connecting to the Node.
       
   438       void erase(const Node&) {}    
       
   439 
       
   440       /// Erase an Edge from the graph.
       
   441 
       
   442       /// Erase an Edge from the graph.
       
   443       ///
       
   444       void erase(const Edge&) {}
       
   445 
       
   446     };
       
   447 
       
   448     /// Concept check structure for ErasableBaseGraph.
       
   449 
       
   450     /// Concept check structure for ErasableBaseGraph.
       
   451     ///
       
   452     template <typename Graph>
       
   453     struct BaseErasableGraphComponentConcept {
       
   454       void constraints() {
       
   455 	typename Graph::Node node;
       
   456 	graph.erase(node);
       
   457 	typename Graph::Edge edge;
       
   458 	graph.erase(edge);
       
   459       }
       
   460 
       
   461       Graph& graph;
       
   462     };
       
   463 
       
   464     /// An empty clearable base graph class.
       
   465   
       
   466     /// This class provides beside the core graph features
       
   467     /// core clear functions for the graph structure.
       
   468     /// The most of the base graphs should be conform to this concept.
       
   469     class BaseClearableGraphComponent : virtual public BaseGraphComponent {
       
   470     public:
       
   471 
       
   472       /// Erase all the Nodes and Edges from the graph.
       
   473 
       
   474       /// Erase all the Nodes and Edges from the graph.
       
   475       ///
       
   476       void clear() {}    
       
   477     };
       
   478 
       
   479     /// Concept check function for ErasableBaseGraph.
       
   480 
       
   481     /// Concept check function for ErasableBaseGraph.
       
   482     ///
       
   483     template <typename Graph>
       
   484     struct BaseClearableGraphComponentConcept {
       
   485       void constraints() {
       
   486 	graph.clear();
       
   487       }
       
   488 
       
   489       Graph& graph;
       
   490     };
       
   491 
       
   492 
       
   493     class IterableGraphComponent : virtual public BaseGraphComponent {
       
   494 
       
   495     public:
       
   496     
       
   497       typedef IterableGraphComponent Graph;
       
   498 
       
   499       typedef BaseGraphComponent::Node Node;
       
   500       typedef BaseGraphComponent::Edge Edge;
       
   501 
       
   502       class NodeIt : public Node {
       
   503       public:
       
   504 	NodeIt() {}
       
   505 	NodeIt(Invalid) {}
       
   506 	NodeIt(const Graph&) {}
       
   507 
       
   508 	NodeIt& operator++() { return *this; }
       
   509 	//	Node operator*() const { return INVALID; }
       
   510 
       
   511 	bool operator==(const NodeIt&) { return true;}
       
   512 	bool operator!=(const NodeIt&) { return true;}
       
   513       };
       
   514 
       
   515       class EdgeIt : public Edge {
       
   516       public:
       
   517 	EdgeIt() {}
       
   518 	EdgeIt(Invalid) {}
       
   519 	EdgeIt(const Graph&) {}
       
   520 
       
   521 	EdgeIt& operator++() { return *this; }
       
   522 	//	Edge operator*() const { return INVALID; }
       
   523 
       
   524 	bool operator==(const EdgeIt&) { return true;}
       
   525 	bool operator!=(const EdgeIt&) { return true;}
       
   526       };
       
   527 
       
   528       class InEdgeIt : public Edge {
       
   529       public:
       
   530 	InEdgeIt() {}
       
   531 	InEdgeIt(Invalid) {}
       
   532 	InEdgeIt(const Graph&, const Node&) {}
       
   533 
       
   534 	InEdgeIt& operator++() { return *this; }
       
   535 	//	Edge operator*() const { return INVALID; }
       
   536 
       
   537 	bool operator==(const InEdgeIt&) { return true;}
       
   538 	bool operator!=(const InEdgeIt&) { return true;}
       
   539       };
       
   540 
       
   541       class OutEdgeIt : public Edge {
       
   542       public:
       
   543 	OutEdgeIt() {}
       
   544 	OutEdgeIt(Invalid) {}
       
   545 	OutEdgeIt(const Graph&, const Node&) {}
       
   546 
       
   547 	OutEdgeIt& operator++() { return *this; }
       
   548 	//	Edge operator*() const { return INVALID; }
       
   549 
       
   550 	bool operator==(const OutEdgeIt&) { return true;}
       
   551 	bool operator!=(const OutEdgeIt&) { return true;}
       
   552       };
       
   553 
       
   554     };
       
   555     
       
   556     template <typename Graph> 
       
   557     struct IterableGraphComponentConcept {
       
   558 
       
   559       void constraints() {
       
   560   
       
   561 	typedef typename Graph::Node Node;
       
   562 	typedef typename Graph::NodeIt NodeIt;
       
   563 	typedef typename Graph::Edge Edge;
       
   564 	typedef typename Graph::EdgeIt EdgeIt;
       
   565 	typedef typename Graph::InEdgeIt InEdgeIt;
       
   566 	typedef typename Graph::OutEdgeIt OutEdgeIt;
       
   567   
       
   568 	{
       
   569 	  NodeIt it; 
       
   570 	  NodeIt jt(it); 
       
   571 	  NodeIt kt(INVALID); 
       
   572 	  NodeIt lt(graph);
       
   573 	  it = jt;
       
   574 	  jt = ++it;
       
   575 	  bool b;
       
   576 	  b = (it == INVALID); 
       
   577 	  b = (it != INVALID);
       
   578 	  b = (it == jt); 
       
   579 	  b = (it != jt);
       
   580 	  Node node = it;
       
   581 	  node = it;
       
   582 	}
       
   583 	{
       
   584 	  EdgeIt it; 
       
   585 	  EdgeIt jt(it); 
       
   586 	  EdgeIt kt(INVALID); 
       
   587 	  EdgeIt lt(graph);
       
   588 	  it = jt;
       
   589 	  jt = ++it;
       
   590 	  bool b;
       
   591 	  b = (it == INVALID); 
       
   592 	  b = (it != INVALID);
       
   593 	  b = (it == jt); 
       
   594 	  b = (it != jt);
       
   595 	  Edge edge = it;
       
   596 	  edge = it;
       
   597 	}
       
   598 	{
       
   599 	  InEdgeIt it; 
       
   600 	  InEdgeIt jt(it); 
       
   601 	  InEdgeIt kt(INVALID); 
       
   602 	  Node node;
       
   603 	  InEdgeIt lt(graph, node);
       
   604 	  it = jt;
       
   605 	  jt = ++it;
       
   606 	  bool b;
       
   607 	  b = (it == INVALID); 
       
   608 	  b = (it != INVALID);
       
   609 	  b = (it == jt); 
       
   610 	  b = (it != jt);
       
   611 	  Edge edge = it;
       
   612 	  edge = it;
       
   613 	}
       
   614 	{
       
   615 	  OutEdgeIt it; 
       
   616 	  OutEdgeIt jt(it); 
       
   617 	  OutEdgeIt kt(INVALID); 
       
   618 	  Node node;
       
   619 	  OutEdgeIt lt(graph, node);
       
   620 	  it = jt;
       
   621 	  jt = ++it;
       
   622 	  bool b;
       
   623 	  b = (it == INVALID); 
       
   624 	  b = (it != INVALID);
       
   625 	  b = (it == jt); 
       
   626 	  b = (it != jt);
       
   627 	  Edge edge = it;
       
   628 	  edge = it;
       
   629 	}
       
   630       }
       
   631       Graph& graph;
       
   632     };
       
   633 
       
   634 
       
   635     class IdMappableGraphComponent : virtual public BaseGraphComponent {
       
   636 
       
   637       typedef IdMappableGraphComponent Graph;
       
   638 
       
   639       typedef BaseGraphComponent::Node Node;
       
   640       typedef BaseGraphComponent::Edge Edge;
       
   641 
       
   642     public:
       
   643 
       
   644       class NodeIdMap : public ReadMap<Node, int> {
       
   645       public:
       
   646 	NodeIdMap(const Graph&) {}
       
   647 	int maxId() const { return -1;}
       
   648       };
       
   649 
       
   650       class EdgeIdMap : public ReadMap<Edge, int> {
       
   651       public:
       
   652 	EdgeIdMap(const Graph&) {}
       
   653 	int maxId() const { return -1;}
       
   654       };
       
   655 
       
   656     };
       
   657     
       
   658     template <typename Graph>
       
   659     struct IdMappableGraphComponentConcept {
       
   660       void constraints() {	
       
   661 	{
       
   662 	  typedef typename Graph::EdgeIdMap EdgeIdMap;
       
   663 	  function_requires<ReadMapConcept<EdgeIdMap> >();
       
   664 	  EdgeIdMap edge_map(graph);
       
   665 	  int n = edge_map.maxId();
       
   666 	  ignore_unused_variable_warning(n);
       
   667 	}
       
   668 	{
       
   669 	  typedef typename Graph::NodeIdMap NodeIdMap;
       
   670 	  function_requires<ReadMapConcept<NodeIdMap> >();
       
   671 	  NodeIdMap node_map(graph);
       
   672 	  int n = node_map.maxId();
       
   673 	  ignore_unused_variable_warning(n);
       
   674 	}
       
   675       }
       
   676       Graph& graph;
       
   677     };
       
   678 
       
   679 
       
   680     class MappableGraphComponent : virtual public BaseGraphComponent {
       
   681     public:
       
   682 
       
   683       typedef MappableGraphComponent Graph;
       
   684 
       
   685       typedef BaseGraphComponent::Node Node;
       
   686       typedef BaseGraphComponent::Edge Edge;
       
   687 
       
   688       template <typename Value>
       
   689       class NodeMap : public ReferenceMap<Node, Value> {
       
   690       public:
       
   691 	NodeMap(const Graph&) {}
       
   692 	NodeMap(const Graph&, const Value&) {}
       
   693 	NodeMap(const NodeMap&) {}
       
   694 
       
   695 	NodeMap& operator=(const NodeMap&) { return *this;}
       
   696 	
       
   697       };
       
   698 
       
   699       template <typename Value>
       
   700       class EdgeMap : public ReferenceMap<Edge, Value> {
       
   701       public:
       
   702 	EdgeMap(const Graph&) {}
       
   703 	EdgeMap(const Graph&, const Value&) {}
       
   704 	EdgeMap(const EdgeMap&) {}
       
   705 
       
   706 	EdgeMap& operator=(const EdgeMap&) { return *this;}
       
   707 	
       
   708       };
       
   709 
       
   710     };
       
   711 
       
   712     template <typename Graph>
       
   713     struct MappableGraphComponentConcept {
       
   714 
       
   715       struct Type {
       
   716 	int value;
       
   717 	Type() : value(0) {}
       
   718 	Type(int _v) : value(_v) {}
       
   719       };
       
   720 
       
   721       void constraints() {
       
   722 	{ // int map test
       
   723 	  typedef typename Graph::template NodeMap<int> IntNodeMap;
       
   724 	  function_requires<GraphMapConcept<IntNodeMap,Graph> >();
       
   725 	} { // bool map test
       
   726 	  typedef typename Graph::template NodeMap<bool> BoolNodeMap;
       
   727 	  function_requires<GraphMapConcept<BoolNodeMap,Graph> >();
       
   728 	} { // Type map test
       
   729 	  typedef typename Graph::template NodeMap<Type> TypeNodeMap;
       
   730 	  function_requires<GraphMapConcept<TypeNodeMap,Graph> >();
       
   731 	} 
       
   732 
       
   733 	{ // int map test
       
   734 	  typedef typename Graph::template EdgeMap<int> IntEdgeMap;
       
   735 	  function_requires<GraphMapConcept<IntEdgeMap,Graph> >();
       
   736 	} { // bool map test
       
   737 	  typedef typename Graph::template EdgeMap<bool> BoolEdgeMap;
       
   738 	  function_requires<GraphMapConcept<BoolEdgeMap,Graph> >();
       
   739 	} { // Type map test
       
   740 	  typedef typename Graph::template EdgeMap<Type> TypeEdgeMap;
       
   741 	  function_requires<GraphMapConcept<TypeEdgeMap,Graph> >();
       
   742 	} 
       
   743       }
       
   744 
       
   745       Graph& graph;
       
   746     };
       
   747 
       
   748 
       
   749     class ExtendableGraphComponent : virtual public BaseGraphComponent {
       
   750     public:
       
   751 
       
   752       typedef ExtendableGraphComponent Graph;
       
   753 
       
   754       typedef BaseGraphComponent::Node Node;
       
   755       typedef BaseGraphComponent::Edge Edge;
       
   756 
       
   757       Node addNode() {
       
   758 	return INVALID;
       
   759       }
       
   760     
       
   761       Edge addEdge(const Node& from, const Node& to) {
       
   762 	return INVALID;
       
   763       }
       
   764 
       
   765     };
       
   766 
       
   767     template <typename Graph>
       
   768     struct ExtendableGraphComponentConcept {
       
   769       void constraints() {
       
   770 	typename Graph::Node node_a, node_b;
       
   771 	node_a = graph.addNode();
       
   772 	typename Graph::Edge edge;
       
   773 	edge = graph.addEdge(node_a, node_b);      
       
   774       }
       
   775       Graph& graph;
       
   776     };
       
   777 
       
   778     class ErasableGraphComponent : virtual public BaseGraphComponent {
       
   779     public:
       
   780 
       
   781       typedef ErasableGraphComponent Graph;
       
   782 
       
   783       typedef BaseGraphComponent::Node Node;
       
   784       typedef BaseGraphComponent::Edge Edge;
       
   785 
       
   786       void erase(const Node&) {}    
       
   787       void erase(const Edge&) {}
       
   788 
       
   789     };
       
   790 
       
   791     template <typename Graph>
       
   792     struct ErasableGraphComponentConcept {
       
   793       void constraints() {
       
   794 	typename Graph::Node node;
       
   795 	graph.erase(node);
       
   796 	typename Graph::Edge edge;
       
   797 	graph.erase(edge);      
       
   798       }
       
   799 
       
   800       Graph& graph;
       
   801     };
       
   802 
       
   803     class ClearableGraphComponent : virtual public BaseGraphComponent {
       
   804     public:
       
   805 
       
   806       typedef ClearableGraphComponent Graph;
       
   807 
       
   808       typedef BaseGraphComponent::Node Node;
       
   809       typedef BaseGraphComponent::Edge Edge;
       
   810 
       
   811       void clear() {}    
       
   812 
       
   813     };
       
   814 
       
   815     template <typename Graph>
       
   816     struct ClearableGraphComponentConcept {
       
   817       void constraints() {
       
   818 	graph.clear();
       
   819       }
       
   820       Graph& graph;
       
   821     };
       
   822 
       
   823   }
       
   824 
       
   825 }
       
   826 
       
   827 #endif