src/lemon/concept/graph.h
changeset 1022 567f392d1d2e
parent 987 87f7c54892df
child 1030 c8a41699e613
equal deleted inserted replaced
3:3b7e16294e9a 4:bb8010e62f34
    99 	
    99 	
   100 // 	/// \sa operator==(Node n)
   100 // 	/// \sa operator==(Node n)
   101 // 	///
   101 // 	///
   102 // 	bool operator!=(Node) const { return true; }
   102 // 	bool operator!=(Node) const { return true; }
   103 
   103 
   104 //  	///Comparison operator.
       
   105 
       
   106 // 	///This is a strict ordering between the nodes.
       
   107 // 	///
       
   108 // 	///This ordering can be different from the order in which NodeIt
       
   109 // 	///goes through the nodes.
       
   110 // 	///\todo Possibly we don't need it.
       
   111 // 	bool operator<(Node) const { return true; }
       
   112 //       };
   104 //       };
   113     
   105     
   114 //       /// This iterator goes through each node.
   106 //       /// This iterator goes through each node.
   115 
   107 
   116 //       /// This iterator goes through each node.
   108 //       /// This iterator goes through each node.
   186 // 	/// Inequality operator
   178 // 	/// Inequality operator
   187 
   179 
   188 // 	/// \sa operator==(Node n)
   180 // 	/// \sa operator==(Node n)
   189 // 	///
   181 // 	///
   190 // 	bool operator!=(Edge) const { return true; }
   182 // 	bool operator!=(Edge) const { return true; }
   191 //  	///Comparison operator.
       
   192 
       
   193 // 	///This is a strict ordering between the nodes.
       
   194 // 	///
       
   195 // 	///This ordering can be different from the order in which NodeIt
       
   196 // 	///goes through the nodes.
       
   197 // 	///\todo Possibly we don't need it.
       
   198 //  	bool operator<(Edge) const { return true; }
       
   199 //       };
   183 //       };
   200     
   184     
   201 //       /// This iterator goes trough the outgoing edges of a node.
   185 //       /// This iterator goes trough the outgoing edges of a node.
   202 
   186 
   203 //       /// This iterator goes trough the \e outgoing edges of a certain node
   187 //       /// This iterator goes trough the \e outgoing edges of a certain node
   337 	
   321 	
   338 // 	/// Assign the iterator to the next 
   322 // 	/// Assign the iterator to the next 
   339 // 	/// edge of the corresponding node.
   323 // 	/// edge of the corresponding node.
   340 // 	EdgeIt& operator++() { return *this; }
   324 // 	EdgeIt& operator++() { return *this; }
   341 //       };
   325 //       };
   342 
       
   343 //       /// First node of the graph.
       
   344 
       
   345 //       /// \retval i the first node.
       
   346 //       /// \return the first node.
       
   347 //       ///
       
   348 //       NodeIt& first(NodeIt& i) const { return i; }
       
   349 
       
   350 //       /// The first incoming edge.
       
   351 
       
   352 //       /// The first incoming edge.
       
   353 //       ///
       
   354 //       InEdgeIt& first(InEdgeIt &i, Node) const { return i; }
       
   355 //       /// The first outgoing edge.
       
   356 
       
   357 //       /// The first outgoing edge.
       
   358 //       ///
       
   359 //       OutEdgeIt& first(OutEdgeIt& i, Node) const { return i; }
       
   360 //       /// The first edge of the Graph.
       
   361 
       
   362 //       /// The first edge of the Graph.
       
   363 //       ///
       
   364 //       EdgeIt& first(EdgeIt& i) const { return i; }
       
   365 
       
   366 //       ///Gives back the target node of an edge.
   326 //       ///Gives back the target node of an edge.
   367 
   327 
   368 //       ///Gives back the target node of an edge.
   328 //       ///Gives back the target node of an edge.
   369 //       ///
   329 //       ///
   370 //       Node target(Edge) const { return INVALID; }
   330 //       Node target(Edge) const { return INVALID; }
   371 //       ///Gives back the source node of an edge.
   331 //       ///Gives back the source node of an edge.
   372 
   332 
   373 //       ///Gives back the source node of an edge.
   333 //       ///Gives back the source node of an edge.
   374 //       ///
   334 //       ///
   375 //       Node source(Edge) const { return INVALID; }
   335 //       Node source(Edge) const { return INVALID; }
   376   
   336 //       /// Read write map of the nodes to type \c T.
   377 //       ///Gives back the \e id of a node.
       
   378 
       
   379 //       ///\warning Not all graph structures provide this feature.
       
   380 //       ///
       
   381 //       ///\todo Should each graph provide \c id?
       
   382 //       int id(const Node&) const { return 0; }
       
   383 //       ///Gives back the \e id of an edge.
       
   384 
       
   385 //       ///\warning Not all graph structures provide this feature.
       
   386 //       ///
       
   387 //       ///\todo Should each graph provide \c id?
       
   388 //       int id(const Edge&) const { return 0; }
       
   389 
       
   390 //       ///\e
       
   391       
       
   392 //       ///\todo Should it be in the concept?
       
   393 //       ///
       
   394 //       int nodeNum() const { return 0; }
       
   395 //       ///\e
       
   396 
       
   397 //       ///\todo Should it be in the concept?
       
   398 //       ///
       
   399 //       int edgeNum() const { return 0; }
       
   400 
       
   401 
       
   402 //       ///Reference map of the nodes to type \c T.
       
   403 
   337 
   404 //       /// \ingroup concept
   338 //       /// \ingroup concept
   405 //       ///Reference map of the nodes to type \c T.
   339 //       /// ReadWrite map of the nodes to type \c T.
   406 //       /// \sa Reference
   340 //       /// \sa Reference
   407 //       /// \warning Making maps that can handle bool type (NodeMap<bool>)
   341 //       /// \warning Making maps that can handle bool type (NodeMap<bool>)
   408 //       /// needs some extra attention!
   342 //       /// needs some extra attention!
   409 //       template<class T> class NodeMap : public ReferenceMap< Node, T >
   343 //       template<class T> 
       
   344 //       class NodeMap : public ReadWriteMap< Node, T >
   410 //       {
   345 //       {
   411 //       public:
   346 //       public:
   412 
   347 
   413 // 	///\e
   348 // 	///\e
   414 // 	NodeMap(const StaticGraph&) { }
   349 // 	NodeMap(const StaticGraph&) { }
   415 // 	///\e
   350 // 	///\e
   416 // 	NodeMap(const StaticGraph&, T) { }
   351 // 	NodeMap(const StaticGraph&, T) { }
   417 
   352 
   418 // 	///Copy constructor
   353 // 	///Copy constructor
   419 // 	template<typename TT> NodeMap(const NodeMap<TT>&) { }
   354 // 	NodeMap(const NodeMap&) { }
   420 // 	///Assignment operator
   355 // 	///Assignment operator
   421 // 	template<typename TT> NodeMap& operator=(const NodeMap<TT>&)
   356 // 	NodeMap& operator=(const NodeMap&) { return *this; }
   422 // 	{ return *this; }
   357 // 	// \todo fix this concept
   423 //       };
   358 //       };
   424 
   359 
   425 //       ///Reference map of the edges to type \c T.
   360 //       /// Read write map of the edges to type \c T.
   426 
   361 
   427 //       /// \ingroup concept
   362 //       /// \ingroup concept
   428 //       ///Reference map of the edges to type \c T.
   363 //       ///Reference map of the edges to type \c T.
   429 //       /// \sa Reference
   364 //       /// \sa Reference
   430 //       /// \warning Making maps that can handle bool type (EdgeMap<bool>)
   365 //       /// \warning Making maps that can handle bool type (EdgeMap<bool>)
   431 //       /// needs some extra attention!
   366 //       /// needs some extra attention!
   432 //       template<class T> class EdgeMap
   367 //       template<class T> 
   433 // 	: public ReferenceMap<Edge,T>
   368 //       class EdgeMap : public ReadWriteMap<Edge,T>
   434 //       {
   369 //       {
   435 //       public:
   370 //       public:
   436 
   371 
   437 // 	///\e
   372 // 	///\e
   438 // 	EdgeMap(const StaticGraph&) { }
   373 // 	EdgeMap(const StaticGraph&) { }
   439 // 	///\e
   374 // 	///\e
   440 // 	EdgeMap(const StaticGraph&, T) { }
   375 // 	EdgeMap(const StaticGraph&, T) { }
   441     
       
   442 // 	///Copy constructor
   376 // 	///Copy constructor
   443 // 	template<typename TT> EdgeMap(const EdgeMap<TT>&) { }
   377 // 	EdgeMap(const EdgeMap&) { }
   444 // 	///Assignment operator
   378 // 	///Assignment operator
   445 // 	template<typename TT> EdgeMap &operator=(const EdgeMap<TT>&)
   379 // 	EdgeMap& operator=(const EdgeMap&) { return *this; }
   446 // 	{ return *this; }
   380 // 	// \todo fix this concept    
   447 //       };
   381 //       };
   448 //     };
   382 //     };
   449 
   383 
   450 //     struct DummyType {
       
   451 //       int value;
       
   452 //       DummyType() {}
       
   453 //       DummyType(int p) : value(p) {}
       
   454 //       DummyType& operator=(int p) { value = p; return *this;}
       
   455 //     };
       
   456     
       
   457 //     ///\brief Checks whether \c G meets the
       
   458 //     ///\ref lemon::concept::StaticGraph "StaticGraph" concept
       
   459 //     template<class Graph> void checkCompileStaticGraph(Graph &G) 
       
   460 //     {
       
   461 //       typedef typename Graph::Node Node;
       
   462 //       typedef typename Graph::NodeIt NodeIt;
       
   463 //       typedef typename Graph::Edge Edge;
       
   464 //       typedef typename Graph::EdgeIt EdgeIt;
       
   465 //       typedef typename Graph::InEdgeIt InEdgeIt;
       
   466 //       typedef typename Graph::OutEdgeIt OutEdgeIt;
       
   467   
       
   468 //       {
       
   469 // 	Node i; Node j(i); Node k(INVALID);
       
   470 // 	i=j;
       
   471 // 	bool b; b=true;
       
   472 // 	b=(i==INVALID); b=(i!=INVALID);
       
   473 // 	b=(i==j); b=(i!=j); b=(i<j);
       
   474 //       }
       
   475 //       {
       
   476 // 	NodeIt i; NodeIt j(i); NodeIt k(INVALID); NodeIt l(G);
       
   477 // 	i=j;
       
   478 // 	j=G.first(i);
       
   479 // 	j=++i;
       
   480 // 	bool b; b=true;
       
   481 // 	b=(i==INVALID); b=(i!=INVALID);
       
   482 // 	Node n(i);
       
   483 // 	n=i;
       
   484 // 	b=(i==j); b=(i!=j); b=(i<j);
       
   485 // 	//Node ->NodeIt conversion
       
   486 // 	NodeIt ni(G,n);
       
   487 //       }
       
   488 //       {
       
   489 // 	Edge i; Edge j(i); Edge k(INVALID);
       
   490 // 	i=j;
       
   491 // 	bool b; b=true;
       
   492 // 	b=(i==INVALID); b=(i!=INVALID);
       
   493 // 	b=(i==j); b=(i!=j); b=(i<j);
       
   494 //       }
       
   495 //       {
       
   496 // 	EdgeIt i; EdgeIt j(i); EdgeIt k(INVALID); EdgeIt l(G);
       
   497 // 	i=j;
       
   498 // 	j=G.first(i);
       
   499 // 	j=++i;
       
   500 // 	bool b; b=true;
       
   501 // 	b=(i==INVALID); b=(i!=INVALID);
       
   502 // 	Edge e(i);
       
   503 // 	e=i;
       
   504 // 	b=(i==j); b=(i!=j); b=(i<j);
       
   505 // 	//Edge ->EdgeIt conversion
       
   506 // 	EdgeIt ei(G,e);
       
   507 //       }
       
   508 //       {
       
   509 // 	Node n;
       
   510 // 	InEdgeIt i; InEdgeIt j(i); InEdgeIt k(INVALID); InEdgeIt l(G,n);
       
   511 // 	i=j;
       
   512 // 	j=G.first(i,n);
       
   513 // 	j=++i;
       
   514 // 	bool b; b=true;
       
   515 // 	b=(i==INVALID); b=(i!=INVALID);
       
   516 // 	Edge e(i);
       
   517 // 	e=i;
       
   518 // 	b=(i==j); b=(i!=j); b=(i<j);
       
   519 // 	//Edge ->InEdgeIt conversion
       
   520 // 	InEdgeIt ei(G,e);
       
   521 //       }
       
   522 //       {
       
   523 // 	Node n;
       
   524 // 	OutEdgeIt i; OutEdgeIt j(i); OutEdgeIt k(INVALID); OutEdgeIt l(G,n);
       
   525 // 	i=j;
       
   526 // 	j=G.first(i,n);
       
   527 // 	j=++i;
       
   528 // 	bool b; b=true;
       
   529 // 	b=(i==INVALID); b=(i!=INVALID);
       
   530 // 	Edge e(i);
       
   531 // 	e=i;
       
   532 // 	b=(i==j); b=(i!=j); b=(i<j);
       
   533 // 	//Edge ->OutEdgeIt conversion
       
   534 // 	OutEdgeIt ei(G,e);
       
   535 //       }
       
   536 //       {
       
   537 // 	Node n,m;
       
   538 // 	n=m=INVALID;
       
   539 // 	Edge e;
       
   540 // 	e=INVALID;
       
   541 // 	n=G.source(e);
       
   542 // 	n=G.target(e);
       
   543 //       }
       
   544 //       // id tests
       
   545 //       { Node n; int i=G.id(n); i=i; }
       
   546 //       { Edge e; int i=G.id(e); i=i; }
       
   547 //       //NodeMap tests
       
   548 //       {
       
   549 // 	Node k;
       
   550 // 	typename Graph::template NodeMap<int> m(G);
       
   551 // 	//Const map
       
   552 // 	typename Graph::template NodeMap<int> const &cm = m;
       
   553 // 	//Inicialize with default value
       
   554 // 	typename Graph::template NodeMap<int> mdef(G,12);
       
   555 // 	//Copy
       
   556 // 	typename Graph::template NodeMap<int> mm(cm);
       
   557 // 	//Copy from another type
       
   558 // 	typename Graph::template NodeMap<double> dm(cm);
       
   559 // 	//Copy to more complex type
       
   560 // 	typename Graph::template NodeMap<DummyType> em(cm);
       
   561 // 	int v;
       
   562 // 	v=m[k]; m[k]=v; m.set(k,v);
       
   563 // 	v=cm[k];
       
   564     
       
   565 // 	m=cm;  
       
   566 // 	dm=cm; //Copy from another type  
       
   567 // 	em=cm; //Copy to more complex type
       
   568 // 	{
       
   569 // 	  //Check the typedef's
       
   570 // 	  typename Graph::template NodeMap<int>::Value val;
       
   571 // 	  val=1;
       
   572 // 	  typename Graph::template NodeMap<int>::Key key;
       
   573 // 	  key = typename Graph::NodeIt(G);
       
   574 // 	}
       
   575 //       }  
       
   576 //       { //bool NodeMap
       
   577 // 	Node k;
       
   578 // 	typename Graph::template NodeMap<bool> m(G);
       
   579 // 	typename Graph::template NodeMap<bool> const &cm = m;  //Const map
       
   580 // 	//Inicialize with default value
       
   581 // 	typename Graph::template NodeMap<bool> mdef(G,12);
       
   582 // 	typename Graph::template NodeMap<bool> mm(cm);   //Copy
       
   583 // 	typename Graph::template NodeMap<int> dm(cm); //Copy from another type
       
   584 // 	bool v;
       
   585 // 	v=m[k]; m[k]=v; m.set(k,v);
       
   586 // 	v=cm[k];
       
   587     
       
   588 // 	m=cm;  
       
   589 // 	dm=cm; //Copy from another type
       
   590 // 	m=dm; //Copy to another type
       
   591 
       
   592 // 	{
       
   593 // 	  //Check the typedef's
       
   594 // 	  typename Graph::template NodeMap<bool>::Value val;
       
   595 // 	  val=true;
       
   596 // 	  typename Graph::template NodeMap<bool>::Key key;
       
   597 // 	  key= typename Graph::NodeIt(G);
       
   598 // 	}
       
   599 //       }
       
   600 //       //EdgeMap tests
       
   601 //       {
       
   602 // 	Edge k;
       
   603 // 	typename Graph::template EdgeMap<int> m(G);
       
   604 // 	typename Graph::template EdgeMap<int> const &cm = m;  //Const map
       
   605 // 	//Inicialize with default value
       
   606 // 	typename Graph::template EdgeMap<int> mdef(G,12);
       
   607 // 	typename Graph::template EdgeMap<int> mm(cm);   //Copy
       
   608 // 	typename Graph::template EdgeMap<double> dm(cm);//Copy from another type
       
   609 // 	int v;
       
   610 // 	v=m[k]; m[k]=v; m.set(k,v);
       
   611 // 	v=cm[k];
       
   612     
       
   613 // 	m=cm;  
       
   614 // 	dm=cm; //Copy from another type
       
   615 // 	{
       
   616 // 	  //Check the typedef's
       
   617 // 	  typename Graph::template EdgeMap<int>::Value val;
       
   618 // 	  val=1;
       
   619 // 	  typename Graph::template EdgeMap<int>::Key key;
       
   620 // 	  key= typename Graph::EdgeIt(G);
       
   621 // 	}
       
   622 //       }  
       
   623 //       { //bool EdgeMap
       
   624 // 	Edge k;
       
   625 // 	typename Graph::template EdgeMap<bool> m(G);
       
   626 // 	typename Graph::template EdgeMap<bool> const &cm = m;  //Const map
       
   627 // 	//Inicialize with default value
       
   628 // 	typename Graph::template EdgeMap<bool> mdef(G,12);
       
   629 // 	typename Graph::template EdgeMap<bool> mm(cm);   //Copy
       
   630 // 	typename Graph::template EdgeMap<int> dm(cm); //Copy from another type
       
   631 // 	bool v;
       
   632 // 	v=m[k]; m[k]=v; m.set(k,v);
       
   633 // 	v=cm[k];
       
   634     
       
   635 // 	m=cm;  
       
   636 // 	dm=cm; //Copy from another type
       
   637 // 	m=dm; //Copy to another type
       
   638 // 	{
       
   639 // 	  //Check the typedef's
       
   640 // 	  typename Graph::template EdgeMap<bool>::Value val;
       
   641 // 	  val=true;
       
   642 // 	  typename Graph::template EdgeMap<bool>::Key key;
       
   643 // 	  key= typename Graph::EdgeIt(G);
       
   644 // 	}
       
   645 //       }
       
   646 //     }
       
   647     
       
   648 //     /// An empty non-static graph class.
   384 //     /// An empty non-static graph class.
   649     
   385     
   650 //     /// This class provides everything that \ref StaticGraph
   386 //     /// This class provides everything that \ref StaticGraph
   651 //     /// with additional functionality which enables to build a
   387 //     /// with additional functionality which enables to build a
   652 //     /// graph from scratch.
   388 //     /// graph from scratch.
   663 //       /// \return the new node.
   399 //       /// \return the new node.
   664 //       ///
   400 //       ///
   665 //       Node addNode() { return INVALID; }
   401 //       Node addNode() { return INVALID; }
   666 //       ///Add a new edge to the graph.
   402 //       ///Add a new edge to the graph.
   667 
   403 
   668 //       ///Add a new edge to the graph with source node \c t
   404 //       ///Add a new edge to the graph with source node \c s
   669 //       ///and target node \c h.
   405 //       ///and target node \c t.
   670 //       ///\return the new edge.
   406 //       ///\return the new edge.
   671 //       Edge addEdge(Node h, Node t) { return INVALID; }
   407 //       Edge addEdge(Node s, Node t) { return INVALID; }
   672     
   408     
   673 //       /// Resets the graph.
   409 //       /// Resets the graph.
   674 
   410 
   675 //       /// This function deletes all edges and nodes of the graph.
   411 //       /// This function deletes all edges and nodes of the graph.
   676 //       /// It also frees the memory allocated to store them.
   412 //       /// It also frees the memory allocated to store them.
   677 //       /// \todo It might belong to \ref ErasableGraph.
   413 //       /// \todo It might belong to \ref ErasableGraph.
   678 //       void clear() { }
   414 //       void clear() { }
   679 //     };
   415 //     };
   680 
       
   681     
       
   682 //     ///\brief Checks whether \c G meets the
       
   683 //     ///\ref lemon::concept::ExtendableGraph "ExtendableGraph" concept
       
   684 //     template<class Graph> void checkCompileExtendableGraph(Graph &G) 
       
   685 //     {
       
   686 //       checkCompileStaticGraph(G);
       
   687 
       
   688 //       typedef typename Graph::Node Node;
       
   689 //       typedef typename Graph::NodeIt NodeIt;
       
   690 //       typedef typename Graph::Edge Edge;
       
   691 //       typedef typename Graph::EdgeIt EdgeIt;
       
   692 //       typedef typename Graph::InEdgeIt InEdgeIt;
       
   693 //       typedef typename Graph::OutEdgeIt OutEdgeIt;
       
   694   
       
   695 //       Node n,m;
       
   696 //       n=G.addNode();
       
   697 //       m=G.addNode();
       
   698 //       Edge e;
       
   699 //       e=G.addEdge(n,m); 
       
   700   
       
   701 //       //  G.clear();
       
   702 //     }
       
   703 
       
   704 
   416 
   705 //     /// An empty erasable graph class.
   417 //     /// An empty erasable graph class.
   706   
   418   
   707 //     /// This class is an extension of \ref ExtendableGraph. It also makes it
   419 //     /// This class is an extension of \ref ExtendableGraph. It also makes it
   708 //     /// possible to erase edges or nodes.
   420 //     /// possible to erase edges or nodes.
   723 
   435 
   724 //       /// Deletes edge \c e edge.
   436 //       /// Deletes edge \c e edge.
   725 //       ///
   437 //       ///
   726 //       void erase(Edge e) { }
   438 //       void erase(Edge e) { }
   727 //     };
   439 //     };
   728     
   440 
   729 //     template<class Graph> void checkCompileGraphEraseEdge(Graph &G) 
   441     
   730 //     {
       
   731 //       typename Graph::Edge e;
       
   732 //       G.erase(e);
       
   733 //     }
       
   734 
       
   735 //     template<class Graph> void checkCompileGraphEraseNode(Graph &G) 
       
   736 //     {
       
   737 //       typename Graph::Node n;
       
   738 //       G.erase(n);
       
   739 //     }
       
   740 
       
   741 //     ///\brief Checks whether \c G meets the
       
   742 //     ///\ref lemon::concept::EresableGraph "EresableGraph" concept
       
   743 //     template<class Graph> void checkCompileErasableGraph(Graph &G) 
       
   744 //     {
       
   745 //       checkCompileExtendableGraph(G);
       
   746 //       checkCompileGraphEraseNode(G);
       
   747 //       checkCompileGraphEraseEdge(G);
       
   748 //     }
       
   749 
       
   750 //     ///Checks whether a graph has findEdge() member function.
       
   751     
       
   752 //     ///\todo findEdge() might be a global function.
       
   753 //     ///
       
   754 //     template<class Graph> void checkCompileGraphFindEdge(Graph &G) 
       
   755 //     {
       
   756 //       typedef typename Graph::NodeIt Node;
       
   757 //       typedef typename Graph::NodeIt NodeIt;
       
   758 
       
   759 //       G.findEdge(NodeIt(G),++NodeIt(G),G.findEdge(NodeIt(G),++NodeIt(G)));
       
   760 //       G.findEdge(Node(),Node(),G.findEdge(Node(),Node()));  
       
   761 //     }
       
   762 
       
   763 
       
   764 
       
   765     /************* New GraphBase stuff **************/
   442     /************* New GraphBase stuff **************/
   766 
   443 
   767 
   444 
   768     /// A minimal GraphBase concept
   445     /// A minimal GraphBase concept
   769 
   446 
   813       // We need a special slimer concept which does not provide maps (it
   490       // We need a special slimer concept which does not provide maps (it
   814       // wouldn't be strictly slimer, cause for map-factory id() & friends
   491       // wouldn't be strictly slimer, cause for map-factory id() & friends
   815       // a required...)
   492       // a required...)
   816 
   493 
   817       template<typename T>
   494       template<typename T>
   818       class NodeMap : public GraphMap<Node, T, GraphBase> {};
   495       class NodeMap : public GraphMap<GraphBase, Node, T> {};
   819 
   496 
   820       template<typename T>
   497       template<typename T>
   821       class EdgeMap : public GraphMap<Edge, T, GraphBase> {};
   498       class EdgeMap : public GraphMap<GraphBase, Node, T> {};
   822     };
   499     };
   823 
   500 
   824 
   501 
   825 
   502 
   826 
   503 
   831       :  virtual public BaseGraphComponent,
   508       :  virtual public BaseGraphComponent,
   832 	 public IterableGraphComponent, public MappableGraphComponent {
   509 	 public IterableGraphComponent, public MappableGraphComponent {
   833     public:
   510     public:
   834       typedef BaseGraphComponent::Node Node;
   511       typedef BaseGraphComponent::Node Node;
   835       typedef BaseGraphComponent::Edge Edge;
   512       typedef BaseGraphComponent::Edge Edge;
   836     };
   513 
   837 
   514       template <typename _Graph>
   838     template <typename Graph>
   515       struct Constraints {
   839     struct StaticGraphConcept {
   516 	void constraints() {
   840       void constraints() {
   517 	  checkConcept<IterableGraphComponent, _Graph>();
   841 	function_requires<IterableGraphComponentConcept<Graph> >();
   518 	  checkConcept<MappableGraphComponent, _Graph>();
   842 	function_requires<MappableGraphComponentConcept<Graph> >();
   519 	}
   843       }
   520       };
   844     };
   521     };
   845 
   522 
   846     class ExtendableGraph 
   523     class ExtendableGraph 
   847       :  virtual public BaseGraphComponent, public StaticGraph,
   524       :  virtual public BaseGraphComponent, public StaticGraph,
   848 	 public ExtendableGraphComponent, public ClearableGraphComponent {
   525 	 public ExtendableGraphComponent, public ClearableGraphComponent {
   849     public:
   526     public:
   850       typedef BaseGraphComponent::Node Node;
   527       typedef BaseGraphComponent::Node Node;
   851       typedef BaseGraphComponent::Edge Edge;
   528       typedef BaseGraphComponent::Edge Edge;
   852     };
   529 
   853 
   530       template <typename _Graph>
   854     template <typename Graph>
   531       struct Constraints {
   855     struct ExtendableGraphConcept {
   532 	void constraints() {
   856       void constraints() {
   533 	  checkConcept<StaticGraph, _Graph >();
   857 	function_requires<StaticGraphConcept<Graph> >();
   534 	  checkConcept<ExtendableGraphComponent, _Graph >();
   858 	function_requires<ExtendableGraphComponentConcept<Graph> >();
   535 	  checkConcept<ClearableGraphComponent, _Graph >();
   859 	function_requires<ClearableGraphComponentConcept<Graph> >();
   536 	}
   860       }
   537       };
   861     };
   538     };
   862 
   539 
   863     class ErasableGraph 
   540     class ErasableGraph 
   864       :  virtual public BaseGraphComponent, public ExtendableGraph,
   541       :  virtual public BaseGraphComponent, public ExtendableGraph,
   865 	 public ErasableGraphComponent {
   542 	 public ErasableGraphComponent {
   866     public:
   543     public:
   867       typedef BaseGraphComponent::Node Node;
   544       typedef BaseGraphComponent::Node Node;
   868       typedef BaseGraphComponent::Edge Edge;
   545       typedef BaseGraphComponent::Edge Edge;
   869     };
   546 
   870 
   547       template <typename _Graph>
   871     template <typename Graph>
   548       struct Constraints {
   872     struct ErasableGraphConcept {
   549 	void constraints() {
   873       void constraints() {
   550 	  checkConcept<ExtendableGraph, _Graph >();
   874 	function_requires<ExtendableGraphConcept<Graph> >();
   551 	  checkConcept<ErasableGraphComponent, _Graph >();
   875 	function_requires<ErasableGraphComponentConcept<Graph> >();
   552 	}
   876       }
   553       };
   877     };
   554     };
   878 
   555 
   879     // @}
   556     // @}
   880   } //namespace concept  
   557   } //namespace concept  
   881 } //namespace lemon
   558 } //namespace lemon