lemon/concept/graph_components.h
author deba
Tue, 17 Oct 2006 10:50:57 +0000
changeset 2247 269a0dcee70b
parent 2181 b2c38f4f72ff
permissions -rw-r--r--
Update the Path concept
Concept check for paths

DirPath renamed to Path
The interface updated to the new lemon interface
Make difference between the empty path and the path from one node
Builder interface have not been changed
// I wanted but there was not accordance about it

UPath is removed
It was a buggy implementation, it could not iterate on the
nodes in the right order
Right way to use undirected paths => path of edges in undirected graphs

The tests have been modified to the current implementation
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2006
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 ///\ingroup graph_concepts
    20 ///\file
    21 ///\brief The concept of the graph components.
    22 
    23 
    24 #ifndef LEMON_CONCEPT_GRAPH_COMPONENTS_H
    25 #define LEMON_CONCEPT_GRAPH_COMPONENTS_H
    26 
    27 #include <lemon/bits/invalid.h>
    28 #include <lemon/concept/maps.h>
    29 
    30 #include <lemon/bits/alteration_notifier.h>
    31 
    32 namespace lemon {
    33   namespace concept {
    34 
    35     /// \brief Skeleton class for graph Node and Edge types
    36     ///
    37     /// This class describes the interface of Node and Edge (and UEdge
    38     /// in undirected graphs) subtypes of graph types.
    39     ///
    40     /// \note This class is a template class so that we can use it to
    41     /// create graph skeleton classes. The reason for this is than Node
    42     /// and Edge types should \em not derive from the same base class.
    43     /// For Node you should instantiate it with character 'n' and for Edge
    44     /// with 'e'.
    45 
    46 #ifndef DOXYGEN
    47     template <char _selector = '0'>
    48 #endif
    49     class GraphItem {
    50     public:
    51       /// \brief Default constructor.
    52       ///      
    53       /// \warning The default constructor is not required to set
    54       /// the item to some well-defined value. So you should consider it
    55       /// as uninitialized.
    56       GraphItem() {}
    57       /// \brief Copy constructor.
    58       ///
    59       /// Copy constructor.
    60       ///
    61       GraphItem(const GraphItem &) {}
    62       /// \brief Invalid constructor \& conversion.
    63       ///
    64       /// This constructor initializes the item to be invalid.
    65       /// \sa Invalid for more details.
    66       GraphItem(Invalid) {}
    67       /// \brief Assign operator for nodes.
    68       ///
    69       /// The nodes are assignable. 
    70       ///
    71       GraphItem& operator=(GraphItem const&) { return *this; }
    72       /// \brief Equality operator.
    73       ///
    74       /// Two iterators are equal if and only if they represents the
    75       /// same node in the graph or both are invalid.
    76       bool operator==(GraphItem) const { return false; }
    77       /// \brief Inequality operator.
    78       ///
    79       /// \sa operator==(const Node& n)
    80       ///
    81       bool operator!=(GraphItem) const { return false; }
    82 
    83       /// \brief Artificial ordering operator.
    84       ///
    85       /// To allow the use of graph descriptors as key type in std::map or
    86       /// similar associative container we require this.
    87       ///
    88       /// \note This operator only have to define some strict ordering of
    89       /// the items; this order has nothing to do with the iteration
    90       /// ordering of the items.
    91       bool operator<(GraphItem) const { return false; }
    92 
    93       template<typename _GraphItem>
    94       struct Constraints {
    95 	void constraints() {
    96 	  _GraphItem i1;
    97 	  _GraphItem i2 = i1;
    98 	  _GraphItem i3 = INVALID;
    99 	  
   100 	  i1 = i2 = i3;
   101 
   102 	  bool b;
   103 	  //	  b = (ia == ib) && (ia != ib) && (ia < ib);
   104 	  b = (ia == ib) && (ia != ib);
   105 	  b = (ia == INVALID) && (ib != INVALID);
   106           b = (ia < ib);
   107 	}
   108 
   109 	const _GraphItem &ia;
   110 	const _GraphItem &ib;
   111       };
   112     };
   113 
   114     /// \brief An empty base graph class.
   115     ///  
   116     /// This class provides the minimal set of features needed for a graph
   117     /// structure. All graph concepts have to be conform to this base
   118     /// graph. It just provides types for nodes and edges and functions to
   119     /// get the source and the target of the edges.
   120     class BaseGraphComponent {
   121     public:
   122 
   123       typedef BaseGraphComponent Graph;
   124       
   125       /// \brief Node class of the graph.
   126       ///
   127       /// This class represents the Nodes of the graph. 
   128       ///
   129       typedef GraphItem<'n'> Node;
   130 
   131       /// \brief Edge class of the graph.
   132       ///
   133       /// This class represents the Edges of the graph. 
   134       ///
   135       typedef GraphItem<'e'> Edge;
   136 
   137       /// \brief Gives back the target node of an edge.
   138       ///
   139       /// Gives back the target node of an edge.
   140       ///
   141       Node target(const Edge&) const { return INVALID;}
   142 
   143       /// \brief Gives back the source node of an edge.
   144       ///
   145       /// Gives back the source node of an edge.
   146       ///
   147       Node source(const Edge&) const { return INVALID;}
   148 
   149       /// \brief Gives back the opposite node on the given edge.
   150       ///
   151       /// Gives back the opposite node on the given edge.
   152       Node oppositeNode(const Node&, const Edge&) const {
   153         return INVALID;
   154       }
   155 
   156       template <typename _Graph>
   157       struct Constraints {
   158 	typedef typename _Graph::Node Node;
   159 	typedef typename _Graph::Edge Edge;
   160       
   161 	void constraints() {
   162 	  checkConcept<GraphItem<'n'>, Node>();
   163 	  checkConcept<GraphItem<'e'>, Edge>();
   164 	  {
   165 	    Node n;
   166 	    Edge e(INVALID);
   167 	    n = graph.source(e);
   168 	    n = graph.target(e);
   169             n = graph.oppositeNode(n, e);
   170 	  }      
   171 	}
   172       
   173 	const _Graph& graph;
   174       };
   175     };
   176 
   177     /// \brief An empty base undirected graph class.
   178     ///  
   179     /// This class provides the minimal set of features needed for an
   180     /// undirected graph structure. All undirected graph concepts have
   181     /// to be conform to this base graph. It just provides types for
   182     /// nodes, edges and undirected edges and functions to get the
   183     /// source and the target of the edges and undirected edges,
   184     /// conversion from edges to undirected edges and function to get
   185     /// both direction of the undirected edges.
   186     class BaseUGraphComponent : public BaseGraphComponent {
   187     public:
   188       typedef BaseGraphComponent::Node Node;
   189       typedef BaseGraphComponent::Edge Edge;
   190       /// \brief Undirected edge class of the graph.
   191       ///
   192       /// This class represents the undirected edges of the graph.
   193       /// The undirected graphs can be used as a directed graph which
   194       /// for each edge contains the opposite edge too so the graph is
   195       /// bidirected. The undirected edge represents two opposite
   196       /// directed edges.
   197       class UEdge : public GraphItem<'u'> {
   198       public:
   199         typedef GraphItem<'u'> Parent;
   200         /// \brief Default constructor.
   201         ///      
   202         /// \warning The default constructor is not required to set
   203         /// the item to some well-defined value. So you should consider it
   204         /// as uninitialized.
   205         UEdge() {}
   206         /// \brief Copy constructor.
   207         ///
   208         /// Copy constructor.
   209         ///
   210         UEdge(const UEdge &) : Parent() {}
   211         /// \brief Invalid constructor \& conversion.
   212         ///
   213         /// This constructor initializes the item to be invalid.
   214         /// \sa Invalid for more details.
   215         UEdge(Invalid) {}
   216         /// \brief Converter from edge to undirected edge.
   217         ///
   218         /// Besides the core graph item functionality each edge should
   219         /// be convertible to the represented undirected edge. 
   220         UEdge(const Edge&) {}
   221         /// \brief Assign edge to undirected edge.
   222         ///
   223         /// Besides the core graph item functionality each edge should
   224         /// be convertible to the represented undirected edge. 
   225         UEdge& operator=(const Edge&) { return *this; }
   226       };
   227 
   228       /// \brief Returns the direction of the edge.
   229       ///
   230       /// Returns the direction of the edge. Each edge represents an
   231       /// undirected edge with a direction. It gives back the
   232       /// direction.
   233       bool direction(const Edge&) const { return true; }
   234 
   235       /// \brief Returns the directed edge.
   236       ///
   237       /// Returns the directed edge from its direction and the
   238       /// represented undirected edge.
   239       Edge direct(const UEdge&, bool) const { return INVALID;} 
   240 
   241       /// \brief Returns the directed edge.
   242       ///
   243       /// Returns the directed edge from its source and the
   244       /// represented undirected edge.
   245       Edge direct(const UEdge&, const Node&) const { return INVALID;} 
   246 
   247       /// \brief Returns the opposite edge.
   248       ///
   249       /// Returns the opposite edge. It is the edge representing the
   250       /// same undirected edge and has opposite direction.
   251       Edge oppositeEdge(const Edge&) const { return INVALID;}
   252 
   253       /// \brief Gives back the target node of an undirected edge.
   254       ///
   255       /// Gives back the target node of an undirected edge. The name
   256       /// target is a little confusing because the undirected edge
   257       /// does not have target but it just means that one of the end 
   258       /// node.
   259       Node target(const UEdge&) const { return INVALID;}
   260 
   261       /// \brief Gives back the source node of an undirected edge.
   262       ///
   263       /// Gives back the source node of an undirected edge. The name
   264       /// source is a little confusing because the undirected edge
   265       /// does not have source but it just means that one of the end 
   266       /// node.
   267       Node source(const UEdge&) const { return INVALID;}
   268       
   269       template <typename _Graph>
   270       struct Constraints {
   271 	typedef typename _Graph::Node Node;
   272 	typedef typename _Graph::Edge Edge;
   273 	typedef typename _Graph::UEdge UEdge;
   274       
   275 	void constraints() {
   276           checkConcept<BaseGraphComponent, _Graph>();
   277 	  checkConcept<GraphItem<'u'>, UEdge>();
   278 	  {
   279 	    Node n;
   280 	    UEdge ue(INVALID);
   281             Edge e;
   282 	    n = graph.source(ue);
   283 	    n = graph.target(ue);
   284             e = graph.direct(ue, true);
   285             e = graph.direct(ue, n);
   286             e = graph.oppositeEdge(e);
   287             ue = e;
   288             bool d = graph.direction(e);
   289             ignore_unused_variable_warning(d);
   290 	  }      
   291 	}
   292       
   293 	const _Graph& graph;
   294       };
   295 
   296     };
   297 
   298     /// \brief An empty base bipartite undirected graph class.
   299     ///  
   300     /// This class provides the minimal set of features needed for an
   301     /// bipartite undirected graph structure. All bipartite undirected
   302     /// graph concepts have to be conform to this base graph. It just
   303     /// provides types for nodes, A-nodes, B-nodes, edges and
   304     /// undirected edges and functions to get the source and the
   305     /// target of the edges and undirected edges, conversion from
   306     /// edges to undirected edges and function to get both direction
   307     /// of the undirected edges.
   308     class BaseBpUGraphComponent : public BaseUGraphComponent {
   309     public:
   310       typedef BaseUGraphComponent::Node Node;
   311       typedef BaseUGraphComponent::Edge Edge;
   312       typedef BaseUGraphComponent::UEdge UEdge;
   313 
   314       /// \brief Helper class for A-nodes.
   315       ///
   316       /// This class is just a helper class for A-nodes, it is not
   317       /// suggested to use it directly. It can be converted easily to
   318       /// node and vice versa. The usage of this class is limited
   319       /// to use just as template parameters for special map types. 
   320       class ANode : public Node {
   321       public:
   322         typedef Node Parent;
   323 
   324         /// \brief Default constructor.
   325         ///      
   326         /// \warning The default constructor is not required to set
   327         /// the item to some well-defined value. So you should consider it
   328         /// as uninitialized.
   329         ANode() {}
   330         /// \brief Copy constructor.
   331         ///
   332         /// Copy constructor.
   333         ///
   334         ANode(const ANode &) : Parent() {}
   335         /// \brief Invalid constructor \& conversion.
   336         ///
   337         /// This constructor initializes the item to be invalid.
   338         /// \sa Invalid for more details.
   339         ANode(Invalid) {}
   340         /// \brief Converter from node to A-node.
   341         ///
   342         /// Besides the core graph item functionality each node should
   343         /// be convertible to the represented A-node if it is it possible. 
   344         ANode(const Node&) {}
   345         /// \brief Assign node to A-node.
   346         ///
   347         /// Besides the core graph item functionality each node should
   348         /// be convertible to the represented A-node if it is it possible. 
   349         ANode& operator=(const Node&) { return *this; }
   350       };
   351 
   352       /// \brief Helper class for B-nodes.
   353       ///
   354       /// This class is just a helper class for B-nodes, it is not
   355       /// suggested to use it directly. It can be converted easily to
   356       /// node and vice versa. The usage of this class is limited
   357       /// to use just as template parameters for special map types. 
   358       class BNode : public Node {
   359       public:
   360         typedef Node Parent;
   361 
   362         /// \brief Default constructor.
   363         ///      
   364         /// \warning The default constructor is not required to set
   365         /// the item to some well-defined value. So you should consider it
   366         /// as uninitialized.
   367         BNode() {}
   368         /// \brief Copy constructor.
   369         ///
   370         /// Copy constructor.
   371         ///
   372         BNode(const BNode &) : Parent() {}
   373         /// \brief Invalid constructor \& conversion.
   374         ///
   375         /// This constructor initializes the item to be invalid.
   376         /// \sa Invalid for more details.
   377         BNode(Invalid) {}
   378         /// \brief Converter from node to B-node.
   379         ///
   380         /// Besides the core graph item functionality each node should
   381         /// be convertible to the represented B-node if it is it possible. 
   382         BNode(const Node&) {}
   383         /// \brief Assign node to B-node.
   384         ///
   385         /// Besides the core graph item functionality each node should
   386         /// be convertible to the represented B-node if it is it possible. 
   387         BNode& operator=(const Node&) { return *this; }
   388       };
   389       
   390       /// \brief Gives back %true when the node is A-node.
   391       ///
   392       /// Gives back %true when the node is A-node.
   393       bool aNode(const Node&) const { return false; }
   394 
   395       /// \brief Gives back %true when the node is B-node.
   396       ///
   397       /// Gives back %true when the node is B-node.
   398       bool bNode(const Node&) const { return false; }
   399 
   400       /// \brief Gives back the A-node of the undirected edge.
   401       ///
   402       /// Gives back the A-node of the undirected edge.
   403       Node aNode(const UEdge&) const { return INVALID; }
   404 
   405       /// \brief Gives back the B-node of the undirected edge.
   406       ///
   407       /// Gives back the B-node of the undirected edge.
   408       Node bNode(const UEdge&) const { return INVALID; }
   409       
   410       template <typename _Graph>
   411       struct Constraints {
   412 	typedef typename _Graph::Node Node;
   413 	typedef typename _Graph::ANode ANode;
   414 	typedef typename _Graph::BNode BNode;
   415 	typedef typename _Graph::Edge Edge;
   416 	typedef typename _Graph::UEdge UEdge;
   417       
   418 	void constraints() {
   419           checkConcept<BaseUGraphComponent, _Graph>();
   420 	  checkConcept<GraphItem<'a'>, ANode>();
   421 	  checkConcept<GraphItem<'b'>, BNode>();
   422 	  {
   423 	    Node n;
   424 	    UEdge ue(INVALID);
   425             bool b;
   426 	    n = graph.aNode(ue);
   427 	    n = graph.bNode(ue);
   428             b = graph.aNode(n);
   429             b = graph.bNode(n);
   430             ANode an;
   431             an = n; n = an;
   432             BNode bn;
   433             bn = n; n = bn;            
   434             ignore_unused_variable_warning(b);
   435 	  }      
   436 	}
   437       
   438 	const _Graph& graph;
   439       };
   440 
   441     };
   442 
   443     /// \brief An empty idable base graph class.
   444     ///  
   445     /// This class provides beside the core graph features
   446     /// core id functions for the graph structure.
   447     /// The most of the base graphs should be conform to this concept.
   448     /// The id's are unique and immutable.
   449     template <typename _Base = BaseGraphComponent>
   450     class IDableGraphComponent : public _Base {
   451     public:
   452 
   453       typedef _Base Base;
   454       typedef typename Base::Node Node;
   455       typedef typename Base::Edge Edge;
   456 
   457       /// \brief Gives back an unique integer id for the Node. 
   458       ///
   459       /// Gives back an unique integer id for the Node. 
   460       ///
   461       int id(const Node&) const { return -1;}
   462 
   463       /// \brief Gives back the node by the unique id.
   464       ///
   465       /// Gives back the node by the unique id.
   466       /// If the graph does not contain node with the given id
   467       /// then the result of the function is undetermined. 
   468       Node nodeFromId(int) const { return INVALID;}
   469 
   470       /// \brief Gives back an unique integer id for the Edge. 
   471       ///
   472       /// Gives back an unique integer id for the Edge. 
   473       ///
   474       int id(const Edge&) const { return -1;}
   475 
   476       /// \brief Gives back the edge by the unique id.
   477       ///
   478       /// Gives back the edge by the unique id.
   479       /// If the graph does not contain edge with the given id
   480       /// then the result of the function is undetermined. 
   481       Edge edgeFromId(int) const { return INVALID;}
   482 
   483       /// \brief Gives back an integer greater or equal to the maximum
   484       /// Node id.
   485       ///
   486       /// Gives back an integer greater or equal to the maximum Node
   487       /// id.
   488       int maxNodeId() const { return -1;}
   489 
   490       /// \brief Gives back an integer greater or equal to the maximum
   491       /// Edge id.
   492       ///
   493       /// Gives back an integer greater or equal to the maximum Edge
   494       /// id.
   495       int maxEdgeId() const { return -1;}
   496 
   497       template <typename _Graph>
   498       struct Constraints {
   499 
   500 	void constraints() {
   501 	  checkConcept<Base, _Graph >();
   502 	  typename _Graph::Node node;
   503 	  int nid = graph.id(node);
   504 	  nid = graph.id(node);
   505 	  node = graph.nodeFromId(nid);
   506 	  typename _Graph::Edge edge;
   507 	  int eid = graph.id(edge);
   508 	  eid = graph.id(edge);
   509 	  edge = graph.edgeFromId(eid);
   510 
   511 	  nid = graph.maxNodeId();
   512 	  ignore_unused_variable_warning(nid);
   513 	  eid = graph.maxEdgeId();
   514 	  ignore_unused_variable_warning(eid);
   515 	}
   516 
   517 	const _Graph& graph;
   518       };
   519     };
   520 
   521     /// \brief An empty idable base undirected graph class.
   522     ///  
   523     /// This class provides beside the core undirected graph features
   524     /// core id functions for the undirected graph structure.  The
   525     /// most of the base undirected graphs should be conform to this
   526     /// concept.  The id's are unique and immutable.
   527     template <typename _Base = BaseUGraphComponent>
   528     class IDableUGraphComponent : public IDableGraphComponent<_Base> {
   529     public:
   530 
   531       typedef _Base Base;
   532       typedef typename Base::UEdge UEdge;
   533 
   534       using IDableGraphComponent<_Base>::id;
   535 
   536       /// \brief Gives back an unique integer id for the UEdge. 
   537       ///
   538       /// Gives back an unique integer id for the UEdge. 
   539       ///
   540       int id(const UEdge&) const { return -1;}
   541 
   542       /// \brief Gives back the undirected edge by the unique id.
   543       ///
   544       /// Gives back the undirected edge by the unique id.  If the
   545       /// graph does not contain edge with the given id then the
   546       /// result of the function is undetermined.
   547       UEdge uEdgeFromId(int) const { return INVALID;}
   548 
   549       /// \brief Gives back an integer greater or equal to the maximum
   550       /// UEdge id.
   551       ///
   552       /// Gives back an integer greater or equal to the maximum UEdge
   553       /// id.
   554       int maxUEdgeId() const { return -1;}
   555 
   556       template <typename _Graph>
   557       struct Constraints {
   558 
   559 	void constraints() {
   560 	  checkConcept<Base, _Graph >();
   561 	  checkConcept<IDableGraphComponent<Base>, _Graph >();
   562 	  typename _Graph::UEdge uedge;
   563 	  int ueid = graph.id(uedge);
   564 	  ueid = graph.id(uedge);
   565 	  uedge = graph.uEdgeFromId(ueid);
   566 	  ueid = graph.maxUEdgeId();
   567 	  ignore_unused_variable_warning(ueid);
   568 	}
   569 
   570 	const _Graph& graph;
   571       };
   572     };
   573 
   574     /// \brief An empty idable base bipartite undirected graph class.
   575     ///  
   576     /// This class provides beside the core bipartite undirected graph
   577     /// features core id functions for the bipartite undirected graph
   578     /// structure.  The most of the base undirected graphs should be
   579     /// conform to this concept.
   580     template <typename _Base = BaseBpUGraphComponent>
   581     class IDableBpUGraphComponent : public IDableUGraphComponent<_Base> {
   582     public:
   583 
   584       typedef _Base Base;
   585       typedef typename Base::Node Node;
   586 
   587       using IDableUGraphComponent<_Base>::id;
   588 
   589       /// \brief Gives back an unique integer id for the ANode. 
   590       ///
   591       /// Gives back an unique integer id for the ANode. 
   592       ///
   593       int aNodeId(const Node&) const { return -1;}
   594 
   595       /// \brief Gives back the undirected edge by the unique id.
   596       ///
   597       /// Gives back the undirected edge by the unique id.  If the
   598       /// graph does not contain edge with the given id then the
   599       /// result of the function is undetermined.
   600       Node nodeFromANodeId(int) const { return INVALID;}
   601 
   602       /// \brief Gives back an integer greater or equal to the maximum
   603       /// ANode id.
   604       ///
   605       /// Gives back an integer greater or equal to the maximum ANode
   606       /// id.
   607       int maxANodeId() const { return -1;}
   608 
   609       /// \brief Gives back an unique integer id for the BNode. 
   610       ///
   611       /// Gives back an unique integer id for the BNode. 
   612       ///
   613       int bNodeId(const Node&) const { return -1;}
   614 
   615       /// \brief Gives back the undirected edge by the unique id.
   616       ///
   617       /// Gives back the undirected edge by the unique id.  If the
   618       /// graph does not contain edge with the given id then the
   619       /// result of the function is undetermined.
   620       Node nodeFromBNodeId(int) const { return INVALID;}
   621 
   622       /// \brief Gives back an integer greater or equal to the maximum
   623       /// BNode id.
   624       ///
   625       /// Gives back an integer greater or equal to the maximum BNode
   626       /// id.
   627       int maxBNodeId() const { return -1;}
   628 
   629       template <typename _Graph>
   630       struct Constraints {
   631 
   632 	void constraints() {
   633 	  checkConcept<Base, _Graph >();
   634 	  checkConcept<IDableGraphComponent<Base>, _Graph >();
   635 	  typename _Graph::Node node(INVALID);
   636 	  int id;
   637           id = graph.aNodeId(node);
   638           id = graph.bNodeId(node);
   639           node = graph.nodeFromANodeId(id);
   640           node = graph.nodeFromBNodeId(id);
   641           id = graph.maxANodeId();
   642           id = graph.maxBNodeId();
   643 	}
   644 
   645 	const _Graph& graph;
   646       };
   647     };
   648 
   649     /// \brief Skeleton class for graph NodeIt and EdgeIt
   650     ///
   651     /// Skeleton class for graph NodeIt and EdgeIt.
   652     ///
   653     template <typename _Graph, typename _Item>
   654     class GraphItemIt : public _Item {
   655     public:
   656       /// \brief Default constructor.
   657       ///
   658       /// @warning The default constructor sets the iterator
   659       /// to an undefined value.
   660       GraphItemIt() {}
   661       /// \brief Copy constructor.
   662       ///
   663       /// Copy constructor.
   664       ///
   665       GraphItemIt(const GraphItemIt& ) {}
   666       /// \brief Sets the iterator to the first item.
   667       ///
   668       /// Sets the iterator to the first item of \c the graph.
   669       ///
   670       explicit GraphItemIt(const _Graph&) {}
   671       /// \brief Invalid constructor \& conversion.
   672       ///
   673       /// This constructor initializes the item to be invalid.
   674       /// \sa Invalid for more details.
   675       GraphItemIt(Invalid) {}
   676       /// \brief Assign operator for items.
   677       ///
   678       /// The items are assignable. 
   679       ///
   680       GraphItemIt& operator=(const GraphItemIt&) { return *this; }      
   681       /// \brief Next item.
   682       /// 
   683       /// Assign the iterator to the next item.
   684       ///
   685       GraphItemIt& operator++() { return *this; }
   686       /// \brief Equality operator
   687       /// 
   688       /// Two iterators are equal if and only if they point to the
   689       /// same object or both are invalid.
   690       bool operator==(const GraphItemIt&) const { return true;}
   691       /// \brief Inequality operator
   692       ///	
   693       /// \sa operator==(Node n)
   694       ///
   695       bool operator!=(const GraphItemIt&) const { return true;}
   696       
   697       template<typename _GraphItemIt>
   698       struct Constraints {
   699 	void constraints() {
   700 	  _GraphItemIt it1(g);	
   701 	  _GraphItemIt it2;
   702 
   703 	  it2 = ++it1;
   704 	  ++it2 = it1;
   705 	  ++(++it1);
   706 
   707 	  _Item bi = it1;
   708 	  bi = it2;
   709 	}
   710 	_Graph& g;
   711       };
   712     };
   713 
   714     /// \brief Skeleton class for graph InEdgeIt and OutEdgeIt
   715     ///
   716     /// \note Because InEdgeIt and OutEdgeIt may not inherit from the same
   717     /// base class, the _selector is a additional template parameter. For 
   718     /// InEdgeIt you should instantiate it with character 'i' and for 
   719     /// OutEdgeIt with 'o'.
   720     template <typename _Graph,
   721 	      typename _Item = typename _Graph::Edge,
   722               typename _Base = typename _Graph::Node, 
   723 	      char _selector = '0'>
   724     class GraphIncIt : public _Item {
   725     public:
   726       /// \brief Default constructor.
   727       ///
   728       /// @warning The default constructor sets the iterator
   729       /// to an undefined value.
   730       GraphIncIt() {}
   731       /// \brief Copy constructor.
   732       ///
   733       /// Copy constructor.
   734       ///
   735       GraphIncIt(GraphIncIt const& gi) : _Item(gi) {}
   736       /// \brief Sets the iterator to the first edge incoming into or outgoing 
   737       /// from the node.
   738       ///
   739       /// Sets the iterator to the first edge incoming into or outgoing 
   740       /// from the node.
   741       ///
   742       explicit GraphIncIt(const _Graph&, const _Base&) {}
   743       /// \brief Invalid constructor \& conversion.
   744       ///
   745       /// This constructor initializes the item to be invalid.
   746       /// \sa Invalid for more details.
   747       GraphIncIt(Invalid) {}
   748       /// \brief Assign operator for iterators.
   749       ///
   750       /// The iterators are assignable. 
   751       ///
   752       GraphIncIt& operator=(GraphIncIt const&) { return *this; }      
   753       /// \brief Next item.
   754       ///
   755       /// Assign the iterator to the next item.
   756       ///
   757       GraphIncIt& operator++() { return *this; }
   758 
   759       /// \brief Equality operator
   760       ///
   761       /// Two iterators are equal if and only if they point to the
   762       /// same object or both are invalid.
   763       bool operator==(const GraphIncIt&) const { return true;}
   764 
   765       /// \brief Inequality operator
   766       ///
   767       /// \sa operator==(Node n)
   768       ///
   769       bool operator!=(const GraphIncIt&) const { return true;}
   770 
   771       template <typename _GraphIncIt>
   772       struct Constraints {
   773 	void constraints() {
   774 	  checkConcept<GraphItem<_selector>, _GraphIncIt>();
   775 	  _GraphIncIt it1(graph, node);
   776 	  _GraphIncIt it2;
   777 
   778 	  it2 = ++it1;
   779 	  ++it2 = it1;
   780 	  ++(++it1);
   781 	  _Item e = it1;
   782 	  e = it2;
   783 
   784 	}
   785 
   786 	_Item edge;
   787 	_Base node;
   788 	_Graph graph;
   789 	_GraphIncIt it;
   790       };
   791     };
   792 
   793 
   794     /// \brief An empty iterable graph class.
   795     ///
   796     /// This class provides beside the core graph features
   797     /// iterator based iterable interface for the graph structure.
   798     /// This concept is part of the Graph concept.
   799     template <typename _Base = BaseGraphComponent>
   800     class IterableGraphComponent : public _Base {
   801 
   802     public:
   803     
   804       typedef _Base Base;
   805       typedef typename Base::Node Node;
   806       typedef typename Base::Edge Edge;
   807 
   808       typedef IterableGraphComponent Graph;
   809 
   810       /// \name Base iteration
   811       /// 
   812       /// This interface provides functions for iteration on graph items
   813       ///
   814       /// @{  
   815 
   816       /// \brief Gives back the first node in the iterating order.
   817       ///      
   818       /// Gives back the first node in the iterating order.
   819       ///     
   820       void first(Node&) const {}
   821 
   822       /// \brief Gives back the next node in the iterating order.
   823       ///
   824       /// Gives back the next node in the iterating order.
   825       ///     
   826       void next(Node&) const {}
   827 
   828       /// \brief Gives back the first edge in the iterating order.
   829       ///
   830       /// Gives back the first edge in the iterating order.
   831       ///     
   832       void first(Edge&) const {}
   833 
   834       /// \brief Gives back the next edge in the iterating order.
   835       ///
   836       /// Gives back the next edge in the iterating order.
   837       ///     
   838       void next(Edge&) const {}
   839 
   840 
   841       /// \brief Gives back the first of the edges point to the given
   842       /// node.
   843       ///
   844       /// Gives back the first of the edges point to the given node.
   845       ///     
   846       void firstIn(Edge&, const Node&) const {}
   847 
   848       /// \brief Gives back the next of the edges points to the given
   849       /// node.
   850       ///
   851       /// Gives back the next of the edges points to the given node.
   852       ///
   853       void nextIn(Edge&) const {}
   854 
   855       /// \brief Gives back the first of the edges start from the
   856       /// given node.
   857       ///      
   858       /// Gives back the first of the edges start from the given node.
   859       ///     
   860       void firstOut(Edge&, const Node&) const {}
   861 
   862       /// \brief Gives back the next of the edges start from the given
   863       /// node.
   864       ///
   865       /// Gives back the next of the edges start from the given node.
   866       ///     
   867       void nextOut(Edge&) const {}
   868 
   869       /// @}
   870 
   871       /// \name Class based iteration
   872       /// 
   873       /// This interface provides functions for iteration on graph items
   874       ///
   875       /// @{
   876 
   877       /// \brief This iterator goes through each node.
   878       ///
   879       /// This iterator goes through each node.
   880       ///
   881       typedef GraphItemIt<Graph, Node> NodeIt;
   882 
   883       /// \brief This iterator goes through each node.
   884       ///
   885       /// This iterator goes through each node.
   886       ///
   887       typedef GraphItemIt<Graph, Edge> EdgeIt;
   888 
   889       /// \brief This iterator goes trough the incoming edges of a node.
   890       ///
   891       /// This iterator goes trough the \e inccoming edges of a certain node
   892       /// of a graph.
   893       typedef GraphIncIt<Graph, Edge, Node, 'i'> InEdgeIt;
   894 
   895       /// \brief This iterator goes trough the outgoing edges of a node.
   896       ///
   897       /// This iterator goes trough the \e outgoing edges of a certain node
   898       /// of a graph.
   899       typedef GraphIncIt<Graph, Edge, Node, 'o'> OutEdgeIt;
   900 
   901       /// \brief The base node of the iterator.
   902       ///
   903       /// Gives back the base node of the iterator.
   904       /// It is always the target of the pointed edge.
   905       Node baseNode(const InEdgeIt&) const { return INVALID; }
   906 
   907       /// \brief The running node of the iterator.
   908       ///
   909       /// Gives back the running node of the iterator.
   910       /// It is always the source of the pointed edge.
   911       Node runningNode(const InEdgeIt&) const { return INVALID; }
   912 
   913       /// \brief The base node of the iterator.
   914       ///
   915       /// Gives back the base node of the iterator.
   916       /// It is always the source of the pointed edge.
   917       Node baseNode(const OutEdgeIt&) const { return INVALID; }
   918 
   919       /// \brief The running node of the iterator.
   920       ///
   921       /// Gives back the running node of the iterator.
   922       /// It is always the target of the pointed edge.
   923       Node runningNode(const OutEdgeIt&) const { return INVALID; }
   924 
   925       /// @}
   926 
   927       template <typename _Graph> 
   928       struct Constraints {
   929 	void constraints() {
   930 	  checkConcept<Base, _Graph>();
   931 
   932           {
   933             typename _Graph::Node node(INVALID);      
   934             typename _Graph::Edge edge(INVALID);
   935             {
   936               graph.first(node);
   937               graph.next(node);
   938             }
   939             {
   940               graph.first(edge);
   941               graph.next(edge);
   942             }
   943             {
   944               graph.firstIn(edge, node);
   945               graph.nextIn(edge);
   946             }
   947             {
   948               graph.firstOut(edge, node);
   949               graph.nextOut(edge);
   950             }
   951           }           
   952 
   953           {
   954             checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>,
   955               typename _Graph::EdgeIt >();
   956             checkConcept<GraphItemIt<_Graph, typename _Graph::Node>,
   957               typename _Graph::NodeIt >();
   958             checkConcept<GraphIncIt<_Graph, typename _Graph::Edge, 
   959               typename _Graph::Node, 'i'>, typename _Graph::InEdgeIt>();
   960             checkConcept<GraphIncIt<_Graph, typename _Graph::Edge, 
   961               typename _Graph::Node, 'o'>, typename _Graph::OutEdgeIt>();
   962 
   963             typename _Graph::Node n;
   964             typename _Graph::InEdgeIt ieit(INVALID);
   965             typename _Graph::OutEdgeIt oeit(INVALID);
   966             n = graph.baseNode(ieit);
   967             n = graph.runningNode(ieit);
   968             n = graph.baseNode(oeit);
   969             n = graph.runningNode(oeit);
   970             ignore_unused_variable_warning(n);
   971           }
   972         }
   973 	
   974 	const _Graph& graph;
   975 	
   976       };
   977     };
   978 
   979     /// \brief An empty iterable undirected graph class.
   980     ///
   981     /// This class provides beside the core graph features iterator
   982     /// based iterable interface for the undirected graph structure.
   983     /// This concept is part of the UGraph concept.
   984     template <typename _Base = BaseUGraphComponent>
   985     class IterableUGraphComponent : public IterableGraphComponent<_Base> {
   986     public:
   987 
   988       typedef _Base Base;
   989       typedef typename Base::Node Node;
   990       typedef typename Base::Edge Edge;
   991       typedef typename Base::UEdge UEdge;
   992 
   993     
   994       typedef IterableUGraphComponent Graph;
   995 
   996       /// \name Base iteration
   997       /// 
   998       /// This interface provides functions for iteration on graph items
   999       /// @{  
  1000 
  1001       using IterableGraphComponent<_Base>::first;
  1002       using IterableGraphComponent<_Base>::next;
  1003 
  1004       /// \brief Gives back the first undirected edge in the iterating
  1005       /// order.
  1006       ///
  1007       /// Gives back the first undirected edge in the iterating order.
  1008       ///     
  1009       void first(UEdge&) const {}
  1010 
  1011       /// \brief Gives back the next undirected edge in the iterating
  1012       /// order.
  1013       ///
  1014       /// Gives back the next undirected edge in the iterating order.
  1015       ///     
  1016       void next(UEdge&) const {}
  1017 
  1018 
  1019       /// \brief Gives back the first of the undirected edges from the
  1020       /// given node.
  1021       ///
  1022       /// Gives back the first of the undirected edges from the given
  1023       /// node. The bool parameter gives back that direction which
  1024       /// gives a good direction of the uedge so the source of the
  1025       /// directed edge is the given node.
  1026       void firstInc(UEdge&, bool&, const Node&) const {}
  1027 
  1028       /// \brief Gives back the next of the undirected edges from the
  1029       /// given node.
  1030       ///
  1031       /// Gives back the next of the undirected edges from the given
  1032       /// node. The bool parameter should be used as the \c firstInc()
  1033       /// use it.
  1034       void nextInc(UEdge&, bool&) const {}
  1035 
  1036       using IterableGraphComponent<_Base>::baseNode;
  1037       using IterableGraphComponent<_Base>::runningNode;
  1038 
  1039       /// @}
  1040 
  1041       /// \name Class based iteration
  1042       /// 
  1043       /// This interface provides functions for iteration on graph items
  1044       ///
  1045       /// @{
  1046 
  1047       /// \brief This iterator goes through each node.
  1048       ///
  1049       /// This iterator goes through each node.
  1050       typedef GraphItemIt<Graph, UEdge> UEdgeIt;
  1051       /// \brief This iterator goes trough the incident edges of a
  1052       /// node.
  1053       ///
  1054       /// This iterator goes trough the incident edges of a certain
  1055       /// node of a graph.
  1056       typedef GraphIncIt<Graph, UEdge, Node, 'u'> IncEdgeIt;
  1057       /// \brief The base node of the iterator.
  1058       ///
  1059       /// Gives back the base node of the iterator.
  1060       Node baseNode(const IncEdgeIt&) const { return INVALID; }
  1061 
  1062       /// \brief The running node of the iterator.
  1063       ///
  1064       /// Gives back the running node of the iterator.
  1065       Node runningNode(const IncEdgeIt&) const { return INVALID; }
  1066 
  1067       /// @}
  1068 
  1069       template <typename _Graph> 
  1070       struct Constraints {
  1071 	void constraints() {
  1072 	  checkConcept<IterableGraphComponent<Base>, _Graph>();
  1073 
  1074           {
  1075             typename _Graph::Node node(INVALID);
  1076             typename _Graph::UEdge uedge(INVALID);
  1077             bool dir;
  1078             {
  1079               graph.first(uedge);
  1080               graph.next(uedge);
  1081             }
  1082             {
  1083               graph.firstInc(uedge, dir, node);
  1084               graph.nextInc(uedge, dir);
  1085             }
  1086             
  1087           }	
  1088   
  1089           {
  1090             checkConcept<GraphItemIt<_Graph, typename _Graph::UEdge>,
  1091               typename _Graph::UEdgeIt >();
  1092             checkConcept<GraphIncIt<_Graph, typename _Graph::UEdge, 
  1093               typename _Graph::Node, 'u'>, typename _Graph::IncEdgeIt>();
  1094             
  1095             typename _Graph::Node n;
  1096             typename _Graph::IncEdgeIt ueit(INVALID);
  1097             n = graph.baseNode(ueit);
  1098             n = graph.runningNode(ueit);
  1099           }
  1100         }
  1101 	
  1102 	const _Graph& graph;
  1103 	
  1104       };
  1105     };
  1106 
  1107     /// \brief An empty iterable bipartite undirected graph class.
  1108     ///
  1109     /// This class provides beside the core graph features iterator
  1110     /// based iterable interface for the bipartite undirected graph
  1111     /// structure. This concept is part of the BpUGraph concept.
  1112     template <typename _Base = BaseUGraphComponent>
  1113     class IterableBpUGraphComponent : public IterableUGraphComponent<_Base> {
  1114     public:
  1115 
  1116       typedef _Base Base;
  1117       typedef typename Base::Node Node;
  1118       typedef typename Base::UEdge UEdge;
  1119     
  1120       typedef IterableBpUGraphComponent Graph;
  1121 
  1122       /// \name Base iteration
  1123       /// 
  1124       /// This interface provides functions for iteration on graph items
  1125       /// @{  
  1126 
  1127       using IterableUGraphComponent<_Base>::first;
  1128       using IterableUGraphComponent<_Base>::next;
  1129 
  1130       /// \brief Gives back the first A-node in the iterating order.
  1131       ///
  1132       /// Gives back the first undirected A-node in the iterating
  1133       /// order.
  1134       ///     
  1135       void firstANode(Node&) const {}
  1136 
  1137       /// \brief Gives back the next A-node in the iterating order.
  1138       ///
  1139       /// Gives back the next A-node in the iterating order.
  1140       ///     
  1141       void nextANode(Node&) const {}
  1142 
  1143       /// \brief Gives back the first B-node in the iterating order.
  1144       ///
  1145       /// Gives back the first undirected B-node in the iterating
  1146       /// order.
  1147       ///     
  1148       void firstBNode(Node&) const {}
  1149 
  1150       /// \brief Gives back the next B-node in the iterating order.
  1151       ///
  1152       /// Gives back the next B-node in the iterating order.
  1153       ///     
  1154       void nextBNode(Node&) const {}
  1155 
  1156 
  1157       /// \brief Gives back the first of the undirected edges start
  1158       /// from the given A-node.
  1159       ///      
  1160       /// Gives back the first of the undirected edges start from the
  1161       /// given A-node.
  1162       void firstFromANode(UEdge&, const Node&) const {}
  1163 
  1164       /// \brief Gives back the next of the undirected edges start
  1165       /// from the given A-node.
  1166       ///      
  1167       /// Gives back the next of the undirected edges start from the
  1168       /// given A-node.
  1169       void nextFromANode(UEdge&) const {}
  1170 
  1171       /// \brief Gives back the first of the undirected edges start
  1172       /// from the given B-node.
  1173       ///      
  1174       /// Gives back the first of the undirected edges start from the
  1175       /// given B-node.
  1176       void firstFromBNode(UEdge&, const Node&) const {}
  1177 
  1178       /// \brief Gives back the next of the undirected edges start
  1179       /// from the given B-node.
  1180       ///      
  1181       /// Gives back the next of the undirected edges start from the
  1182       /// given B-node.
  1183       void nextFromBNode(UEdge&) const {}
  1184 
  1185 
  1186       /// @}
  1187 
  1188       /// \name Class based iteration
  1189       /// 
  1190       /// This interface provides functions for iteration on graph items
  1191       ///
  1192       /// @{
  1193 
  1194       /// \brief This iterator goes through each A-node.
  1195       ///
  1196       /// This iterator goes through each A-node.
  1197       typedef GraphItemIt<Graph, Node> ANodeIt;
  1198 
  1199       /// \brief This iterator goes through each B-node.
  1200       ///
  1201       /// This iterator goes through each B-node.
  1202       typedef GraphItemIt<Graph, Node> BNodeIt;
  1203 
  1204       /// @}
  1205 
  1206       template <typename _Graph> 
  1207       struct Constraints {
  1208 	void constraints() {
  1209 	  checkConcept<IterableUGraphComponent<Base>, _Graph>();
  1210 
  1211           {
  1212             typename _Graph::Node node(INVALID);
  1213             typename _Graph::UEdge uedge(INVALID);
  1214             graph.firstANode(node);
  1215             graph.nextANode(node);
  1216             graph.firstBNode(node);
  1217             graph.nextBNode(node);
  1218 
  1219             graph.firstFromANode(uedge, node);
  1220             graph.nextFromANode(uedge);
  1221             graph.firstFromBNode(uedge, node);
  1222             graph.nextFromBNode(uedge);
  1223           }
  1224           {
  1225             checkConcept<GraphItemIt<_Graph, typename _Graph::Node>,
  1226               typename _Graph::ANodeIt >();
  1227             checkConcept<GraphItemIt<_Graph, typename _Graph::Node>,
  1228               typename _Graph::BNodeIt >();
  1229           }
  1230 
  1231 	}
  1232 	
  1233 	const _Graph& graph;
  1234 	
  1235       };
  1236     };
  1237 
  1238     /// \brief An empty alteration notifier graph class.
  1239     ///  
  1240     /// This class provides beside the core graph features alteration
  1241     /// notifier interface for the graph structure.  This implements
  1242     /// an observer-notifier pattern for each graph item. More
  1243     /// obsevers can be registered into the notifier and whenever an
  1244     /// alteration occured in the graph all the observers will
  1245     /// notified about it.
  1246     template <typename _Base = BaseGraphComponent>
  1247     class AlterableGraphComponent : public _Base {
  1248     public:
  1249 
  1250       typedef _Base Base;
  1251       typedef typename Base::Node Node;
  1252       typedef typename Base::Edge Edge;
  1253 
  1254 
  1255       /// The node observer registry.
  1256       typedef AlterationNotifier<AlterableGraphComponent, Node> 
  1257       NodeNotifier;
  1258       /// The edge observer registry.
  1259       typedef AlterationNotifier<AlterableGraphComponent, Edge> 
  1260       EdgeNotifier;
  1261       
  1262       /// \brief Gives back the node alteration notifier.
  1263       ///
  1264       /// Gives back the node alteration notifier.
  1265       NodeNotifier& getNotifier(Node) const {
  1266 	return NodeNotifier();
  1267       }
  1268       
  1269       /// \brief Gives back the edge alteration notifier.
  1270       ///
  1271       /// Gives back the edge alteration notifier.
  1272       EdgeNotifier& getNotifier(Edge) const {
  1273 	return EdgeNotifier();
  1274       }
  1275 
  1276       template <typename _Graph> 
  1277       struct Constraints {
  1278 	void constraints() {
  1279 	  checkConcept<Base, _Graph>();
  1280           typename _Graph::NodeNotifier& nn 
  1281             = graph.getNotifier(typename _Graph::Node());
  1282 
  1283           typename _Graph::EdgeNotifier& en 
  1284             = graph.getNotifier(typename _Graph::Edge());
  1285           
  1286           ignore_unused_variable_warning(nn);
  1287           ignore_unused_variable_warning(en);
  1288 	}
  1289 	
  1290 	const _Graph& graph;
  1291 	
  1292       };
  1293       
  1294     };
  1295 
  1296     /// \brief An empty alteration notifier undirected graph class.
  1297     ///  
  1298     /// This class provides beside the core graph features alteration
  1299     /// notifier interface for the graph structure.  This implements
  1300     /// an observer-notifier pattern for each graph item. More
  1301     /// obsevers can be registered into the notifier and whenever an
  1302     /// alteration occured in the graph all the observers will
  1303     /// notified about it.
  1304     template <typename _Base = BaseUGraphComponent>
  1305     class AlterableUGraphComponent : public AlterableGraphComponent<_Base> {
  1306     public:
  1307 
  1308       typedef _Base Base;
  1309       typedef typename Base::UEdge UEdge;
  1310 
  1311 
  1312       /// The edge observer registry.
  1313       typedef AlterationNotifier<AlterableUGraphComponent, UEdge> 
  1314       UEdgeNotifier;
  1315       
  1316       /// \brief Gives back the edge alteration notifier.
  1317       ///
  1318       /// Gives back the edge alteration notifier.
  1319       UEdgeNotifier& getNotifier(UEdge) const {
  1320 	return UEdgeNotifier();
  1321       }
  1322 
  1323       template <typename _Graph> 
  1324       struct Constraints {
  1325 	void constraints() {
  1326 	  checkConcept<AlterableGraphComponent<Base>, _Graph>();
  1327           typename _Graph::UEdgeNotifier& uen 
  1328             = graph.getNotifier(typename _Graph::UEdge());
  1329           ignore_unused_variable_warning(uen);
  1330 	}
  1331 	
  1332 	const _Graph& graph;
  1333 	
  1334       };
  1335       
  1336     };
  1337 
  1338     /// \brief An empty alteration notifier bipartite undirected graph
  1339     /// class.
  1340     ///  
  1341     /// This class provides beside the core graph features alteration
  1342     /// notifier interface for the graph structure.  This implements
  1343     /// an observer-notifier pattern for each graph item. More
  1344     /// obsevers can be registered into the notifier and whenever an
  1345     /// alteration occured in the graph all the observers will
  1346     /// notified about it.
  1347     template <typename _Base = BaseUGraphComponent>
  1348     class AlterableBpUGraphComponent : public AlterableUGraphComponent<_Base> {
  1349     public:
  1350 
  1351       typedef _Base Base;
  1352       typedef typename Base::ANode ANode;
  1353       typedef typename Base::BNode BNode;
  1354 
  1355 
  1356       /// The A-node observer registry.
  1357       typedef AlterationNotifier<AlterableBpUGraphComponent, ANode> 
  1358       ANodeNotifier;
  1359 
  1360       /// The B-node observer registry.
  1361       typedef AlterationNotifier<AlterableBpUGraphComponent, BNode> 
  1362       BNodeNotifier;
  1363       
  1364       /// \brief Gives back the A-node alteration notifier.
  1365       ///
  1366       /// Gives back the A-node alteration notifier.
  1367       ANodeNotifier& getNotifier(ANode) const {
  1368 	return ANodeNotifier();
  1369       }
  1370 
  1371       /// \brief Gives back the B-node alteration notifier.
  1372       ///
  1373       /// Gives back the B-node alteration notifier.
  1374       BNodeNotifier& getNotifier(BNode) const {
  1375 	return BNodeNotifier();
  1376       }
  1377 
  1378       template <typename _Graph> 
  1379       struct Constraints {
  1380 	void constraints() {
  1381           checkConcept<AlterableUGraphComponent<Base>, _Graph>();
  1382           typename _Graph::ANodeNotifier& ann 
  1383             = graph.getNotifier(typename _Graph::ANode());
  1384           typename _Graph::BNodeNotifier& bnn 
  1385             = graph.getNotifier(typename _Graph::BNode());
  1386           ignore_unused_variable_warning(ann);
  1387           ignore_unused_variable_warning(bnn);
  1388 	}
  1389 	
  1390 	const _Graph& graph;
  1391 	
  1392       };
  1393       
  1394     };
  1395 
  1396 
  1397     /// \brief Class describing the concept of graph maps
  1398     /// 
  1399     /// This class describes the common interface of the graph maps
  1400     /// (NodeMap, EdgeMap), that is \ref maps-page "maps" which can be used to
  1401     /// associate data to graph descriptors (nodes or edges).
  1402     template <typename _Graph, typename _Item, typename _Value>
  1403     class GraphMap : public ReadWriteMap<_Item, _Value> {
  1404     public:
  1405 
  1406       typedef ReadWriteMap<_Item, _Value> Parent;
  1407 
  1408       /// The graph type of the map.
  1409       typedef _Graph Graph;
  1410       /// The key type of the map.
  1411       typedef _Item Key;
  1412       /// The value type of the map.
  1413       typedef _Value Value;
  1414 
  1415       /// \brief Construct a new map.
  1416       ///
  1417       /// Construct a new map for the graph.
  1418       explicit GraphMap(const Graph&) {}
  1419       /// \brief Construct a new map with default value.
  1420       ///
  1421       /// Construct a new map for the graph and initalise the values.
  1422       GraphMap(const Graph&, const Value&) {}
  1423       /// \brief Copy constructor.
  1424       ///
  1425       /// Copy Constructor.
  1426       GraphMap(const GraphMap&) : Parent() {}
  1427       
  1428       /// \brief Assign operator.
  1429       ///
  1430       /// Assign operator. It does not mofify the underlying graph,
  1431       /// it just iterates on the current item set and set the  map
  1432       /// with the value returned by the assigned map. 
  1433       template <typename CMap>
  1434       GraphMap& operator=(const CMap&) { 
  1435         checkConcept<ReadMap<Key, Value>, CMap>();
  1436         return *this;
  1437       }
  1438 
  1439       template<typename _Map>
  1440       struct Constraints {
  1441 	void constraints() {
  1442 	  checkConcept<ReadWriteMap<Key, Value>, _Map >();
  1443 	  // Construction with a graph parameter
  1444 	  _Map a(g);
  1445 	  // Constructor with a graph and a default value parameter
  1446 	  _Map a2(g,t);
  1447 	  // Copy constructor.
  1448 	  _Map b(c);
  1449           
  1450           ReadMap<Key, Value> cmap;
  1451           b = cmap;
  1452 
  1453 	  ignore_unused_variable_warning(a2);
  1454 	  ignore_unused_variable_warning(b);
  1455 	}
  1456 
  1457 	const _Map &c;
  1458 	const Graph &g;
  1459 	const typename GraphMap::Value &t;
  1460       };
  1461 
  1462     };
  1463 
  1464     /// \brief An empty mappable graph class.
  1465     ///
  1466     /// This class provides beside the core graph features
  1467     /// map interface for the graph structure.
  1468     /// This concept is part of the Graph concept.
  1469     template <typename _Base = BaseGraphComponent>
  1470     class MappableGraphComponent : public _Base  {
  1471     public:
  1472 
  1473       typedef _Base Base;
  1474       typedef typename Base::Node Node;
  1475       typedef typename Base::Edge Edge;
  1476 
  1477       typedef MappableGraphComponent Graph;
  1478 
  1479       /// \brief ReadWrite map of the nodes.
  1480       ///
  1481       /// ReadWrite map of the nodes.
  1482       ///
  1483       template <typename _Value>
  1484       class NodeMap : public GraphMap<Graph, Node, _Value> {
  1485       private:
  1486 	NodeMap();
  1487       public:
  1488         typedef GraphMap<MappableGraphComponent, Node, _Value> Parent;
  1489 
  1490 	/// \brief Construct a new map.
  1491 	///
  1492 	/// Construct a new map for the graph.
  1493 	/// \todo call the right parent class constructor
  1494 	explicit NodeMap(const MappableGraphComponent& graph) 
  1495           : Parent(graph) {}
  1496 
  1497 	/// \brief Construct a new map with default value.
  1498 	///
  1499 	/// Construct a new map for the graph and initalise the values.
  1500 	NodeMap(const MappableGraphComponent& graph, const _Value& value)
  1501           : Parent(graph, value) {}
  1502 
  1503 	/// \brief Copy constructor.
  1504 	///
  1505 	/// Copy Constructor.
  1506 	NodeMap(const NodeMap& nm) : Parent(nm) {}
  1507 
  1508 	/// \brief Assign operator.
  1509 	///
  1510 	/// Assign operator.
  1511         template <typename CMap>
  1512         NodeMap& operator=(const CMap&) { 
  1513           checkConcept<ReadMap<Node, _Value>, CMap>();
  1514           return *this;
  1515         }
  1516 
  1517       };
  1518 
  1519       /// \brief ReadWrite map of the edges.
  1520       ///
  1521       /// ReadWrite map of the edges.
  1522       ///
  1523       template <typename _Value>
  1524       class EdgeMap : public GraphMap<Graph, Edge, _Value> {
  1525       private:
  1526 	EdgeMap();
  1527       public:
  1528         typedef GraphMap<MappableGraphComponent, Edge, _Value> Parent;
  1529 
  1530 	/// \brief Construct a new map.
  1531 	///
  1532 	/// Construct a new map for the graph.
  1533 	/// \todo call the right parent class constructor
  1534 	explicit EdgeMap(const MappableGraphComponent& graph) 
  1535           : Parent(graph) {}
  1536 
  1537 	/// \brief Construct a new map with default value.
  1538 	///
  1539 	/// Construct a new map for the graph and initalise the values.
  1540 	EdgeMap(const MappableGraphComponent& graph, const _Value& value)
  1541           : Parent(graph, value) {}
  1542 
  1543 	/// \brief Copy constructor.
  1544 	///
  1545 	/// Copy Constructor.
  1546 	EdgeMap(const EdgeMap& nm) : Parent(nm) {}
  1547 
  1548 	/// \brief Assign operator.
  1549 	///
  1550 	/// Assign operator.
  1551         template <typename CMap>
  1552         EdgeMap& operator=(const CMap&) { 
  1553           checkConcept<ReadMap<Edge, _Value>, CMap>();
  1554           return *this;
  1555         }
  1556 
  1557       };
  1558 
  1559 
  1560       template <typename _Graph>
  1561       struct Constraints {
  1562 
  1563 	struct Dummy {
  1564 	  int value;
  1565 	  Dummy() : value(0) {}
  1566 	  Dummy(int _v) : value(_v) {}
  1567 	};
  1568 
  1569 	void constraints() {
  1570 	  checkConcept<Base, _Graph>();
  1571 	  { // int map test
  1572 	    typedef typename _Graph::template NodeMap<int> IntNodeMap;
  1573 	    checkConcept<GraphMap<_Graph, typename _Graph::Node, int>, 
  1574 	      IntNodeMap >();
  1575 	  } { // bool map test
  1576 	    typedef typename _Graph::template NodeMap<bool> BoolNodeMap;
  1577 	    checkConcept<GraphMap<_Graph, typename _Graph::Node, bool>,
  1578 	      BoolNodeMap >();
  1579 	  } { // Dummy map test
  1580 	    typedef typename _Graph::template NodeMap<Dummy> DummyNodeMap;
  1581 	    checkConcept<GraphMap<_Graph, typename _Graph::Node, Dummy>,
  1582 	      DummyNodeMap >();
  1583 	  } 
  1584 
  1585 	  { // int map test
  1586 	    typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
  1587 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
  1588 	      IntEdgeMap >();
  1589 	  } { // bool map test
  1590 	    typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
  1591 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
  1592 	      BoolEdgeMap >();
  1593 	  } { // Dummy map test
  1594 	    typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap;
  1595 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>, 
  1596 	      DummyEdgeMap >();
  1597 	  } 
  1598 	}
  1599 
  1600 	_Graph& graph;
  1601       };
  1602     };
  1603 
  1604     /// \brief An empty mappable base bipartite undirected graph class.
  1605     ///
  1606     /// This class provides beside the core graph features
  1607     /// map interface for the graph structure.
  1608     /// This concept is part of the UGraph concept.
  1609     template <typename _Base = BaseUGraphComponent>
  1610     class MappableUGraphComponent : public MappableGraphComponent<_Base>  {
  1611     public:
  1612 
  1613       typedef _Base Base;
  1614       typedef typename Base::UEdge UEdge;
  1615 
  1616       typedef MappableUGraphComponent Graph;
  1617 
  1618       /// \brief ReadWrite map of the uedges.
  1619       ///
  1620       /// ReadWrite map of the uedges.
  1621       ///
  1622       template <typename _Value>
  1623       class UEdgeMap : public GraphMap<Graph, UEdge, _Value> {  
  1624       public:
  1625         typedef GraphMap<MappableUGraphComponent, UEdge, _Value> Parent;
  1626 
  1627 	/// \brief Construct a new map.
  1628 	///
  1629 	/// Construct a new map for the graph.
  1630 	/// \todo call the right parent class constructor
  1631 	explicit UEdgeMap(const MappableUGraphComponent& graph) 
  1632           : Parent(graph) {}
  1633 
  1634 	/// \brief Construct a new map with default value.
  1635 	///
  1636 	/// Construct a new map for the graph and initalise the values.
  1637 	UEdgeMap(const MappableUGraphComponent& graph, const _Value& value)
  1638           : Parent(graph, value) {}
  1639 
  1640 	/// \brief Copy constructor.
  1641 	///
  1642 	/// Copy Constructor.
  1643 	UEdgeMap(const UEdgeMap& nm) : Parent(nm) {}
  1644 
  1645 	/// \brief Assign operator.
  1646 	///
  1647 	/// Assign operator.
  1648         template <typename CMap>
  1649         UEdgeMap& operator=(const CMap&) { 
  1650           checkConcept<ReadMap<UEdge, _Value>, CMap>();
  1651           return *this;
  1652         }
  1653 
  1654       };
  1655 
  1656 
  1657       template <typename _Graph>
  1658       struct Constraints {
  1659 
  1660 	struct Dummy {
  1661 	  int value;
  1662 	  Dummy() : value(0) {}
  1663 	  Dummy(int _v) : value(_v) {}
  1664 	};
  1665 
  1666 	void constraints() {
  1667 	  checkConcept<MappableGraphComponent<Base>, _Graph>();
  1668 
  1669 	  { // int map test
  1670 	    typedef typename _Graph::template UEdgeMap<int> IntUEdgeMap;
  1671 	    checkConcept<GraphMap<_Graph, typename _Graph::UEdge, int>,
  1672 	      IntUEdgeMap >();
  1673 	  } { // bool map test
  1674 	    typedef typename _Graph::template UEdgeMap<bool> BoolUEdgeMap;
  1675 	    checkConcept<GraphMap<_Graph, typename _Graph::UEdge, bool>,
  1676 	      BoolUEdgeMap >();
  1677 	  } { // Dummy map test
  1678 	    typedef typename _Graph::template UEdgeMap<Dummy> DummyUEdgeMap;
  1679 	    checkConcept<GraphMap<_Graph, typename _Graph::UEdge, Dummy>, 
  1680 	      DummyUEdgeMap >();
  1681 	  } 
  1682 	}
  1683 
  1684 	_Graph& graph;
  1685       };
  1686     };
  1687 
  1688     /// \brief An empty mappable base bipartite undirected graph
  1689     /// class.
  1690     ///
  1691     /// This class provides beside the core graph features
  1692     /// map interface for the graph structure.
  1693     /// This concept is part of the BpUGraph concept.
  1694     template <typename _Base = BaseBpUGraphComponent>
  1695     class MappableBpUGraphComponent : public MappableUGraphComponent<_Base>  {
  1696     public:
  1697 
  1698       typedef _Base Base;
  1699       typedef typename Base::Node Node;
  1700 
  1701       typedef MappableBpUGraphComponent Graph;
  1702 
  1703       /// \brief ReadWrite map of the A-nodes.
  1704       ///
  1705       /// ReadWrite map of the A-nodes.
  1706       ///
  1707       template <typename _Value>
  1708       class ANodeMap : public GraphMap<Graph, Node, _Value> {  
  1709       public:
  1710         typedef GraphMap<MappableBpUGraphComponent, Node, _Value> Parent;
  1711 
  1712 	/// \brief Construct a new map.
  1713 	///
  1714 	/// Construct a new map for the graph.
  1715 	/// \todo call the right parent class constructor
  1716 	explicit ANodeMap(const MappableBpUGraphComponent& graph) 
  1717           : Parent(graph) {}
  1718 
  1719 	/// \brief Construct a new map with default value.
  1720 	///
  1721 	/// Construct a new map for the graph and initalise the values.
  1722 	ANodeMap(const MappableBpUGraphComponent& graph, const _Value& value)
  1723           : Parent(graph, value) {}
  1724 
  1725 	/// \brief Copy constructor.
  1726 	///
  1727 	/// Copy Constructor.
  1728 	ANodeMap(const ANodeMap& nm) : Parent(nm) {}
  1729 
  1730 	/// \brief Assign operator.
  1731 	///
  1732 	/// Assign operator.
  1733         template <typename CMap>
  1734         ANodeMap& operator=(const CMap&) { 
  1735           checkConcept<ReadMap<Node, _Value>, CMap>();
  1736           return *this;
  1737         }
  1738 
  1739       };
  1740 
  1741       /// \brief ReadWrite map of the B-nodes.
  1742       ///
  1743       /// ReadWrite map of the A-nodes.
  1744       ///
  1745       template <typename _Value>
  1746       class BNodeMap : public GraphMap<Graph, Node, _Value> {  
  1747       public:
  1748         typedef GraphMap<MappableBpUGraphComponent, Node, _Value> Parent;
  1749 
  1750 	/// \brief Construct a new map.
  1751 	///
  1752 	/// Construct a new map for the graph.
  1753 	/// \todo call the right parent class constructor
  1754 	explicit BNodeMap(const MappableBpUGraphComponent& graph) 
  1755           : Parent(graph) {}
  1756 
  1757 	/// \brief Construct a new map with default value.
  1758 	///
  1759 	/// Construct a new map for the graph and initalise the values.
  1760 	BNodeMap(const MappableBpUGraphComponent& graph, const _Value& value)
  1761           : Parent(graph, value) {}
  1762 
  1763 	/// \brief Copy constructor.
  1764 	///
  1765 	/// Copy Constructor.
  1766 	BNodeMap(const BNodeMap& nm) : Parent(nm) {}
  1767 
  1768 	/// \brief Assign operator.
  1769 	///
  1770 	/// Assign operator.
  1771         template <typename CMap>
  1772         BNodeMap& operator=(const CMap&) { 
  1773           checkConcept<ReadMap<Node, _Value>, CMap>();
  1774           return *this;
  1775         }
  1776 
  1777       };
  1778 
  1779 
  1780       template <typename _Graph>
  1781       struct Constraints {
  1782 
  1783 	struct Dummy {
  1784 	  int value;
  1785 	  Dummy() : value(0) {}
  1786 	  Dummy(int _v) : value(_v) {}
  1787 	};
  1788 
  1789 	void constraints() {
  1790 	  checkConcept<MappableUGraphComponent<Base>, _Graph>();
  1791 
  1792 	  { // int map test
  1793 	    typedef typename _Graph::template ANodeMap<int> IntANodeMap;
  1794 	    checkConcept<GraphMap<_Graph, typename _Graph::ANode, int>,
  1795 	      IntANodeMap >();
  1796 	  } { // bool map test
  1797 	    typedef typename _Graph::template ANodeMap<bool> BoolANodeMap;
  1798 	    checkConcept<GraphMap<_Graph, typename _Graph::ANode, bool>,
  1799 	      BoolANodeMap >();
  1800 	  } { // Dummy map test
  1801 	    typedef typename _Graph::template ANodeMap<Dummy> DummyANodeMap;
  1802 	    checkConcept<GraphMap<_Graph, typename _Graph::ANode, Dummy>, 
  1803 	      DummyANodeMap >();
  1804 	  } 
  1805 	}
  1806 
  1807 	_Graph& graph;
  1808       };
  1809     };
  1810 
  1811 
  1812     /// \brief An empty extendable graph class.
  1813     ///
  1814     /// This class provides beside the core graph features graph
  1815     /// extendable interface for the graph structure.  The main
  1816     /// difference between the base and this interface is that the
  1817     /// graph alterations should handled already on this level.
  1818     template <typename _Base = BaseGraphComponent>
  1819     class ExtendableGraphComponent : public _Base {
  1820     public:
  1821       typedef _Base Base;
  1822 
  1823       typedef typename _Base::Node Node;
  1824       typedef typename _Base::Edge Edge;
  1825 
  1826       /// \brief Adds a new node to the graph.
  1827       ///
  1828       /// Adds a new node to the graph.
  1829       ///
  1830       Node addNode() {
  1831 	return INVALID;
  1832       }
  1833     
  1834       /// \brief Adds a new edge connects the given two nodes.
  1835       ///
  1836       /// Adds a new edge connects the the given two nodes.
  1837       Edge addEdge(const Node&, const Node&) {
  1838 	return INVALID;
  1839       }
  1840 
  1841       template <typename _Graph>
  1842       struct Constraints {
  1843 	void constraints() {
  1844           checkConcept<Base, _Graph>();
  1845 	  typename _Graph::Node node_a, node_b;
  1846 	  node_a = graph.addNode();
  1847 	  node_b = graph.addNode();
  1848 	  typename _Graph::Edge edge;
  1849 	  edge = graph.addEdge(node_a, node_b);
  1850 	}
  1851 
  1852 	_Graph& graph;
  1853       };
  1854     };
  1855 
  1856     /// \brief An empty extendable base undirected graph class.
  1857     ///
  1858     /// This class provides beside the core undirected graph features
  1859     /// core undircted graph extend interface for the graph structure.
  1860     /// The main difference between the base and this interface is
  1861     /// that the graph alterations should handled already on this
  1862     /// level.
  1863     template <typename _Base = BaseUGraphComponent>
  1864     class ExtendableUGraphComponent : public _Base {
  1865     public:
  1866 
  1867       typedef _Base Base;
  1868       typedef typename _Base::Node Node;
  1869       typedef typename _Base::UEdge UEdge;
  1870 
  1871       /// \brief Adds a new node to the graph.
  1872       ///
  1873       /// Adds a new node to the graph.
  1874       ///
  1875       Node addNode() {
  1876 	return INVALID;
  1877       }
  1878     
  1879       /// \brief Adds a new edge connects the given two nodes.
  1880       ///
  1881       /// Adds a new edge connects the the given two nodes.
  1882       UEdge addEdge(const Node&, const Node&) {
  1883 	return INVALID;
  1884       }
  1885 
  1886       template <typename _Graph>
  1887       struct Constraints {
  1888 	void constraints() {
  1889 	  checkConcept<Base, _Graph>();
  1890 	  typename _Graph::Node node_a, node_b;
  1891 	  node_a = graph.addNode();
  1892 	  node_b = graph.addNode();
  1893 	  typename _Graph::UEdge uedge;
  1894 	  uedge = graph.addUEdge(node_a, node_b);
  1895 	}
  1896 
  1897 	_Graph& graph;
  1898       };
  1899     };
  1900 
  1901     /// \brief An empty extendable base undirected graph class.
  1902     ///
  1903     /// This class provides beside the core bipartite undirected graph
  1904     /// features core undircted graph extend interface for the graph
  1905     /// structure.  The main difference between the base and this
  1906     /// interface is that the graph alterations should handled already
  1907     /// on this level.
  1908     template <typename _Base = BaseBpUGraphComponent>
  1909     class ExtendableBpUGraphComponent 
  1910       : public ExtendableUGraphComponent<_Base> {
  1911 
  1912       typedef _Base Base;
  1913 
  1914       template <typename _Graph>
  1915       struct Constraints {
  1916 	void constraints() {
  1917           checkConcept<ExtendableUGraphComponent<Base>, _Graph>();
  1918 	}
  1919       };
  1920     };
  1921 
  1922     /// \brief An empty erasable graph class.
  1923     ///  
  1924     /// This class provides beside the core graph features core erase
  1925     /// functions for the graph structure. The main difference between
  1926     /// the base and this interface is that the graph alterations
  1927     /// should handled already on this level.
  1928     template <typename _Base = BaseGraphComponent>
  1929     class ErasableGraphComponent : public _Base {
  1930     public:
  1931 
  1932       typedef _Base Base;
  1933       typedef typename Base::Node Node;
  1934       typedef typename Base::Edge Edge;
  1935 
  1936       /// \brief Erase a node from the graph.
  1937       ///
  1938       /// Erase a node from the graph. This function should 
  1939       /// erase all edges connecting to the node.
  1940       void erase(const Node&) {}    
  1941 
  1942       /// \brief Erase an edge from the graph.
  1943       ///
  1944       /// Erase an edge from the graph.
  1945       ///
  1946       void erase(const Edge&) {}
  1947 
  1948       template <typename _Graph>
  1949       struct Constraints {
  1950 	void constraints() {
  1951           checkConcept<Base, _Graph>();
  1952 	  typename _Graph::Node node;
  1953 	  graph.erase(node);
  1954 	  typename _Graph::Edge edge;
  1955 	  graph.erase(edge);
  1956 	}
  1957 
  1958 	_Graph& graph;
  1959       };
  1960     };
  1961 
  1962     /// \brief An empty erasable base undirected graph class.
  1963     ///  
  1964     /// This class provides beside the core undirected graph features
  1965     /// core erase functions for the undirceted graph structure. The
  1966     /// main difference between the base and this interface is that
  1967     /// the graph alterations should handled already on this level.
  1968     template <typename _Base = BaseUGraphComponent>
  1969     class ErasableUGraphComponent : public _Base {
  1970     public:
  1971 
  1972       typedef _Base Base;
  1973       typedef typename Base::Node Node;
  1974       typedef typename Base::UEdge UEdge;
  1975 
  1976       /// \brief Erase a node from the graph.
  1977       ///
  1978       /// Erase a node from the graph. This function should erase
  1979       /// edges connecting to the node.
  1980       void erase(const Node&) {}    
  1981 
  1982       /// \brief Erase an edge from the graph.
  1983       ///
  1984       /// Erase an edge from the graph.
  1985       ///
  1986       void erase(const UEdge&) {}
  1987 
  1988       template <typename _Graph>
  1989       struct Constraints {
  1990 	void constraints() {
  1991           checkConcept<Base, _Graph>();
  1992 	  typename _Graph::Node node;
  1993 	  graph.erase(node);
  1994 	  typename _Graph::Edge edge;
  1995 	  graph.erase(edge);
  1996 	}
  1997 
  1998 	_Graph& graph;
  1999       };
  2000     };
  2001 
  2002     /// \brief An empty erasable base bipartite undirected graph class.
  2003     ///  
  2004     /// This class provides beside the core bipartite undirected graph
  2005     /// features core erase functions for the undirceted graph
  2006     /// structure. The main difference between the base and this
  2007     /// interface is that the graph alterations should handled already
  2008     /// on this level.
  2009     template <typename _Base = BaseBpUGraphComponent>
  2010     class ErasableBpUGraphComponent : public ErasableUGraphComponent<_Base> {
  2011     public:
  2012 
  2013       typedef _Base Base;
  2014 
  2015       template <typename _Graph>
  2016       struct Constraints {
  2017 	void constraints() {
  2018           checkConcept<ErasableUGraphComponent<Base>, _Graph>();
  2019 	}
  2020       };
  2021     };
  2022 
  2023     /// \brief An empty clearable base graph class.
  2024     ///
  2025     /// This class provides beside the core graph features core clear
  2026     /// functions for the graph structure. The main difference between
  2027     /// the base and this interface is that the graph alterations
  2028     /// should handled already on this level.
  2029     template <typename _Base = BaseGraphComponent>
  2030     class ClearableGraphComponent : public _Base {
  2031     public:
  2032 
  2033       typedef _Base Base;
  2034 
  2035       /// \brief Erase all nodes and edges from the graph.
  2036       ///
  2037       /// Erase all nodes and edges from the graph.
  2038       ///
  2039       void clear() {}    
  2040 
  2041       template <typename _Graph>
  2042       struct Constraints {
  2043 	void constraints() {
  2044           checkConcept<Base, _Graph>();
  2045 	  graph.clear();
  2046 	}
  2047 
  2048 	_Graph graph;
  2049       };
  2050     };
  2051 
  2052     /// \brief An empty clearable base undirected graph class.
  2053     ///
  2054     /// This class provides beside the core undirected graph features
  2055     /// core clear functions for the undirected graph structure. The
  2056     /// main difference between the base and this interface is that
  2057     /// the graph alterations should handled already on this level.
  2058     template <typename _Base = BaseUGraphComponent>
  2059     class ClearableUGraphComponent : public ClearableUGraphComponent<_Base> {
  2060     public:
  2061 
  2062       typedef _Base Base;
  2063 
  2064       template <typename _Graph>
  2065       struct Constraints {
  2066 	void constraints() {
  2067           checkConcept<ClearableUGraphComponent<Base>, _Graph>();
  2068 	}
  2069 
  2070 	_Graph graph;
  2071       };
  2072     };
  2073 
  2074     /// \brief An empty clearable base bipartite undirected graph
  2075     /// class.
  2076     ///
  2077     /// This class provides beside the core bipartite undirected graph
  2078     /// features core clear functions for the undirected graph
  2079     /// structure. The main difference between the base and this
  2080     /// interface is that the graph alterations should handled already
  2081     /// on this level.
  2082     template <typename _Base = BaseUGraphComponent>
  2083     class ClearableBpUGraphComponent 
  2084       : public ClearableBpUGraphComponent<_Base> {
  2085     public:
  2086 
  2087       typedef _Base Base;
  2088 
  2089       template <typename _Graph>
  2090       struct Constraints {
  2091 	void constraints() {
  2092           checkConcept<ClearableBpUGraphComponent<Base>, _Graph>();
  2093 	}
  2094 
  2095       };
  2096 
  2097     };
  2098 
  2099   }
  2100 
  2101 }
  2102 
  2103 #endif