src/lemon/concept/graph_component.h
author klao
Thu, 04 Nov 2004 20:24:59 +0000
changeset 959 c80ef5912903
child 961 289d80c33f04
permissions -rw-r--r--
skeleton(s) -> concept renaming
     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