lemon/concepts/graph_components.h
changeset 88 18444049848b
child 78 c46b3453455f
equal deleted inserted replaced
-1:000000000000 0:0c29854eb20b
       
     1 /* -*- C++ -*-
       
     2  *
       
     3  * This file is a part of LEMON, a generic C++ optimization library
       
     4  *
       
     5  * Copyright (C) 2003-2007
       
     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 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/concepts/maps.h>
       
    29 
       
    30 #include <lemon/bits/alteration_notifier.h>
       
    31 
       
    32 namespace lemon {
       
    33   namespace concepts {
       
    34 
       
    35     /// \brief Skeleton class for graph Node and Arc types
       
    36     ///
       
    37     /// This class describes the interface of Node and Arc (and Edge
       
    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 Arc types should \em not derive from the same base class.
       
    43     /// For Node you should instantiate it with character 'n' and for Arc
       
    44     /// with 'a'.
       
    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 directed graph class.
       
   115     ///  
       
   116     /// This class provides the minimal set of features needed for a
       
   117     /// directed graph structure. All digraph concepts have to be
       
   118     /// conform to this base directed graph. It just provides types
       
   119     /// for nodes and arcs and functions to get the source and the
       
   120     /// target of the arcs.
       
   121     class BaseDigraphComponent {
       
   122     public:
       
   123 
       
   124       typedef BaseDigraphComponent Digraph;
       
   125       
       
   126       /// \brief Node class of the digraph.
       
   127       ///
       
   128       /// This class represents the Nodes of the digraph. 
       
   129       ///
       
   130       typedef GraphItem<'n'> Node;
       
   131 
       
   132       /// \brief Arc class of the digraph.
       
   133       ///
       
   134       /// This class represents the Arcs of the digraph. 
       
   135       ///
       
   136       typedef GraphItem<'e'> Arc;
       
   137 
       
   138       /// \brief Gives back the target node of an arc.
       
   139       ///
       
   140       /// Gives back the target node of an arc.
       
   141       ///
       
   142       Node target(const Arc&) const { return INVALID;}
       
   143 
       
   144       /// \brief Gives back the source node of an arc.
       
   145       ///
       
   146       /// Gives back the source node of an arc.
       
   147       ///
       
   148       Node source(const Arc&) const { return INVALID;}
       
   149 
       
   150       /// \brief Gives back the opposite node on the given arc.
       
   151       ///
       
   152       /// Gives back the opposite node on the given arc.
       
   153       Node oppositeNode(const Node&, const Arc&) const {
       
   154         return INVALID;
       
   155       }
       
   156 
       
   157       template <typename _Digraph>
       
   158       struct Constraints {
       
   159 	typedef typename _Digraph::Node Node;
       
   160 	typedef typename _Digraph::Arc Arc;
       
   161       
       
   162 	void constraints() {
       
   163 	  checkConcept<GraphItem<'n'>, Node>();
       
   164 	  checkConcept<GraphItem<'a'>, Arc>();
       
   165 	  {
       
   166 	    Node n;
       
   167 	    Arc e(INVALID);
       
   168 	    n = digraph.source(e);
       
   169 	    n = digraph.target(e);
       
   170             n = digraph.oppositeNode(n, e);
       
   171 	  }      
       
   172 	}
       
   173       
       
   174 	const _Digraph& digraph;
       
   175       };
       
   176     };
       
   177 
       
   178     /// \brief An empty base undirected graph class.
       
   179     ///  
       
   180     /// This class provides the minimal set of features needed for an
       
   181     /// undirected graph structure. All undirected graph concepts have
       
   182     /// to be conform to this base graph. It just provides types for
       
   183     /// nodes, arcs and edges and functions to get the
       
   184     /// source and the target of the arcs and edges,
       
   185     /// conversion from arcs to edges and function to get
       
   186     /// both direction of the edges.
       
   187     class BaseGraphComponent : public BaseDigraphComponent {
       
   188     public:
       
   189       typedef BaseDigraphComponent::Node Node;
       
   190       typedef BaseDigraphComponent::Arc Arc;
       
   191       /// \brief Undirected arc class of the graph.
       
   192       ///
       
   193       /// This class represents the edges of the graph.
       
   194       /// The undirected graphs can be used as a directed graph which
       
   195       /// for each arc contains the opposite arc too so the graph is
       
   196       /// bidirected. The edge represents two opposite
       
   197       /// directed arcs.
       
   198       class Edge : public GraphItem<'u'> {
       
   199       public:
       
   200         typedef GraphItem<'u'> Parent;
       
   201         /// \brief Default constructor.
       
   202         ///      
       
   203         /// \warning The default constructor is not required to set
       
   204         /// the item to some well-defined value. So you should consider it
       
   205         /// as uninitialized.
       
   206         Edge() {}
       
   207         /// \brief Copy constructor.
       
   208         ///
       
   209         /// Copy constructor.
       
   210         ///
       
   211         Edge(const Edge &) : Parent() {}
       
   212         /// \brief Invalid constructor \& conversion.
       
   213         ///
       
   214         /// This constructor initializes the item to be invalid.
       
   215         /// \sa Invalid for more details.
       
   216         Edge(Invalid) {}
       
   217         /// \brief Converter from arc to edge.
       
   218         ///
       
   219         /// Besides the core graph item functionality each arc should
       
   220         /// be convertible to the represented edge. 
       
   221         Edge(const Arc&) {}
       
   222         /// \brief Assign arc to edge.
       
   223         ///
       
   224         /// Besides the core graph item functionality each arc should
       
   225         /// be convertible to the represented edge. 
       
   226         Edge& operator=(const Arc&) { return *this; }
       
   227       };
       
   228 
       
   229       /// \brief Returns the direction of the arc.
       
   230       ///
       
   231       /// Returns the direction of the arc. Each arc represents an
       
   232       /// edge with a direction. It gives back the
       
   233       /// direction.
       
   234       bool direction(const Arc&) const { return true; }
       
   235 
       
   236       /// \brief Returns the directed arc.
       
   237       ///
       
   238       /// Returns the directed arc from its direction and the
       
   239       /// represented edge.
       
   240       Arc direct(const Edge&, bool) const { return INVALID;} 
       
   241 
       
   242       /// \brief Returns the directed arc.
       
   243       ///
       
   244       /// Returns the directed arc from its source and the
       
   245       /// represented edge.
       
   246       Arc direct(const Edge&, const Node&) const { return INVALID;} 
       
   247 
       
   248       /// \brief Returns the opposite arc.
       
   249       ///
       
   250       /// Returns the opposite arc. It is the arc representing the
       
   251       /// same edge and has opposite direction.
       
   252       Arc oppositeArc(const Arc&) const { return INVALID;}
       
   253 
       
   254       /// \brief Gives back one ending of an edge.
       
   255       ///
       
   256       /// Gives back one ending of an edge.
       
   257       Node u(const Edge&) const { return INVALID;}
       
   258 
       
   259       /// \brief Gives back the other ending of an edge.
       
   260       ///
       
   261       /// Gives back the other ending of an edge.
       
   262       Node v(const Edge&) const { return INVALID;}
       
   263       
       
   264       template <typename _Graph>
       
   265       struct Constraints {
       
   266 	typedef typename _Graph::Node Node;
       
   267 	typedef typename _Graph::Arc Arc;
       
   268 	typedef typename _Graph::Edge Edge;
       
   269       
       
   270 	void constraints() {
       
   271           checkConcept<BaseDigraphComponent, _Graph>();
       
   272 	  checkConcept<GraphItem<'u'>, Edge>();
       
   273 	  {
       
   274 	    Node n;
       
   275 	    Edge ue(INVALID);
       
   276             Arc e;
       
   277 	    n = graph.u(ue);
       
   278 	    n = graph.v(ue);
       
   279             e = graph.direct(ue, true);
       
   280             e = graph.direct(ue, n);
       
   281             e = graph.oppositeArc(e);
       
   282             ue = e;
       
   283             bool d = graph.direction(e);
       
   284             ignore_unused_variable_warning(d);
       
   285 	  }      
       
   286 	}
       
   287       
       
   288 	const _Graph& graph;
       
   289       };
       
   290 
       
   291     };
       
   292 
       
   293     /// \brief An empty idable base digraph class.
       
   294     ///  
       
   295     /// This class provides beside the core digraph features
       
   296     /// core id functions for the digraph structure.
       
   297     /// The most of the base digraphs should be conform to this concept.
       
   298     /// The id's are unique and immutable.
       
   299     template <typename _Base = BaseDigraphComponent>
       
   300     class IDableDigraphComponent : public _Base {
       
   301     public:
       
   302 
       
   303       typedef _Base Base;
       
   304       typedef typename Base::Node Node;
       
   305       typedef typename Base::Arc Arc;
       
   306 
       
   307       /// \brief Gives back an unique integer id for the Node. 
       
   308       ///
       
   309       /// Gives back an unique integer id for the Node. 
       
   310       ///
       
   311       int id(const Node&) const { return -1;}
       
   312 
       
   313       /// \brief Gives back the node by the unique id.
       
   314       ///
       
   315       /// Gives back the node by the unique id.
       
   316       /// If the digraph does not contain node with the given id
       
   317       /// then the result of the function is undetermined. 
       
   318       Node nodeFromId(int) const { return INVALID;}
       
   319 
       
   320       /// \brief Gives back an unique integer id for the Arc. 
       
   321       ///
       
   322       /// Gives back an unique integer id for the Arc. 
       
   323       ///
       
   324       int id(const Arc&) const { return -1;}
       
   325 
       
   326       /// \brief Gives back the arc by the unique id.
       
   327       ///
       
   328       /// Gives back the arc by the unique id.
       
   329       /// If the digraph does not contain arc with the given id
       
   330       /// then the result of the function is undetermined. 
       
   331       Arc arcFromId(int) const { return INVALID;}
       
   332 
       
   333       /// \brief Gives back an integer greater or equal to the maximum
       
   334       /// Node id.
       
   335       ///
       
   336       /// Gives back an integer greater or equal to the maximum Node
       
   337       /// id.
       
   338       int maxNodeId() const { return -1;}
       
   339 
       
   340       /// \brief Gives back an integer greater or equal to the maximum
       
   341       /// Arc id.
       
   342       ///
       
   343       /// Gives back an integer greater or equal to the maximum Arc
       
   344       /// id.
       
   345       int maxArcId() const { return -1;}
       
   346 
       
   347       template <typename _Digraph>
       
   348       struct Constraints {
       
   349 
       
   350 	void constraints() {
       
   351 	  checkConcept<Base, _Digraph >();
       
   352 	  typename _Digraph::Node node;
       
   353 	  int nid = digraph.id(node);
       
   354 	  nid = digraph.id(node);
       
   355 	  node = digraph.nodeFromId(nid);
       
   356 	  typename _Digraph::Arc arc;
       
   357 	  int eid = digraph.id(arc);
       
   358 	  eid = digraph.id(arc);
       
   359 	  arc = digraph.arcFromId(eid);
       
   360 
       
   361 	  nid = digraph.maxNodeId();
       
   362 	  ignore_unused_variable_warning(nid);
       
   363 	  eid = digraph.maxArcId();
       
   364 	  ignore_unused_variable_warning(eid);
       
   365 	}
       
   366 
       
   367 	const _Digraph& digraph;
       
   368       };
       
   369     };
       
   370 
       
   371     /// \brief An empty idable base undirected graph class.
       
   372     ///  
       
   373     /// This class provides beside the core undirected graph features
       
   374     /// core id functions for the undirected graph structure.  The
       
   375     /// most of the base undirected graphs should be conform to this
       
   376     /// concept.  The id's are unique and immutable.
       
   377     template <typename _Base = BaseGraphComponent>
       
   378     class IDableGraphComponent : public IDableDigraphComponent<_Base> {
       
   379     public:
       
   380 
       
   381       typedef _Base Base;
       
   382       typedef typename Base::Edge Edge;
       
   383 
       
   384       using IDableDigraphComponent<_Base>::id;
       
   385 
       
   386       /// \brief Gives back an unique integer id for the Edge. 
       
   387       ///
       
   388       /// Gives back an unique integer id for the Edge. 
       
   389       ///
       
   390       int id(const Edge&) const { return -1;}
       
   391 
       
   392       /// \brief Gives back the edge by the unique id.
       
   393       ///
       
   394       /// Gives back the edge by the unique id.  If the
       
   395       /// graph does not contain arc with the given id then the
       
   396       /// result of the function is undetermined.
       
   397       Edge edgeFromId(int) const { return INVALID;}
       
   398 
       
   399       /// \brief Gives back an integer greater or equal to the maximum
       
   400       /// Edge id.
       
   401       ///
       
   402       /// Gives back an integer greater or equal to the maximum Edge
       
   403       /// id.
       
   404       int maxEdgeId() const { return -1;}
       
   405 
       
   406       template <typename _Graph>
       
   407       struct Constraints {
       
   408 
       
   409 	void constraints() {
       
   410 	  checkConcept<Base, _Graph >();
       
   411 	  checkConcept<IDableDigraphComponent<Base>, _Graph >();
       
   412 	  typename _Graph::Edge edge;
       
   413 	  int ueid = graph.id(edge);
       
   414 	  ueid = graph.id(edge);
       
   415 	  edge = graph.edgeFromId(ueid);
       
   416 	  ueid = graph.maxEdgeId();
       
   417 	  ignore_unused_variable_warning(ueid);
       
   418 	}
       
   419 
       
   420 	const _Graph& graph;
       
   421       };
       
   422     };
       
   423 
       
   424     /// \brief Skeleton class for graph NodeIt and ArcIt
       
   425     ///
       
   426     /// Skeleton class for graph NodeIt and ArcIt.
       
   427     ///
       
   428     template <typename _Graph, typename _Item>
       
   429     class GraphItemIt : public _Item {
       
   430     public:
       
   431       /// \brief Default constructor.
       
   432       ///
       
   433       /// @warning The default constructor sets the iterator
       
   434       /// to an undefined value.
       
   435       GraphItemIt() {}
       
   436       /// \brief Copy constructor.
       
   437       ///
       
   438       /// Copy constructor.
       
   439       ///
       
   440       GraphItemIt(const GraphItemIt& ) {}
       
   441       /// \brief Sets the iterator to the first item.
       
   442       ///
       
   443       /// Sets the iterator to the first item of \c the graph.
       
   444       ///
       
   445       explicit GraphItemIt(const _Graph&) {}
       
   446       /// \brief Invalid constructor \& conversion.
       
   447       ///
       
   448       /// This constructor initializes the item to be invalid.
       
   449       /// \sa Invalid for more details.
       
   450       GraphItemIt(Invalid) {}
       
   451       /// \brief Assign operator for items.
       
   452       ///
       
   453       /// The items are assignable. 
       
   454       ///
       
   455       GraphItemIt& operator=(const GraphItemIt&) { return *this; }      
       
   456       /// \brief Next item.
       
   457       /// 
       
   458       /// Assign the iterator to the next item.
       
   459       ///
       
   460       GraphItemIt& operator++() { return *this; }
       
   461       /// \brief Equality operator
       
   462       /// 
       
   463       /// Two iterators are equal if and only if they point to the
       
   464       /// same object or both are invalid.
       
   465       bool operator==(const GraphItemIt&) const { return true;}
       
   466       /// \brief Inequality operator
       
   467       ///	
       
   468       /// \sa operator==(Node n)
       
   469       ///
       
   470       bool operator!=(const GraphItemIt&) const { return true;}
       
   471       
       
   472       template<typename _GraphItemIt>
       
   473       struct Constraints {
       
   474 	void constraints() {
       
   475 	  _GraphItemIt it1(g);	
       
   476 	  _GraphItemIt it2;
       
   477 
       
   478 	  it2 = ++it1;
       
   479 	  ++it2 = it1;
       
   480 	  ++(++it1);
       
   481 
       
   482 	  _Item bi = it1;
       
   483 	  bi = it2;
       
   484 	}
       
   485 	_Graph& g;
       
   486       };
       
   487     };
       
   488 
       
   489     /// \brief Skeleton class for graph InArcIt and OutArcIt
       
   490     ///
       
   491     /// \note Because InArcIt and OutArcIt may not inherit from the same
       
   492     /// base class, the _selector is a additional template parameter. For 
       
   493     /// InArcIt you should instantiate it with character 'i' and for 
       
   494     /// OutArcIt with 'o'.
       
   495     template <typename _Graph,
       
   496 	      typename _Item = typename _Graph::Arc,
       
   497               typename _Base = typename _Graph::Node, 
       
   498 	      char _selector = '0'>
       
   499     class GraphIncIt : public _Item {
       
   500     public:
       
   501       /// \brief Default constructor.
       
   502       ///
       
   503       /// @warning The default constructor sets the iterator
       
   504       /// to an undefined value.
       
   505       GraphIncIt() {}
       
   506       /// \brief Copy constructor.
       
   507       ///
       
   508       /// Copy constructor.
       
   509       ///
       
   510       GraphIncIt(GraphIncIt const& gi) : _Item(gi) {}
       
   511       /// \brief Sets the iterator to the first arc incoming into or outgoing 
       
   512       /// from the node.
       
   513       ///
       
   514       /// Sets the iterator to the first arc incoming into or outgoing 
       
   515       /// from the node.
       
   516       ///
       
   517       explicit GraphIncIt(const _Graph&, const _Base&) {}
       
   518       /// \brief Invalid constructor \& conversion.
       
   519       ///
       
   520       /// This constructor initializes the item to be invalid.
       
   521       /// \sa Invalid for more details.
       
   522       GraphIncIt(Invalid) {}
       
   523       /// \brief Assign operator for iterators.
       
   524       ///
       
   525       /// The iterators are assignable. 
       
   526       ///
       
   527       GraphIncIt& operator=(GraphIncIt const&) { return *this; }      
       
   528       /// \brief Next item.
       
   529       ///
       
   530       /// Assign the iterator to the next item.
       
   531       ///
       
   532       GraphIncIt& operator++() { return *this; }
       
   533 
       
   534       /// \brief Equality operator
       
   535       ///
       
   536       /// Two iterators are equal if and only if they point to the
       
   537       /// same object or both are invalid.
       
   538       bool operator==(const GraphIncIt&) const { return true;}
       
   539 
       
   540       /// \brief Inequality operator
       
   541       ///
       
   542       /// \sa operator==(Node n)
       
   543       ///
       
   544       bool operator!=(const GraphIncIt&) const { return true;}
       
   545 
       
   546       template <typename _GraphIncIt>
       
   547       struct Constraints {
       
   548 	void constraints() {
       
   549 	  checkConcept<GraphItem<_selector>, _GraphIncIt>();
       
   550 	  _GraphIncIt it1(graph, node);
       
   551 	  _GraphIncIt it2;
       
   552 
       
   553 	  it2 = ++it1;
       
   554 	  ++it2 = it1;
       
   555 	  ++(++it1);
       
   556 	  _Item e = it1;
       
   557 	  e = it2;
       
   558 
       
   559 	}
       
   560 
       
   561 	_Item arc;
       
   562 	_Base node;
       
   563 	_Graph graph;
       
   564 	_GraphIncIt it;
       
   565       };
       
   566     };
       
   567 
       
   568 
       
   569     /// \brief An empty iterable digraph class.
       
   570     ///
       
   571     /// This class provides beside the core digraph features
       
   572     /// iterator based iterable interface for the digraph structure.
       
   573     /// This concept is part of the Digraph concept.
       
   574     template <typename _Base = BaseDigraphComponent>
       
   575     class IterableDigraphComponent : public _Base {
       
   576 
       
   577     public:
       
   578     
       
   579       typedef _Base Base;
       
   580       typedef typename Base::Node Node;
       
   581       typedef typename Base::Arc Arc;
       
   582 
       
   583       typedef IterableDigraphComponent Digraph;
       
   584 
       
   585       /// \name Base iteration
       
   586       /// 
       
   587       /// This interface provides functions for iteration on digraph items
       
   588       ///
       
   589       /// @{  
       
   590 
       
   591       /// \brief Gives back the first node in the iterating order.
       
   592       ///      
       
   593       /// Gives back the first node in the iterating order.
       
   594       ///     
       
   595       void first(Node&) const {}
       
   596 
       
   597       /// \brief Gives back the next node in the iterating order.
       
   598       ///
       
   599       /// Gives back the next node in the iterating order.
       
   600       ///     
       
   601       void next(Node&) const {}
       
   602 
       
   603       /// \brief Gives back the first arc in the iterating order.
       
   604       ///
       
   605       /// Gives back the first arc in the iterating order.
       
   606       ///     
       
   607       void first(Arc&) const {}
       
   608 
       
   609       /// \brief Gives back the next arc in the iterating order.
       
   610       ///
       
   611       /// Gives back the next arc in the iterating order.
       
   612       ///     
       
   613       void next(Arc&) const {}
       
   614 
       
   615 
       
   616       /// \brief Gives back the first of the arcs point to the given
       
   617       /// node.
       
   618       ///
       
   619       /// Gives back the first of the arcs point to the given node.
       
   620       ///     
       
   621       void firstIn(Arc&, const Node&) const {}
       
   622 
       
   623       /// \brief Gives back the next of the arcs points to the given
       
   624       /// node.
       
   625       ///
       
   626       /// Gives back the next of the arcs points to the given node.
       
   627       ///
       
   628       void nextIn(Arc&) const {}
       
   629 
       
   630       /// \brief Gives back the first of the arcs start from the
       
   631       /// given node.
       
   632       ///      
       
   633       /// Gives back the first of the arcs start from the given node.
       
   634       ///     
       
   635       void firstOut(Arc&, const Node&) const {}
       
   636 
       
   637       /// \brief Gives back the next of the arcs start from the given
       
   638       /// node.
       
   639       ///
       
   640       /// Gives back the next of the arcs start from the given node.
       
   641       ///     
       
   642       void nextOut(Arc&) const {}
       
   643 
       
   644       /// @}
       
   645 
       
   646       /// \name Class based iteration
       
   647       /// 
       
   648       /// This interface provides functions for iteration on digraph items
       
   649       ///
       
   650       /// @{
       
   651 
       
   652       /// \brief This iterator goes through each node.
       
   653       ///
       
   654       /// This iterator goes through each node.
       
   655       ///
       
   656       typedef GraphItemIt<Digraph, Node> NodeIt;
       
   657 
       
   658       /// \brief This iterator goes through each node.
       
   659       ///
       
   660       /// This iterator goes through each node.
       
   661       ///
       
   662       typedef GraphItemIt<Digraph, Arc> ArcIt;
       
   663 
       
   664       /// \brief This iterator goes trough the incoming arcs of a node.
       
   665       ///
       
   666       /// This iterator goes trough the \e inccoming arcs of a certain node
       
   667       /// of a digraph.
       
   668       typedef GraphIncIt<Digraph, Arc, Node, 'i'> InArcIt;
       
   669 
       
   670       /// \brief This iterator goes trough the outgoing arcs of a node.
       
   671       ///
       
   672       /// This iterator goes trough the \e outgoing arcs of a certain node
       
   673       /// of a digraph.
       
   674       typedef GraphIncIt<Digraph, Arc, Node, 'o'> OutArcIt;
       
   675 
       
   676       /// \brief The base node of the iterator.
       
   677       ///
       
   678       /// Gives back the base node of the iterator.
       
   679       /// It is always the target of the pointed arc.
       
   680       Node baseNode(const InArcIt&) const { return INVALID; }
       
   681 
       
   682       /// \brief The running node of the iterator.
       
   683       ///
       
   684       /// Gives back the running node of the iterator.
       
   685       /// It is always the source of the pointed arc.
       
   686       Node runningNode(const InArcIt&) const { return INVALID; }
       
   687 
       
   688       /// \brief The base node of the iterator.
       
   689       ///
       
   690       /// Gives back the base node of the iterator.
       
   691       /// It is always the source of the pointed arc.
       
   692       Node baseNode(const OutArcIt&) const { return INVALID; }
       
   693 
       
   694       /// \brief The running node of the iterator.
       
   695       ///
       
   696       /// Gives back the running node of the iterator.
       
   697       /// It is always the target of the pointed arc.
       
   698       Node runningNode(const OutArcIt&) const { return INVALID; }
       
   699 
       
   700       /// @}
       
   701 
       
   702       template <typename _Digraph> 
       
   703       struct Constraints {
       
   704 	void constraints() {
       
   705 	  checkConcept<Base, _Digraph>();
       
   706 
       
   707           {
       
   708             typename _Digraph::Node node(INVALID);      
       
   709             typename _Digraph::Arc arc(INVALID);
       
   710             {
       
   711               digraph.first(node);
       
   712               digraph.next(node);
       
   713             }
       
   714             {
       
   715               digraph.first(arc);
       
   716               digraph.next(arc);
       
   717             }
       
   718             {
       
   719               digraph.firstIn(arc, node);
       
   720               digraph.nextIn(arc);
       
   721             }
       
   722             {
       
   723               digraph.firstOut(arc, node);
       
   724               digraph.nextOut(arc);
       
   725             }
       
   726           }           
       
   727 
       
   728           {
       
   729             checkConcept<GraphItemIt<_Digraph, typename _Digraph::Arc>,
       
   730               typename _Digraph::ArcIt >();
       
   731             checkConcept<GraphItemIt<_Digraph, typename _Digraph::Node>,
       
   732               typename _Digraph::NodeIt >();
       
   733             checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc, 
       
   734               typename _Digraph::Node, 'i'>, typename _Digraph::InArcIt>();
       
   735             checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc, 
       
   736               typename _Digraph::Node, 'o'>, typename _Digraph::OutArcIt>();
       
   737 
       
   738             typename _Digraph::Node n;
       
   739             typename _Digraph::InArcIt ieit(INVALID);
       
   740             typename _Digraph::OutArcIt oeit(INVALID);
       
   741             n = digraph.baseNode(ieit);
       
   742             n = digraph.runningNode(ieit);
       
   743             n = digraph.baseNode(oeit);
       
   744             n = digraph.runningNode(oeit);
       
   745             ignore_unused_variable_warning(n);
       
   746           }
       
   747         }
       
   748 	
       
   749 	const _Digraph& digraph;
       
   750 	
       
   751       };
       
   752     };
       
   753 
       
   754     /// \brief An empty iterable undirected graph class.
       
   755     ///
       
   756     /// This class provides beside the core graph features iterator
       
   757     /// based iterable interface for the undirected graph structure.
       
   758     /// This concept is part of the Graph concept.
       
   759     template <typename _Base = BaseGraphComponent>
       
   760     class IterableGraphComponent : public IterableDigraphComponent<_Base> {
       
   761     public:
       
   762 
       
   763       typedef _Base Base;
       
   764       typedef typename Base::Node Node;
       
   765       typedef typename Base::Arc Arc;
       
   766       typedef typename Base::Edge Edge;
       
   767 
       
   768     
       
   769       typedef IterableGraphComponent Graph;
       
   770 
       
   771       /// \name Base iteration
       
   772       /// 
       
   773       /// This interface provides functions for iteration on graph items
       
   774       /// @{  
       
   775 
       
   776       using IterableDigraphComponent<_Base>::first;
       
   777       using IterableDigraphComponent<_Base>::next;
       
   778 
       
   779       /// \brief Gives back the first edge in the iterating
       
   780       /// order.
       
   781       ///
       
   782       /// Gives back the first edge in the iterating order.
       
   783       ///     
       
   784       void first(Edge&) const {}
       
   785 
       
   786       /// \brief Gives back the next edge in the iterating
       
   787       /// order.
       
   788       ///
       
   789       /// Gives back the next edge in the iterating order.
       
   790       ///     
       
   791       void next(Edge&) const {}
       
   792 
       
   793 
       
   794       /// \brief Gives back the first of the edges from the
       
   795       /// given node.
       
   796       ///
       
   797       /// Gives back the first of the edges from the given
       
   798       /// node. The bool parameter gives back that direction which
       
   799       /// gives a good direction of the edge so the source of the
       
   800       /// directed arc is the given node.
       
   801       void firstInc(Edge&, bool&, const Node&) const {}
       
   802 
       
   803       /// \brief Gives back the next of the edges from the
       
   804       /// given node.
       
   805       ///
       
   806       /// Gives back the next of the edges from the given
       
   807       /// node. The bool parameter should be used as the \c firstInc()
       
   808       /// use it.
       
   809       void nextInc(Edge&, bool&) const {}
       
   810 
       
   811       using IterableDigraphComponent<_Base>::baseNode;
       
   812       using IterableDigraphComponent<_Base>::runningNode;
       
   813 
       
   814       /// @}
       
   815 
       
   816       /// \name Class based iteration
       
   817       /// 
       
   818       /// This interface provides functions for iteration on graph items
       
   819       ///
       
   820       /// @{
       
   821 
       
   822       /// \brief This iterator goes through each node.
       
   823       ///
       
   824       /// This iterator goes through each node.
       
   825       typedef GraphItemIt<Graph, Edge> EdgeIt;
       
   826       /// \brief This iterator goes trough the incident arcs of a
       
   827       /// node.
       
   828       ///
       
   829       /// This iterator goes trough the incident arcs of a certain
       
   830       /// node of a graph.
       
   831       typedef GraphIncIt<Graph, Edge, Node, 'u'> IncArcIt;
       
   832       /// \brief The base node of the iterator.
       
   833       ///
       
   834       /// Gives back the base node of the iterator.
       
   835       Node baseNode(const IncArcIt&) const { return INVALID; }
       
   836 
       
   837       /// \brief The running node of the iterator.
       
   838       ///
       
   839       /// Gives back the running node of the iterator.
       
   840       Node runningNode(const IncArcIt&) const { return INVALID; }
       
   841 
       
   842       /// @}
       
   843 
       
   844       template <typename _Graph> 
       
   845       struct Constraints {
       
   846 	void constraints() {
       
   847 	  checkConcept<IterableDigraphComponent<Base>, _Graph>();
       
   848 
       
   849           {
       
   850             typename _Graph::Node node(INVALID);
       
   851             typename _Graph::Edge edge(INVALID);
       
   852             bool dir;
       
   853             {
       
   854               graph.first(edge);
       
   855               graph.next(edge);
       
   856             }
       
   857             {
       
   858               graph.firstInc(edge, dir, node);
       
   859               graph.nextInc(edge, dir);
       
   860             }
       
   861             
       
   862           }	
       
   863   
       
   864           {
       
   865             checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>,
       
   866               typename _Graph::EdgeIt >();
       
   867             checkConcept<GraphIncIt<_Graph, typename _Graph::Edge, 
       
   868               typename _Graph::Node, 'u'>, typename _Graph::IncArcIt>();
       
   869             
       
   870             typename _Graph::Node n;
       
   871             typename _Graph::IncArcIt ueit(INVALID);
       
   872             n = graph.baseNode(ueit);
       
   873             n = graph.runningNode(ueit);
       
   874           }
       
   875         }
       
   876 	
       
   877 	const _Graph& graph;
       
   878 	
       
   879       };
       
   880     };
       
   881 
       
   882     /// \brief An empty alteration notifier digraph class.
       
   883     ///  
       
   884     /// This class provides beside the core digraph features alteration
       
   885     /// notifier interface for the digraph structure.  This implements
       
   886     /// an observer-notifier pattern for each digraph item. More
       
   887     /// obsevers can be registered into the notifier and whenever an
       
   888     /// alteration occured in the digraph all the observers will
       
   889     /// notified about it.
       
   890     template <typename _Base = BaseDigraphComponent>
       
   891     class AlterableDigraphComponent : public _Base {
       
   892     public:
       
   893 
       
   894       typedef _Base Base;
       
   895       typedef typename Base::Node Node;
       
   896       typedef typename Base::Arc Arc;
       
   897 
       
   898 
       
   899       /// The node observer registry.
       
   900       typedef AlterationNotifier<AlterableDigraphComponent, Node> 
       
   901       NodeNotifier;
       
   902       /// The arc observer registry.
       
   903       typedef AlterationNotifier<AlterableDigraphComponent, Arc> 
       
   904       ArcNotifier;
       
   905       
       
   906       /// \brief Gives back the node alteration notifier.
       
   907       ///
       
   908       /// Gives back the node alteration notifier.
       
   909       NodeNotifier& notifier(Node) const {
       
   910 	return NodeNotifier();
       
   911       }
       
   912       
       
   913       /// \brief Gives back the arc alteration notifier.
       
   914       ///
       
   915       /// Gives back the arc alteration notifier.
       
   916       ArcNotifier& notifier(Arc) const {
       
   917 	return ArcNotifier();
       
   918       }
       
   919 
       
   920       template <typename _Digraph> 
       
   921       struct Constraints {
       
   922 	void constraints() {
       
   923 	  checkConcept<Base, _Digraph>();
       
   924           typename _Digraph::NodeNotifier& nn 
       
   925             = digraph.notifier(typename _Digraph::Node());
       
   926 
       
   927           typename _Digraph::ArcNotifier& en 
       
   928             = digraph.notifier(typename _Digraph::Arc());
       
   929           
       
   930           ignore_unused_variable_warning(nn);
       
   931           ignore_unused_variable_warning(en);
       
   932 	}
       
   933 	
       
   934 	const _Digraph& digraph;
       
   935 	
       
   936       };
       
   937       
       
   938     };
       
   939 
       
   940     /// \brief An empty alteration notifier undirected graph class.
       
   941     ///  
       
   942     /// This class provides beside the core graph features alteration
       
   943     /// notifier interface for the graph structure.  This implements
       
   944     /// an observer-notifier pattern for each graph item. More
       
   945     /// obsevers can be registered into the notifier and whenever an
       
   946     /// alteration occured in the graph all the observers will
       
   947     /// notified about it.
       
   948     template <typename _Base = BaseGraphComponent>
       
   949     class AlterableGraphComponent : public AlterableDigraphComponent<_Base> {
       
   950     public:
       
   951 
       
   952       typedef _Base Base;
       
   953       typedef typename Base::Edge Edge;
       
   954 
       
   955 
       
   956       /// The arc observer registry.
       
   957       typedef AlterationNotifier<AlterableGraphComponent, Edge> 
       
   958       EdgeNotifier;
       
   959       
       
   960       /// \brief Gives back the arc alteration notifier.
       
   961       ///
       
   962       /// Gives back the arc alteration notifier.
       
   963       EdgeNotifier& notifier(Edge) const {
       
   964 	return EdgeNotifier();
       
   965       }
       
   966 
       
   967       template <typename _Graph> 
       
   968       struct Constraints {
       
   969 	void constraints() {
       
   970 	  checkConcept<AlterableGraphComponent<Base>, _Graph>();
       
   971           typename _Graph::EdgeNotifier& uen 
       
   972             = graph.notifier(typename _Graph::Edge());
       
   973           ignore_unused_variable_warning(uen);
       
   974 	}
       
   975 	
       
   976 	const _Graph& graph;
       
   977 	
       
   978       };
       
   979       
       
   980     };
       
   981 
       
   982     /// \brief Class describing the concept of graph maps
       
   983     /// 
       
   984     /// This class describes the common interface of the graph maps
       
   985     /// (NodeMap, ArcMap), that is \ref maps-page "maps" which can be used to
       
   986     /// associate data to graph descriptors (nodes or arcs).
       
   987     template <typename _Graph, typename _Item, typename _Value>
       
   988     class GraphMap : public ReadWriteMap<_Item, _Value> {
       
   989     public:
       
   990 
       
   991       typedef ReadWriteMap<_Item, _Value> Parent;
       
   992 
       
   993       /// The graph type of the map.
       
   994       typedef _Graph Graph;
       
   995       /// The key type of the map.
       
   996       typedef _Item Key;
       
   997       /// The value type of the map.
       
   998       typedef _Value Value;
       
   999 
       
  1000       /// \brief Construct a new map.
       
  1001       ///
       
  1002       /// Construct a new map for the graph.
       
  1003       explicit GraphMap(const Graph&) {}
       
  1004       /// \brief Construct a new map with default value.
       
  1005       ///
       
  1006       /// Construct a new map for the graph and initalise the values.
       
  1007       GraphMap(const Graph&, const Value&) {}
       
  1008       /// \brief Copy constructor.
       
  1009       ///
       
  1010       /// Copy Constructor.
       
  1011       GraphMap(const GraphMap&) : Parent() {}
       
  1012       
       
  1013       /// \brief Assign operator.
       
  1014       ///
       
  1015       /// Assign operator. It does not mofify the underlying graph,
       
  1016       /// it just iterates on the current item set and set the  map
       
  1017       /// with the value returned by the assigned map. 
       
  1018       template <typename CMap>
       
  1019       GraphMap& operator=(const CMap&) { 
       
  1020         checkConcept<ReadMap<Key, Value>, CMap>();
       
  1021         return *this;
       
  1022       }
       
  1023 
       
  1024       template<typename _Map>
       
  1025       struct Constraints {
       
  1026 	void constraints() {
       
  1027 	  checkConcept<ReadWriteMap<Key, Value>, _Map >();
       
  1028 	  // Construction with a graph parameter
       
  1029 	  _Map a(g);
       
  1030 	  // Constructor with a graph and a default value parameter
       
  1031 	  _Map a2(g,t);
       
  1032 	  // Copy constructor.
       
  1033 	  _Map b(c);
       
  1034           
       
  1035           ReadMap<Key, Value> cmap;
       
  1036           b = cmap;
       
  1037 
       
  1038 	  ignore_unused_variable_warning(a2);
       
  1039 	  ignore_unused_variable_warning(b);
       
  1040 	}
       
  1041 
       
  1042 	const _Map &c;
       
  1043 	const Graph &g;
       
  1044 	const typename GraphMap::Value &t;
       
  1045       };
       
  1046 
       
  1047     };
       
  1048 
       
  1049     /// \brief An empty mappable digraph class.
       
  1050     ///
       
  1051     /// This class provides beside the core digraph features
       
  1052     /// map interface for the digraph structure.
       
  1053     /// This concept is part of the Digraph concept.
       
  1054     template <typename _Base = BaseDigraphComponent>
       
  1055     class MappableDigraphComponent : public _Base  {
       
  1056     public:
       
  1057 
       
  1058       typedef _Base Base;
       
  1059       typedef typename Base::Node Node;
       
  1060       typedef typename Base::Arc Arc;
       
  1061 
       
  1062       typedef MappableDigraphComponent Digraph;
       
  1063 
       
  1064       /// \brief ReadWrite map of the nodes.
       
  1065       ///
       
  1066       /// ReadWrite map of the nodes.
       
  1067       ///
       
  1068       template <typename _Value>
       
  1069       class NodeMap : public GraphMap<Digraph, Node, _Value> {
       
  1070       public:
       
  1071         typedef GraphMap<MappableDigraphComponent, Node, _Value> Parent;
       
  1072 
       
  1073 	/// \brief Construct a new map.
       
  1074 	///
       
  1075 	/// Construct a new map for the digraph.
       
  1076 	explicit NodeMap(const MappableDigraphComponent& digraph) 
       
  1077           : Parent(digraph) {}
       
  1078 
       
  1079 	/// \brief Construct a new map with default value.
       
  1080 	///
       
  1081 	/// Construct a new map for the digraph and initalise the values.
       
  1082 	NodeMap(const MappableDigraphComponent& digraph, const _Value& value)
       
  1083           : Parent(digraph, value) {}
       
  1084 
       
  1085 	/// \brief Copy constructor.
       
  1086 	///
       
  1087 	/// Copy Constructor.
       
  1088 	NodeMap(const NodeMap& nm) : Parent(nm) {}
       
  1089 
       
  1090 	/// \brief Assign operator.
       
  1091 	///
       
  1092 	/// Assign operator.
       
  1093         template <typename CMap>
       
  1094         NodeMap& operator=(const CMap&) { 
       
  1095           checkConcept<ReadMap<Node, _Value>, CMap>();
       
  1096           return *this;
       
  1097         }
       
  1098 
       
  1099       };
       
  1100 
       
  1101       /// \brief ReadWrite map of the arcs.
       
  1102       ///
       
  1103       /// ReadWrite map of the arcs.
       
  1104       ///
       
  1105       template <typename _Value>
       
  1106       class ArcMap : public GraphMap<Digraph, Arc, _Value> {
       
  1107       public:
       
  1108         typedef GraphMap<MappableDigraphComponent, Arc, _Value> Parent;
       
  1109 
       
  1110 	/// \brief Construct a new map.
       
  1111 	///
       
  1112 	/// Construct a new map for the digraph.
       
  1113 	explicit ArcMap(const MappableDigraphComponent& digraph) 
       
  1114           : Parent(digraph) {}
       
  1115 
       
  1116 	/// \brief Construct a new map with default value.
       
  1117 	///
       
  1118 	/// Construct a new map for the digraph and initalise the values.
       
  1119 	ArcMap(const MappableDigraphComponent& digraph, const _Value& value)
       
  1120           : Parent(digraph, value) {}
       
  1121 
       
  1122 	/// \brief Copy constructor.
       
  1123 	///
       
  1124 	/// Copy Constructor.
       
  1125 	ArcMap(const ArcMap& nm) : Parent(nm) {}
       
  1126 
       
  1127 	/// \brief Assign operator.
       
  1128 	///
       
  1129 	/// Assign operator.
       
  1130         template <typename CMap>
       
  1131         ArcMap& operator=(const CMap&) { 
       
  1132           checkConcept<ReadMap<Arc, _Value>, CMap>();
       
  1133           return *this;
       
  1134         }
       
  1135 
       
  1136       };
       
  1137 
       
  1138 
       
  1139       template <typename _Digraph>
       
  1140       struct Constraints {
       
  1141 
       
  1142 	struct Dummy {
       
  1143 	  int value;
       
  1144 	  Dummy() : value(0) {}
       
  1145 	  Dummy(int _v) : value(_v) {}
       
  1146 	};
       
  1147 
       
  1148 	void constraints() {
       
  1149 	  checkConcept<Base, _Digraph>();
       
  1150 	  { // int map test
       
  1151 	    typedef typename _Digraph::template NodeMap<int> IntNodeMap;
       
  1152 	    checkConcept<GraphMap<_Digraph, typename _Digraph::Node, int>, 
       
  1153 	      IntNodeMap >();
       
  1154 	  } { // bool map test
       
  1155 	    typedef typename _Digraph::template NodeMap<bool> BoolNodeMap;
       
  1156 	    checkConcept<GraphMap<_Digraph, typename _Digraph::Node, bool>,
       
  1157 	      BoolNodeMap >();
       
  1158 	  } { // Dummy map test
       
  1159 	    typedef typename _Digraph::template NodeMap<Dummy> DummyNodeMap;
       
  1160 	    checkConcept<GraphMap<_Digraph, typename _Digraph::Node, Dummy>,
       
  1161 	      DummyNodeMap >();
       
  1162 	  } 
       
  1163 
       
  1164 	  { // int map test
       
  1165 	    typedef typename _Digraph::template ArcMap<int> IntArcMap;
       
  1166 	    checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, int>,
       
  1167 	      IntArcMap >();
       
  1168 	  } { // bool map test
       
  1169 	    typedef typename _Digraph::template ArcMap<bool> BoolArcMap;
       
  1170 	    checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, bool>,
       
  1171 	      BoolArcMap >();
       
  1172 	  } { // Dummy map test
       
  1173 	    typedef typename _Digraph::template ArcMap<Dummy> DummyArcMap;
       
  1174 	    checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, Dummy>, 
       
  1175 	      DummyArcMap >();
       
  1176 	  } 
       
  1177 	}
       
  1178 
       
  1179 	_Digraph& digraph;
       
  1180       };
       
  1181     };
       
  1182 
       
  1183     /// \brief An empty mappable base bipartite graph class.
       
  1184     ///
       
  1185     /// This class provides beside the core graph features
       
  1186     /// map interface for the graph structure.
       
  1187     /// This concept is part of the Graph concept.
       
  1188     template <typename _Base = BaseGraphComponent>
       
  1189     class MappableGraphComponent : public MappableDigraphComponent<_Base>  {
       
  1190     public:
       
  1191 
       
  1192       typedef _Base Base;
       
  1193       typedef typename Base::Edge Edge;
       
  1194 
       
  1195       typedef MappableGraphComponent Graph;
       
  1196 
       
  1197       /// \brief ReadWrite map of the edges.
       
  1198       ///
       
  1199       /// ReadWrite map of the edges.
       
  1200       ///
       
  1201       template <typename _Value>
       
  1202       class EdgeMap : public GraphMap<Graph, Edge, _Value> {  
       
  1203       public:
       
  1204         typedef GraphMap<MappableGraphComponent, Edge, _Value> Parent;
       
  1205 
       
  1206 	/// \brief Construct a new map.
       
  1207 	///
       
  1208 	/// Construct a new map for the graph.
       
  1209 	explicit EdgeMap(const MappableGraphComponent& graph) 
       
  1210           : Parent(graph) {}
       
  1211 
       
  1212 	/// \brief Construct a new map with default value.
       
  1213 	///
       
  1214 	/// Construct a new map for the graph and initalise the values.
       
  1215 	EdgeMap(const MappableGraphComponent& graph, const _Value& value)
       
  1216           : Parent(graph, value) {}
       
  1217 
       
  1218 	/// \brief Copy constructor.
       
  1219 	///
       
  1220 	/// Copy Constructor.
       
  1221 	EdgeMap(const EdgeMap& nm) : Parent(nm) {}
       
  1222 
       
  1223 	/// \brief Assign operator.
       
  1224 	///
       
  1225 	/// Assign operator.
       
  1226         template <typename CMap>
       
  1227         EdgeMap& operator=(const CMap&) { 
       
  1228           checkConcept<ReadMap<Edge, _Value>, CMap>();
       
  1229           return *this;
       
  1230         }
       
  1231 
       
  1232       };
       
  1233 
       
  1234 
       
  1235       template <typename _Graph>
       
  1236       struct Constraints {
       
  1237 
       
  1238 	struct Dummy {
       
  1239 	  int value;
       
  1240 	  Dummy() : value(0) {}
       
  1241 	  Dummy(int _v) : value(_v) {}
       
  1242 	};
       
  1243 
       
  1244 	void constraints() {
       
  1245 	  checkConcept<MappableGraphComponent<Base>, _Graph>();
       
  1246 
       
  1247 	  { // int map test
       
  1248 	    typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
       
  1249 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
       
  1250 	      IntEdgeMap >();
       
  1251 	  } { // bool map test
       
  1252 	    typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
       
  1253 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
       
  1254 	      BoolEdgeMap >();
       
  1255 	  } { // Dummy map test
       
  1256 	    typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap;
       
  1257 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>, 
       
  1258 	      DummyEdgeMap >();
       
  1259 	  } 
       
  1260 	}
       
  1261 
       
  1262 	_Graph& graph;
       
  1263       };
       
  1264     };
       
  1265 
       
  1266     /// \brief An empty extendable digraph class.
       
  1267     ///
       
  1268     /// This class provides beside the core digraph features digraph
       
  1269     /// extendable interface for the digraph structure.  The main
       
  1270     /// difference between the base and this interface is that the
       
  1271     /// digraph alterations should handled already on this level.
       
  1272     template <typename _Base = BaseDigraphComponent>
       
  1273     class ExtendableDigraphComponent : public _Base {
       
  1274     public:
       
  1275       typedef _Base Base;
       
  1276 
       
  1277       typedef typename _Base::Node Node;
       
  1278       typedef typename _Base::Arc Arc;
       
  1279 
       
  1280       /// \brief Adds a new node to the digraph.
       
  1281       ///
       
  1282       /// Adds a new node to the digraph.
       
  1283       ///
       
  1284       Node addNode() {
       
  1285 	return INVALID;
       
  1286       }
       
  1287     
       
  1288       /// \brief Adds a new arc connects the given two nodes.
       
  1289       ///
       
  1290       /// Adds a new arc connects the the given two nodes.
       
  1291       Arc addArc(const Node&, const Node&) {
       
  1292 	return INVALID;
       
  1293       }
       
  1294 
       
  1295       template <typename _Digraph>
       
  1296       struct Constraints {
       
  1297 	void constraints() {
       
  1298           checkConcept<Base, _Digraph>();
       
  1299 	  typename _Digraph::Node node_a, node_b;
       
  1300 	  node_a = digraph.addNode();
       
  1301 	  node_b = digraph.addNode();
       
  1302 	  typename _Digraph::Arc arc;
       
  1303 	  arc = digraph.addArc(node_a, node_b);
       
  1304 	}
       
  1305 
       
  1306 	_Digraph& digraph;
       
  1307       };
       
  1308     };
       
  1309 
       
  1310     /// \brief An empty extendable base undirected graph class.
       
  1311     ///
       
  1312     /// This class provides beside the core undirected graph features
       
  1313     /// core undircted graph extend interface for the graph structure.
       
  1314     /// The main difference between the base and this interface is
       
  1315     /// that the graph alterations should handled already on this
       
  1316     /// level.
       
  1317     template <typename _Base = BaseGraphComponent>
       
  1318     class ExtendableGraphComponent : public _Base {
       
  1319     public:
       
  1320 
       
  1321       typedef _Base Base;
       
  1322       typedef typename _Base::Node Node;
       
  1323       typedef typename _Base::Edge Edge;
       
  1324 
       
  1325       /// \brief Adds a new node to the graph.
       
  1326       ///
       
  1327       /// Adds a new node to the graph.
       
  1328       ///
       
  1329       Node addNode() {
       
  1330 	return INVALID;
       
  1331       }
       
  1332     
       
  1333       /// \brief Adds a new arc connects the given two nodes.
       
  1334       ///
       
  1335       /// Adds a new arc connects the the given two nodes.
       
  1336       Edge addArc(const Node&, const Node&) {
       
  1337 	return INVALID;
       
  1338       }
       
  1339 
       
  1340       template <typename _Graph>
       
  1341       struct Constraints {
       
  1342 	void constraints() {
       
  1343 	  checkConcept<Base, _Graph>();
       
  1344 	  typename _Graph::Node node_a, node_b;
       
  1345 	  node_a = graph.addNode();
       
  1346 	  node_b = graph.addNode();
       
  1347 	  typename _Graph::Edge edge;
       
  1348 	  edge = graph.addEdge(node_a, node_b);
       
  1349 	}
       
  1350 
       
  1351 	_Graph& graph;
       
  1352       };
       
  1353     };
       
  1354 
       
  1355     /// \brief An empty erasable digraph class.
       
  1356     ///  
       
  1357     /// This class provides beside the core digraph features core erase
       
  1358     /// functions for the digraph structure. The main difference between
       
  1359     /// the base and this interface is that the digraph alterations
       
  1360     /// should handled already on this level.
       
  1361     template <typename _Base = BaseDigraphComponent>
       
  1362     class ErasableDigraphComponent : public _Base {
       
  1363     public:
       
  1364 
       
  1365       typedef _Base Base;
       
  1366       typedef typename Base::Node Node;
       
  1367       typedef typename Base::Arc Arc;
       
  1368 
       
  1369       /// \brief Erase a node from the digraph.
       
  1370       ///
       
  1371       /// Erase a node from the digraph. This function should 
       
  1372       /// erase all arcs connecting to the node.
       
  1373       void erase(const Node&) {}    
       
  1374 
       
  1375       /// \brief Erase an arc from the digraph.
       
  1376       ///
       
  1377       /// Erase an arc from the digraph.
       
  1378       ///
       
  1379       void erase(const Arc&) {}
       
  1380 
       
  1381       template <typename _Digraph>
       
  1382       struct Constraints {
       
  1383 	void constraints() {
       
  1384           checkConcept<Base, _Digraph>();
       
  1385 	  typename _Digraph::Node node;
       
  1386 	  digraph.erase(node);
       
  1387 	  typename _Digraph::Arc arc;
       
  1388 	  digraph.erase(arc);
       
  1389 	}
       
  1390 
       
  1391 	_Digraph& digraph;
       
  1392       };
       
  1393     };
       
  1394 
       
  1395     /// \brief An empty erasable base undirected graph class.
       
  1396     ///  
       
  1397     /// This class provides beside the core undirected graph features
       
  1398     /// core erase functions for the undirceted graph structure. The
       
  1399     /// main difference between the base and this interface is that
       
  1400     /// the graph alterations should handled already on this level.
       
  1401     template <typename _Base = BaseGraphComponent>
       
  1402     class ErasableGraphComponent : public _Base {
       
  1403     public:
       
  1404 
       
  1405       typedef _Base Base;
       
  1406       typedef typename Base::Node Node;
       
  1407       typedef typename Base::Edge Edge;
       
  1408 
       
  1409       /// \brief Erase a node from the graph.
       
  1410       ///
       
  1411       /// Erase a node from the graph. This function should erase
       
  1412       /// arcs connecting to the node.
       
  1413       void erase(const Node&) {}    
       
  1414 
       
  1415       /// \brief Erase an arc from the graph.
       
  1416       ///
       
  1417       /// Erase an arc from the graph.
       
  1418       ///
       
  1419       void erase(const Edge&) {}
       
  1420 
       
  1421       template <typename _Graph>
       
  1422       struct Constraints {
       
  1423 	void constraints() {
       
  1424           checkConcept<Base, _Graph>();
       
  1425 	  typename _Graph::Node node;
       
  1426 	  graph.erase(node);
       
  1427 	  typename _Graph::Arc arc;
       
  1428 	  graph.erase(arc);
       
  1429 	}
       
  1430 
       
  1431 	_Graph& graph;
       
  1432       };
       
  1433     };
       
  1434 
       
  1435     /// \brief An empty clearable base digraph class.
       
  1436     ///
       
  1437     /// This class provides beside the core digraph features core clear
       
  1438     /// functions for the digraph structure. The main difference between
       
  1439     /// the base and this interface is that the digraph alterations
       
  1440     /// should handled already on this level.
       
  1441     template <typename _Base = BaseDigraphComponent>
       
  1442     class ClearableDigraphComponent : public _Base {
       
  1443     public:
       
  1444 
       
  1445       typedef _Base Base;
       
  1446 
       
  1447       /// \brief Erase all nodes and arcs from the digraph.
       
  1448       ///
       
  1449       /// Erase all nodes and arcs from the digraph.
       
  1450       ///
       
  1451       void clear() {}    
       
  1452 
       
  1453       template <typename _Digraph>
       
  1454       struct Constraints {
       
  1455 	void constraints() {
       
  1456           checkConcept<Base, _Digraph>();
       
  1457 	  digraph.clear();
       
  1458 	}
       
  1459 
       
  1460 	_Digraph digraph;
       
  1461       };
       
  1462     };
       
  1463 
       
  1464     /// \brief An empty clearable base undirected graph class.
       
  1465     ///
       
  1466     /// This class provides beside the core undirected graph features
       
  1467     /// core clear functions for the undirected graph structure. The
       
  1468     /// main difference between the base and this interface is that
       
  1469     /// the graph alterations should handled already on this level.
       
  1470     template <typename _Base = BaseGraphComponent>
       
  1471     class ClearableGraphComponent : public ClearableDigraphComponent<_Base> {
       
  1472     public:
       
  1473 
       
  1474       typedef _Base Base;
       
  1475 
       
  1476       template <typename _Graph>
       
  1477       struct Constraints {
       
  1478 	void constraints() {
       
  1479           checkConcept<ClearableGraphComponent<Base>, _Graph>();
       
  1480 	}
       
  1481 
       
  1482 	_Graph graph;
       
  1483       };
       
  1484     };
       
  1485 
       
  1486   }
       
  1487 
       
  1488 }
       
  1489 
       
  1490 #endif