lemon/concepts/graph_components.h
changeset 209 765619b7cbb2
parent 169 5b507a86ad72
child 220 a5d8c039f218
equal deleted inserted replaced
3:a834a966d935 4:c79deb9cf2c0
     1 /* -*- C++ -*-
     1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
     2  *
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     3  * This file is a part of LEMON, a generic C++ optimization library.
     4  *
     4  *
     5  * Copyright (C) 2003-2008
     5  * Copyright (C) 2003-2008
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     8  *
    47     template <char _selector = '0'>
    47     template <char _selector = '0'>
    48 #endif
    48 #endif
    49     class GraphItem {
    49     class GraphItem {
    50     public:
    50     public:
    51       /// \brief Default constructor.
    51       /// \brief Default constructor.
    52       ///      
    52       ///
    53       /// \warning The default constructor is not required to set
    53       /// \warning The default constructor is not required to set
    54       /// the item to some well-defined value. So you should consider it
    54       /// the item to some well-defined value. So you should consider it
    55       /// as uninitialized.
    55       /// as uninitialized.
    56       GraphItem() {}
    56       GraphItem() {}
    57       /// \brief Copy constructor.
    57       /// \brief Copy constructor.
    64       /// This constructor initializes the item to be invalid.
    64       /// This constructor initializes the item to be invalid.
    65       /// \sa Invalid for more details.
    65       /// \sa Invalid for more details.
    66       GraphItem(Invalid) {}
    66       GraphItem(Invalid) {}
    67       /// \brief Assign operator for nodes.
    67       /// \brief Assign operator for nodes.
    68       ///
    68       ///
    69       /// The nodes are assignable. 
    69       /// The nodes are assignable.
    70       ///
    70       ///
    71       GraphItem& operator=(GraphItem const&) { return *this; }
    71       GraphItem& operator=(GraphItem const&) { return *this; }
    72       /// \brief Equality operator.
    72       /// \brief Equality operator.
    73       ///
    73       ///
    74       /// Two iterators are equal if and only if they represents the
    74       /// Two iterators are equal if and only if they represents the
    90       /// ordering of the items.
    90       /// ordering of the items.
    91       bool operator<(GraphItem) const { return false; }
    91       bool operator<(GraphItem) const { return false; }
    92 
    92 
    93       template<typename _GraphItem>
    93       template<typename _GraphItem>
    94       struct Constraints {
    94       struct Constraints {
    95 	void constraints() {
    95         void constraints() {
    96 	  _GraphItem i1;
    96           _GraphItem i1;
    97 	  _GraphItem i2 = i1;
    97           _GraphItem i2 = i1;
    98 	  _GraphItem i3 = INVALID;
    98           _GraphItem i3 = INVALID;
    99 	  
    99 
   100 	  i1 = i2 = i3;
   100           i1 = i2 = i3;
   101 
   101 
   102 	  bool b;
   102           bool b;
   103 	  //	  b = (ia == ib) && (ia != ib) && (ia < ib);
   103           //          b = (ia == ib) && (ia != ib) && (ia < ib);
   104 	  b = (ia == ib) && (ia != ib);
   104           b = (ia == ib) && (ia != ib);
   105 	  b = (ia == INVALID) && (ib != INVALID);
   105           b = (ia == INVALID) && (ib != INVALID);
   106           b = (ia < ib);
   106           b = (ia < ib);
   107 	}
   107         }
   108 
   108 
   109 	const _GraphItem &ia;
   109         const _GraphItem &ia;
   110 	const _GraphItem &ib;
   110         const _GraphItem &ib;
   111       };
   111       };
   112     };
   112     };
   113 
   113 
   114     /// \brief An empty base directed graph class.
   114     /// \brief An empty base directed graph class.
   115     ///  
   115     ///
   116     /// This class provides the minimal set of features needed for a
   116     /// This class provides the minimal set of features needed for a
   117     /// directed graph structure. All digraph concepts have to be
   117     /// directed graph structure. All digraph concepts have to be
   118     /// conform to this base directed graph. It just provides types
   118     /// conform to this base directed graph. It just provides types
   119     /// for nodes and arcs and functions to get the source and the
   119     /// for nodes and arcs and functions to get the source and the
   120     /// target of the arcs.
   120     /// target of the arcs.
   121     class BaseDigraphComponent {
   121     class BaseDigraphComponent {
   122     public:
   122     public:
   123 
   123 
   124       typedef BaseDigraphComponent Digraph;
   124       typedef BaseDigraphComponent Digraph;
   125       
   125 
   126       /// \brief Node class of the digraph.
   126       /// \brief Node class of the digraph.
   127       ///
   127       ///
   128       /// This class represents the Nodes of the digraph. 
   128       /// This class represents the Nodes of the digraph.
   129       ///
   129       ///
   130       typedef GraphItem<'n'> Node;
   130       typedef GraphItem<'n'> Node;
   131 
   131 
   132       /// \brief Arc class of the digraph.
   132       /// \brief Arc class of the digraph.
   133       ///
   133       ///
   134       /// This class represents the Arcs of the digraph. 
   134       /// This class represents the Arcs of the digraph.
   135       ///
   135       ///
   136       typedef GraphItem<'e'> Arc;
   136       typedef GraphItem<'e'> Arc;
   137 
   137 
   138       /// \brief Gives back the target node of an arc.
   138       /// \brief Gives back the target node of an arc.
   139       ///
   139       ///
   154         return INVALID;
   154         return INVALID;
   155       }
   155       }
   156 
   156 
   157       template <typename _Digraph>
   157       template <typename _Digraph>
   158       struct Constraints {
   158       struct Constraints {
   159 	typedef typename _Digraph::Node Node;
   159         typedef typename _Digraph::Node Node;
   160 	typedef typename _Digraph::Arc Arc;
   160         typedef typename _Digraph::Arc Arc;
   161       
   161 
   162 	void constraints() {
   162         void constraints() {
   163 	  checkConcept<GraphItem<'n'>, Node>();
   163           checkConcept<GraphItem<'n'>, Node>();
   164 	  checkConcept<GraphItem<'a'>, Arc>();
   164           checkConcept<GraphItem<'a'>, Arc>();
   165 	  {
   165           {
   166 	    Node n;
   166             Node n;
   167 	    Arc e(INVALID);
   167             Arc e(INVALID);
   168 	    n = digraph.source(e);
   168             n = digraph.source(e);
   169 	    n = digraph.target(e);
   169             n = digraph.target(e);
   170             n = digraph.oppositeNode(n, e);
   170             n = digraph.oppositeNode(n, e);
   171 	  }      
   171           }
   172 	}
   172         }
   173       
   173 
   174 	const _Digraph& digraph;
   174         const _Digraph& digraph;
   175       };
   175       };
   176     };
   176     };
   177 
   177 
   178     /// \brief An empty base undirected graph class.
   178     /// \brief An empty base undirected graph class.
   179     ///  
   179     ///
   180     /// This class provides the minimal set of features needed for an
   180     /// This class provides the minimal set of features needed for an
   181     /// undirected graph structure. All undirected graph concepts have
   181     /// undirected graph structure. All undirected graph concepts have
   182     /// to be conform to this base graph. It just provides types for
   182     /// to be conform to this base graph. It just provides types for
   183     /// nodes, arcs and edges and functions to get the
   183     /// nodes, arcs and edges and functions to get the
   184     /// source and the target of the arcs and edges,
   184     /// source and the target of the arcs and edges,
   197       /// directed arcs.
   197       /// directed arcs.
   198       class Edge : public GraphItem<'u'> {
   198       class Edge : public GraphItem<'u'> {
   199       public:
   199       public:
   200         typedef GraphItem<'u'> Parent;
   200         typedef GraphItem<'u'> Parent;
   201         /// \brief Default constructor.
   201         /// \brief Default constructor.
   202         ///      
   202         ///
   203         /// \warning The default constructor is not required to set
   203         /// \warning The default constructor is not required to set
   204         /// the item to some well-defined value. So you should consider it
   204         /// the item to some well-defined value. So you should consider it
   205         /// as uninitialized.
   205         /// as uninitialized.
   206         Edge() {}
   206         Edge() {}
   207         /// \brief Copy constructor.
   207         /// \brief Copy constructor.
   215         /// \sa Invalid for more details.
   215         /// \sa Invalid for more details.
   216         Edge(Invalid) {}
   216         Edge(Invalid) {}
   217         /// \brief Converter from arc to edge.
   217         /// \brief Converter from arc to edge.
   218         ///
   218         ///
   219         /// Besides the core graph item functionality each arc should
   219         /// Besides the core graph item functionality each arc should
   220         /// be convertible to the represented edge. 
   220         /// be convertible to the represented edge.
   221         Edge(const Arc&) {}
   221         Edge(const Arc&) {}
   222         /// \brief Assign arc to edge.
   222         /// \brief Assign arc to edge.
   223         ///
   223         ///
   224         /// Besides the core graph item functionality each arc should
   224         /// Besides the core graph item functionality each arc should
   225         /// be convertible to the represented edge. 
   225         /// be convertible to the represented edge.
   226         Edge& operator=(const Arc&) { return *this; }
   226         Edge& operator=(const Arc&) { return *this; }
   227       };
   227       };
   228 
   228 
   229       /// \brief Returns the direction of the arc.
   229       /// \brief Returns the direction of the arc.
   230       ///
   230       ///
   235 
   235 
   236       /// \brief Returns the directed arc.
   236       /// \brief Returns the directed arc.
   237       ///
   237       ///
   238       /// Returns the directed arc from its direction and the
   238       /// Returns the directed arc from its direction and the
   239       /// represented edge.
   239       /// represented edge.
   240       Arc direct(const Edge&, bool) const { return INVALID;} 
   240       Arc direct(const Edge&, bool) const { return INVALID;}
   241 
   241 
   242       /// \brief Returns the directed arc.
   242       /// \brief Returns the directed arc.
   243       ///
   243       ///
   244       /// Returns the directed arc from its source and the
   244       /// Returns the directed arc from its source and the
   245       /// represented edge.
   245       /// represented edge.
   246       Arc direct(const Edge&, const Node&) const { return INVALID;} 
   246       Arc direct(const Edge&, const Node&) const { return INVALID;}
   247 
   247 
   248       /// \brief Returns the opposite arc.
   248       /// \brief Returns the opposite arc.
   249       ///
   249       ///
   250       /// Returns the opposite arc. It is the arc representing the
   250       /// Returns the opposite arc. It is the arc representing the
   251       /// same edge and has opposite direction.
   251       /// same edge and has opposite direction.
   258 
   258 
   259       /// \brief Gives back the other ending of an edge.
   259       /// \brief Gives back the other ending of an edge.
   260       ///
   260       ///
   261       /// Gives back the other ending of an edge.
   261       /// Gives back the other ending of an edge.
   262       Node v(const Edge&) const { return INVALID;}
   262       Node v(const Edge&) const { return INVALID;}
   263       
   263 
   264       template <typename _Graph>
   264       template <typename _Graph>
   265       struct Constraints {
   265       struct Constraints {
   266 	typedef typename _Graph::Node Node;
   266         typedef typename _Graph::Node Node;
   267 	typedef typename _Graph::Arc Arc;
   267         typedef typename _Graph::Arc Arc;
   268 	typedef typename _Graph::Edge Edge;
   268         typedef typename _Graph::Edge Edge;
   269       
   269 
   270 	void constraints() {
   270         void constraints() {
   271           checkConcept<BaseDigraphComponent, _Graph>();
   271           checkConcept<BaseDigraphComponent, _Graph>();
   272 	  checkConcept<GraphItem<'u'>, Edge>();
   272           checkConcept<GraphItem<'u'>, Edge>();
   273 	  {
   273           {
   274 	    Node n;
   274             Node n;
   275 	    Edge ue(INVALID);
   275             Edge ue(INVALID);
   276             Arc e;
   276             Arc e;
   277 	    n = graph.u(ue);
   277             n = graph.u(ue);
   278 	    n = graph.v(ue);
   278             n = graph.v(ue);
   279             e = graph.direct(ue, true);
   279             e = graph.direct(ue, true);
   280             e = graph.direct(ue, n);
   280             e = graph.direct(ue, n);
   281             e = graph.oppositeArc(e);
   281             e = graph.oppositeArc(e);
   282             ue = e;
   282             ue = e;
   283             bool d = graph.direction(e);
   283             bool d = graph.direction(e);
   284             ignore_unused_variable_warning(d);
   284             ignore_unused_variable_warning(d);
   285 	  }      
   285           }
   286 	}
   286         }
   287       
   287 
   288 	const _Graph& graph;
   288         const _Graph& graph;
   289       };
   289       };
   290 
   290 
   291     };
   291     };
   292 
   292 
   293     /// \brief An empty idable base digraph class.
   293     /// \brief An empty idable base digraph class.
   294     ///  
   294     ///
   295     /// This class provides beside the core digraph features
   295     /// This class provides beside the core digraph features
   296     /// core id functions for the digraph structure.
   296     /// core id functions for the digraph structure.
   297     /// The most of the base digraphs should be conform to this concept.
   297     /// The most of the base digraphs should be conform to this concept.
   298     /// The id's are unique and immutable.
   298     /// The id's are unique and immutable.
   299     template <typename _Base = BaseDigraphComponent>
   299     template <typename _Base = BaseDigraphComponent>
   302 
   302 
   303       typedef _Base Base;
   303       typedef _Base Base;
   304       typedef typename Base::Node Node;
   304       typedef typename Base::Node Node;
   305       typedef typename Base::Arc Arc;
   305       typedef typename Base::Arc Arc;
   306 
   306 
   307       /// \brief Gives back an unique integer id for the Node. 
   307       /// \brief Gives back an unique integer id for the Node.
   308       ///
   308       ///
   309       /// Gives back an unique integer id for the Node. 
   309       /// Gives back an unique integer id for the Node.
   310       ///
   310       ///
   311       int id(const Node&) const { return -1;}
   311       int id(const Node&) const { return -1;}
   312 
   312 
   313       /// \brief Gives back the node by the unique id.
   313       /// \brief Gives back the node by the unique id.
   314       ///
   314       ///
   315       /// Gives back the node by the unique id.
   315       /// Gives back the node by the unique id.
   316       /// If the digraph does not contain node with the given id
   316       /// If the digraph does not contain node with the given id
   317       /// then the result of the function is undetermined. 
   317       /// then the result of the function is undetermined.
   318       Node nodeFromId(int) const { return INVALID;}
   318       Node nodeFromId(int) const { return INVALID;}
   319 
   319 
   320       /// \brief Gives back an unique integer id for the Arc. 
   320       /// \brief Gives back an unique integer id for the Arc.
   321       ///
   321       ///
   322       /// Gives back an unique integer id for the Arc. 
   322       /// Gives back an unique integer id for the Arc.
   323       ///
   323       ///
   324       int id(const Arc&) const { return -1;}
   324       int id(const Arc&) const { return -1;}
   325 
   325 
   326       /// \brief Gives back the arc by the unique id.
   326       /// \brief Gives back the arc by the unique id.
   327       ///
   327       ///
   328       /// Gives back the arc by the unique id.
   328       /// Gives back the arc by the unique id.
   329       /// If the digraph does not contain arc with the given id
   329       /// If the digraph does not contain arc with the given id
   330       /// then the result of the function is undetermined. 
   330       /// then the result of the function is undetermined.
   331       Arc arcFromId(int) const { return INVALID;}
   331       Arc arcFromId(int) const { return INVALID;}
   332 
   332 
   333       /// \brief Gives back an integer greater or equal to the maximum
   333       /// \brief Gives back an integer greater or equal to the maximum
   334       /// Node id.
   334       /// Node id.
   335       ///
   335       ///
   345       int maxArcId() const { return -1;}
   345       int maxArcId() const { return -1;}
   346 
   346 
   347       template <typename _Digraph>
   347       template <typename _Digraph>
   348       struct Constraints {
   348       struct Constraints {
   349 
   349 
   350 	void constraints() {
   350         void constraints() {
   351 	  checkConcept<Base, _Digraph >();
   351           checkConcept<Base, _Digraph >();
   352 	  typename _Digraph::Node node;
   352           typename _Digraph::Node node;
   353 	  int nid = digraph.id(node);
   353           int nid = digraph.id(node);
   354 	  nid = digraph.id(node);
   354           nid = digraph.id(node);
   355 	  node = digraph.nodeFromId(nid);
   355           node = digraph.nodeFromId(nid);
   356 	  typename _Digraph::Arc arc;
   356           typename _Digraph::Arc arc;
   357 	  int eid = digraph.id(arc);
   357           int eid = digraph.id(arc);
   358 	  eid = digraph.id(arc);
   358           eid = digraph.id(arc);
   359 	  arc = digraph.arcFromId(eid);
   359           arc = digraph.arcFromId(eid);
   360 
   360 
   361 	  nid = digraph.maxNodeId();
   361           nid = digraph.maxNodeId();
   362 	  ignore_unused_variable_warning(nid);
   362           ignore_unused_variable_warning(nid);
   363 	  eid = digraph.maxArcId();
   363           eid = digraph.maxArcId();
   364 	  ignore_unused_variable_warning(eid);
   364           ignore_unused_variable_warning(eid);
   365 	}
   365         }
   366 
   366 
   367 	const _Digraph& digraph;
   367         const _Digraph& digraph;
   368       };
   368       };
   369     };
   369     };
   370 
   370 
   371     /// \brief An empty idable base undirected graph class.
   371     /// \brief An empty idable base undirected graph class.
   372     ///  
   372     ///
   373     /// This class provides beside the core undirected graph features
   373     /// This class provides beside the core undirected graph features
   374     /// core id functions for the undirected graph structure.  The
   374     /// core id functions for the undirected graph structure.  The
   375     /// most of the base undirected graphs should be conform to this
   375     /// most of the base undirected graphs should be conform to this
   376     /// concept.  The id's are unique and immutable.
   376     /// concept.  The id's are unique and immutable.
   377     template <typename _Base = BaseGraphComponent>
   377     template <typename _Base = BaseGraphComponent>
   381       typedef _Base Base;
   381       typedef _Base Base;
   382       typedef typename Base::Edge Edge;
   382       typedef typename Base::Edge Edge;
   383 
   383 
   384       using IDableDigraphComponent<_Base>::id;
   384       using IDableDigraphComponent<_Base>::id;
   385 
   385 
   386       /// \brief Gives back an unique integer id for the Edge. 
   386       /// \brief Gives back an unique integer id for the Edge.
   387       ///
   387       ///
   388       /// Gives back an unique integer id for the Edge. 
   388       /// Gives back an unique integer id for the Edge.
   389       ///
   389       ///
   390       int id(const Edge&) const { return -1;}
   390       int id(const Edge&) const { return -1;}
   391 
   391 
   392       /// \brief Gives back the edge by the unique id.
   392       /// \brief Gives back the edge by the unique id.
   393       ///
   393       ///
   404       int maxEdgeId() const { return -1;}
   404       int maxEdgeId() const { return -1;}
   405 
   405 
   406       template <typename _Graph>
   406       template <typename _Graph>
   407       struct Constraints {
   407       struct Constraints {
   408 
   408 
   409 	void constraints() {
   409         void constraints() {
   410 	  checkConcept<Base, _Graph >();
   410           checkConcept<Base, _Graph >();
   411 	  checkConcept<IDableDigraphComponent<Base>, _Graph >();
   411           checkConcept<IDableDigraphComponent<Base>, _Graph >();
   412 	  typename _Graph::Edge edge;
   412           typename _Graph::Edge edge;
   413 	  int ueid = graph.id(edge);
   413           int ueid = graph.id(edge);
   414 	  ueid = graph.id(edge);
   414           ueid = graph.id(edge);
   415 	  edge = graph.edgeFromId(ueid);
   415           edge = graph.edgeFromId(ueid);
   416 	  ueid = graph.maxEdgeId();
   416           ueid = graph.maxEdgeId();
   417 	  ignore_unused_variable_warning(ueid);
   417           ignore_unused_variable_warning(ueid);
   418 	}
   418         }
   419 
   419 
   420 	const _Graph& graph;
   420         const _Graph& graph;
   421       };
   421       };
   422     };
   422     };
   423 
   423 
   424     /// \brief Skeleton class for graph NodeIt and ArcIt
   424     /// \brief Skeleton class for graph NodeIt and ArcIt
   425     ///
   425     ///
   448       /// This constructor initializes the item to be invalid.
   448       /// This constructor initializes the item to be invalid.
   449       /// \sa Invalid for more details.
   449       /// \sa Invalid for more details.
   450       GraphItemIt(Invalid) {}
   450       GraphItemIt(Invalid) {}
   451       /// \brief Assign operator for items.
   451       /// \brief Assign operator for items.
   452       ///
   452       ///
   453       /// The items are assignable. 
   453       /// The items are assignable.
   454       ///
   454       ///
   455       GraphItemIt& operator=(const GraphItemIt&) { return *this; }      
   455       GraphItemIt& operator=(const GraphItemIt&) { return *this; }
   456       /// \brief Next item.
   456       /// \brief Next item.
   457       /// 
   457       ///
   458       /// Assign the iterator to the next item.
   458       /// Assign the iterator to the next item.
   459       ///
   459       ///
   460       GraphItemIt& operator++() { return *this; }
   460       GraphItemIt& operator++() { return *this; }
   461       /// \brief Equality operator
   461       /// \brief Equality operator
   462       /// 
   462       ///
   463       /// Two iterators are equal if and only if they point to the
   463       /// Two iterators are equal if and only if they point to the
   464       /// same object or both are invalid.
   464       /// same object or both are invalid.
   465       bool operator==(const GraphItemIt&) const { return true;}
   465       bool operator==(const GraphItemIt&) const { return true;}
   466       /// \brief Inequality operator
   466       /// \brief Inequality operator
   467       ///	
   467       ///
   468       /// \sa operator==(Node n)
   468       /// \sa operator==(Node n)
   469       ///
   469       ///
   470       bool operator!=(const GraphItemIt&) const { return true;}
   470       bool operator!=(const GraphItemIt&) const { return true;}
   471       
   471 
   472       template<typename _GraphItemIt>
   472       template<typename _GraphItemIt>
   473       struct Constraints {
   473       struct Constraints {
   474 	void constraints() {
   474         void constraints() {
   475 	  _GraphItemIt it1(g);	
   475           _GraphItemIt it1(g);
   476 	  _GraphItemIt it2;
   476           _GraphItemIt it2;
   477 
   477 
   478 	  it2 = ++it1;
   478           it2 = ++it1;
   479 	  ++it2 = it1;
   479           ++it2 = it1;
   480 	  ++(++it1);
   480           ++(++it1);
   481 
   481 
   482 	  _Item bi = it1;
   482           _Item bi = it1;
   483 	  bi = it2;
   483           bi = it2;
   484 	}
   484         }
   485 	_Graph& g;
   485         _Graph& g;
   486       };
   486       };
   487     };
   487     };
   488 
   488 
   489     /// \brief Skeleton class for graph InArcIt and OutArcIt
   489     /// \brief Skeleton class for graph InArcIt and OutArcIt
   490     ///
   490     ///
   491     /// \note Because InArcIt and OutArcIt may not inherit from the same
   491     /// \note Because InArcIt and OutArcIt may not inherit from the same
   492     /// base class, the _selector is a additional template parameter. For 
   492     /// base class, the _selector is a additional template parameter. For
   493     /// InArcIt you should instantiate it with character 'i' and for 
   493     /// InArcIt you should instantiate it with character 'i' and for
   494     /// OutArcIt with 'o'.
   494     /// OutArcIt with 'o'.
   495     template <typename _Graph,
   495     template <typename _Graph,
   496 	      typename _Item = typename _Graph::Arc,
   496               typename _Item = typename _Graph::Arc,
   497               typename _Base = typename _Graph::Node, 
   497               typename _Base = typename _Graph::Node,
   498 	      char _selector = '0'>
   498               char _selector = '0'>
   499     class GraphIncIt : public _Item {
   499     class GraphIncIt : public _Item {
   500     public:
   500     public:
   501       /// \brief Default constructor.
   501       /// \brief Default constructor.
   502       ///
   502       ///
   503       /// @warning The default constructor sets the iterator
   503       /// @warning The default constructor sets the iterator
   506       /// \brief Copy constructor.
   506       /// \brief Copy constructor.
   507       ///
   507       ///
   508       /// Copy constructor.
   508       /// Copy constructor.
   509       ///
   509       ///
   510       GraphIncIt(GraphIncIt const& gi) : _Item(gi) {}
   510       GraphIncIt(GraphIncIt const& gi) : _Item(gi) {}
   511       /// \brief Sets the iterator to the first arc incoming into or outgoing 
   511       /// \brief Sets the iterator to the first arc incoming into or outgoing
   512       /// from the node.
   512       /// from the node.
   513       ///
   513       ///
   514       /// Sets the iterator to the first arc incoming into or outgoing 
   514       /// Sets the iterator to the first arc incoming into or outgoing
   515       /// from the node.
   515       /// from the node.
   516       ///
   516       ///
   517       explicit GraphIncIt(const _Graph&, const _Base&) {}
   517       explicit GraphIncIt(const _Graph&, const _Base&) {}
   518       /// \brief Invalid constructor \& conversion.
   518       /// \brief Invalid constructor \& conversion.
   519       ///
   519       ///
   520       /// This constructor initializes the item to be invalid.
   520       /// This constructor initializes the item to be invalid.
   521       /// \sa Invalid for more details.
   521       /// \sa Invalid for more details.
   522       GraphIncIt(Invalid) {}
   522       GraphIncIt(Invalid) {}
   523       /// \brief Assign operator for iterators.
   523       /// \brief Assign operator for iterators.
   524       ///
   524       ///
   525       /// The iterators are assignable. 
   525       /// The iterators are assignable.
   526       ///
   526       ///
   527       GraphIncIt& operator=(GraphIncIt const&) { return *this; }      
   527       GraphIncIt& operator=(GraphIncIt const&) { return *this; }
   528       /// \brief Next item.
   528       /// \brief Next item.
   529       ///
   529       ///
   530       /// Assign the iterator to the next item.
   530       /// Assign the iterator to the next item.
   531       ///
   531       ///
   532       GraphIncIt& operator++() { return *this; }
   532       GraphIncIt& operator++() { return *this; }
   543       ///
   543       ///
   544       bool operator!=(const GraphIncIt&) const { return true;}
   544       bool operator!=(const GraphIncIt&) const { return true;}
   545 
   545 
   546       template <typename _GraphIncIt>
   546       template <typename _GraphIncIt>
   547       struct Constraints {
   547       struct Constraints {
   548 	void constraints() {
   548         void constraints() {
   549 	  checkConcept<GraphItem<_selector>, _GraphIncIt>();
   549           checkConcept<GraphItem<_selector>, _GraphIncIt>();
   550 	  _GraphIncIt it1(graph, node);
   550           _GraphIncIt it1(graph, node);
   551 	  _GraphIncIt it2;
   551           _GraphIncIt it2;
   552 
   552 
   553 	  it2 = ++it1;
   553           it2 = ++it1;
   554 	  ++it2 = it1;
   554           ++it2 = it1;
   555 	  ++(++it1);
   555           ++(++it1);
   556 	  _Item e = it1;
   556           _Item e = it1;
   557 	  e = it2;
   557           e = it2;
   558 
   558 
   559 	}
   559         }
   560 
   560 
   561 	_Item arc;
   561         _Item arc;
   562 	_Base node;
   562         _Base node;
   563 	_Graph graph;
   563         _Graph graph;
   564 	_GraphIncIt it;
   564         _GraphIncIt it;
   565       };
   565       };
   566     };
   566     };
   567 
   567 
   568 
   568 
   569     /// \brief An empty iterable digraph class.
   569     /// \brief An empty iterable digraph class.
   573     /// This concept is part of the Digraph concept.
   573     /// This concept is part of the Digraph concept.
   574     template <typename _Base = BaseDigraphComponent>
   574     template <typename _Base = BaseDigraphComponent>
   575     class IterableDigraphComponent : public _Base {
   575     class IterableDigraphComponent : public _Base {
   576 
   576 
   577     public:
   577     public:
   578     
   578 
   579       typedef _Base Base;
   579       typedef _Base Base;
   580       typedef typename Base::Node Node;
   580       typedef typename Base::Node Node;
   581       typedef typename Base::Arc Arc;
   581       typedef typename Base::Arc Arc;
   582 
   582 
   583       typedef IterableDigraphComponent Digraph;
   583       typedef IterableDigraphComponent Digraph;
   584 
   584 
   585       /// \name Base iteration
   585       /// \name Base iteration
   586       /// 
   586       ///
   587       /// This interface provides functions for iteration on digraph items
   587       /// This interface provides functions for iteration on digraph items
   588       ///
   588       ///
   589       /// @{  
   589       /// @{
   590 
   590 
   591       /// \brief Gives back the first node in the iterating order.
   591       /// \brief Gives back the first node in the iterating order.
   592       ///      
   592       ///
   593       /// Gives back the first node in the iterating order.
   593       /// Gives back the first node in the iterating order.
   594       ///     
   594       ///
   595       void first(Node&) const {}
   595       void first(Node&) const {}
   596 
   596 
   597       /// \brief Gives back the next node in the iterating order.
   597       /// \brief Gives back the next node in the iterating order.
   598       ///
   598       ///
   599       /// Gives back the next node in the iterating order.
   599       /// Gives back the next node in the iterating order.
   600       ///     
   600       ///
   601       void next(Node&) const {}
   601       void next(Node&) const {}
   602 
   602 
   603       /// \brief Gives back the first arc in the iterating order.
   603       /// \brief Gives back the first arc in the iterating order.
   604       ///
   604       ///
   605       /// Gives back the first arc in the iterating order.
   605       /// Gives back the first arc in the iterating order.
   606       ///     
   606       ///
   607       void first(Arc&) const {}
   607       void first(Arc&) const {}
   608 
   608 
   609       /// \brief Gives back the next arc in the iterating order.
   609       /// \brief Gives back the next arc in the iterating order.
   610       ///
   610       ///
   611       /// Gives back the next arc in the iterating order.
   611       /// Gives back the next arc in the iterating order.
   612       ///     
   612       ///
   613       void next(Arc&) const {}
   613       void next(Arc&) const {}
   614 
   614 
   615 
   615 
   616       /// \brief Gives back the first of the arcs point to the given
   616       /// \brief Gives back the first of the arcs point to the given
   617       /// node.
   617       /// node.
   618       ///
   618       ///
   619       /// Gives back the first of the arcs point to the given node.
   619       /// Gives back the first of the arcs point to the given node.
   620       ///     
   620       ///
   621       void firstIn(Arc&, const Node&) const {}
   621       void firstIn(Arc&, const Node&) const {}
   622 
   622 
   623       /// \brief Gives back the next of the arcs points to the given
   623       /// \brief Gives back the next of the arcs points to the given
   624       /// node.
   624       /// node.
   625       ///
   625       ///
   627       ///
   627       ///
   628       void nextIn(Arc&) const {}
   628       void nextIn(Arc&) const {}
   629 
   629 
   630       /// \brief Gives back the first of the arcs start from the
   630       /// \brief Gives back the first of the arcs start from the
   631       /// given node.
   631       /// given node.
   632       ///      
   632       ///
   633       /// Gives back the first of the arcs start from the given node.
   633       /// Gives back the first of the arcs start from the given node.
   634       ///     
   634       ///
   635       void firstOut(Arc&, const Node&) const {}
   635       void firstOut(Arc&, const Node&) const {}
   636 
   636 
   637       /// \brief Gives back the next of the arcs start from the given
   637       /// \brief Gives back the next of the arcs start from the given
   638       /// node.
   638       /// node.
   639       ///
   639       ///
   640       /// Gives back the next of the arcs start from the given node.
   640       /// Gives back the next of the arcs start from the given node.
   641       ///     
   641       ///
   642       void nextOut(Arc&) const {}
   642       void nextOut(Arc&) const {}
   643 
   643 
   644       /// @}
   644       /// @}
   645 
   645 
   646       /// \name Class based iteration
   646       /// \name Class based iteration
   647       /// 
   647       ///
   648       /// This interface provides functions for iteration on digraph items
   648       /// This interface provides functions for iteration on digraph items
   649       ///
   649       ///
   650       /// @{
   650       /// @{
   651 
   651 
   652       /// \brief This iterator goes through each node.
   652       /// \brief This iterator goes through each node.
   697       /// It is always the target of the pointed arc.
   697       /// It is always the target of the pointed arc.
   698       Node runningNode(const OutArcIt&) const { return INVALID; }
   698       Node runningNode(const OutArcIt&) const { return INVALID; }
   699 
   699 
   700       /// @}
   700       /// @}
   701 
   701 
   702       template <typename _Digraph> 
   702       template <typename _Digraph>
   703       struct Constraints {
   703       struct Constraints {
   704 	void constraints() {
   704         void constraints() {
   705 	  checkConcept<Base, _Digraph>();
   705           checkConcept<Base, _Digraph>();
   706 
   706 
   707           {
   707           {
   708             typename _Digraph::Node node(INVALID);      
   708             typename _Digraph::Node node(INVALID);
   709             typename _Digraph::Arc arc(INVALID);
   709             typename _Digraph::Arc arc(INVALID);
   710             {
   710             {
   711               digraph.first(node);
   711               digraph.first(node);
   712               digraph.next(node);
   712               digraph.next(node);
   713             }
   713             }
   721             }
   721             }
   722             {
   722             {
   723               digraph.firstOut(arc, node);
   723               digraph.firstOut(arc, node);
   724               digraph.nextOut(arc);
   724               digraph.nextOut(arc);
   725             }
   725             }
   726           }           
   726           }
   727 
   727 
   728           {
   728           {
   729             checkConcept<GraphItemIt<_Digraph, typename _Digraph::Arc>,
   729             checkConcept<GraphItemIt<_Digraph, typename _Digraph::Arc>,
   730               typename _Digraph::ArcIt >();
   730               typename _Digraph::ArcIt >();
   731             checkConcept<GraphItemIt<_Digraph, typename _Digraph::Node>,
   731             checkConcept<GraphItemIt<_Digraph, typename _Digraph::Node>,
   732               typename _Digraph::NodeIt >();
   732               typename _Digraph::NodeIt >();
   733             checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc, 
   733             checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
   734               typename _Digraph::Node, 'i'>, typename _Digraph::InArcIt>();
   734               typename _Digraph::Node, 'i'>, typename _Digraph::InArcIt>();
   735             checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc, 
   735             checkConcept<GraphIncIt<_Digraph, typename _Digraph::Arc,
   736               typename _Digraph::Node, 'o'>, typename _Digraph::OutArcIt>();
   736               typename _Digraph::Node, 'o'>, typename _Digraph::OutArcIt>();
   737 
   737 
   738             typename _Digraph::Node n;
   738             typename _Digraph::Node n;
   739             typename _Digraph::InArcIt ieit(INVALID);
   739             typename _Digraph::InArcIt ieit(INVALID);
   740             typename _Digraph::OutArcIt oeit(INVALID);
   740             typename _Digraph::OutArcIt oeit(INVALID);
   743             n = digraph.baseNode(oeit);
   743             n = digraph.baseNode(oeit);
   744             n = digraph.runningNode(oeit);
   744             n = digraph.runningNode(oeit);
   745             ignore_unused_variable_warning(n);
   745             ignore_unused_variable_warning(n);
   746           }
   746           }
   747         }
   747         }
   748 	
   748 
   749 	const _Digraph& digraph;
   749         const _Digraph& digraph;
   750 	
   750 
   751       };
   751       };
   752     };
   752     };
   753 
   753 
   754     /// \brief An empty iterable undirected graph class.
   754     /// \brief An empty iterable undirected graph class.
   755     ///
   755     ///
   763       typedef _Base Base;
   763       typedef _Base Base;
   764       typedef typename Base::Node Node;
   764       typedef typename Base::Node Node;
   765       typedef typename Base::Arc Arc;
   765       typedef typename Base::Arc Arc;
   766       typedef typename Base::Edge Edge;
   766       typedef typename Base::Edge Edge;
   767 
   767 
   768     
   768 
   769       typedef IterableGraphComponent Graph;
   769       typedef IterableGraphComponent Graph;
   770 
   770 
   771       /// \name Base iteration
   771       /// \name Base iteration
   772       /// 
   772       ///
   773       /// This interface provides functions for iteration on graph items
   773       /// This interface provides functions for iteration on graph items
   774       /// @{  
   774       /// @{
   775 
   775 
   776       using IterableDigraphComponent<_Base>::first;
   776       using IterableDigraphComponent<_Base>::first;
   777       using IterableDigraphComponent<_Base>::next;
   777       using IterableDigraphComponent<_Base>::next;
   778 
   778 
   779       /// \brief Gives back the first edge in the iterating
   779       /// \brief Gives back the first edge in the iterating
   780       /// order.
   780       /// order.
   781       ///
   781       ///
   782       /// Gives back the first edge in the iterating order.
   782       /// Gives back the first edge in the iterating order.
   783       ///     
   783       ///
   784       void first(Edge&) const {}
   784       void first(Edge&) const {}
   785 
   785 
   786       /// \brief Gives back the next edge in the iterating
   786       /// \brief Gives back the next edge in the iterating
   787       /// order.
   787       /// order.
   788       ///
   788       ///
   789       /// Gives back the next edge in the iterating order.
   789       /// Gives back the next edge in the iterating order.
   790       ///     
   790       ///
   791       void next(Edge&) const {}
   791       void next(Edge&) const {}
   792 
   792 
   793 
   793 
   794       /// \brief Gives back the first of the edges from the
   794       /// \brief Gives back the first of the edges from the
   795       /// given node.
   795       /// given node.
   812       using IterableDigraphComponent<_Base>::runningNode;
   812       using IterableDigraphComponent<_Base>::runningNode;
   813 
   813 
   814       /// @}
   814       /// @}
   815 
   815 
   816       /// \name Class based iteration
   816       /// \name Class based iteration
   817       /// 
   817       ///
   818       /// This interface provides functions for iteration on graph items
   818       /// This interface provides functions for iteration on graph items
   819       ///
   819       ///
   820       /// @{
   820       /// @{
   821 
   821 
   822       /// \brief This iterator goes through each node.
   822       /// \brief This iterator goes through each node.
   839       /// Gives back the running node of the iterator.
   839       /// Gives back the running node of the iterator.
   840       Node runningNode(const IncEdgeIt&) const { return INVALID; }
   840       Node runningNode(const IncEdgeIt&) const { return INVALID; }
   841 
   841 
   842       /// @}
   842       /// @}
   843 
   843 
   844       template <typename _Graph> 
   844       template <typename _Graph>
   845       struct Constraints {
   845       struct Constraints {
   846 	void constraints() {
   846         void constraints() {
   847 	  checkConcept<IterableDigraphComponent<Base>, _Graph>();
   847           checkConcept<IterableDigraphComponent<Base>, _Graph>();
   848 
   848 
   849           {
   849           {
   850             typename _Graph::Node node(INVALID);
   850             typename _Graph::Node node(INVALID);
   851             typename _Graph::Edge edge(INVALID);
   851             typename _Graph::Edge edge(INVALID);
   852             bool dir;
   852             bool dir;
   856             }
   856             }
   857             {
   857             {
   858               graph.firstInc(edge, dir, node);
   858               graph.firstInc(edge, dir, node);
   859               graph.nextInc(edge, dir);
   859               graph.nextInc(edge, dir);
   860             }
   860             }
   861             
   861 
   862           }	
   862           }
   863   
   863 
   864           {
   864           {
   865             checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>,
   865             checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>,
   866               typename _Graph::EdgeIt >();
   866               typename _Graph::EdgeIt >();
   867             checkConcept<GraphIncIt<_Graph, typename _Graph::Edge, 
   867             checkConcept<GraphIncIt<_Graph, typename _Graph::Edge,
   868               typename _Graph::Node, 'u'>, typename _Graph::IncEdgeIt>();
   868               typename _Graph::Node, 'u'>, typename _Graph::IncEdgeIt>();
   869             
   869 
   870             typename _Graph::Node n;
   870             typename _Graph::Node n;
   871             typename _Graph::IncEdgeIt ueit(INVALID);
   871             typename _Graph::IncEdgeIt ueit(INVALID);
   872             n = graph.baseNode(ueit);
   872             n = graph.baseNode(ueit);
   873             n = graph.runningNode(ueit);
   873             n = graph.runningNode(ueit);
   874           }
   874           }
   875         }
   875         }
   876 	
   876 
   877 	const _Graph& graph;
   877         const _Graph& graph;
   878 	
   878 
   879       };
   879       };
   880     };
   880     };
   881 
   881 
   882     /// \brief An empty alteration notifier digraph class.
   882     /// \brief An empty alteration notifier digraph class.
   883     ///  
   883     ///
   884     /// This class provides beside the core digraph features alteration
   884     /// This class provides beside the core digraph features alteration
   885     /// notifier interface for the digraph structure.  This implements
   885     /// notifier interface for the digraph structure.  This implements
   886     /// an observer-notifier pattern for each digraph item. More
   886     /// an observer-notifier pattern for each digraph item. More
   887     /// obsevers can be registered into the notifier and whenever an
   887     /// obsevers can be registered into the notifier and whenever an
   888     /// alteration occured in the digraph all the observers will
   888     /// alteration occured in the digraph all the observers will
   895       typedef typename Base::Node Node;
   895       typedef typename Base::Node Node;
   896       typedef typename Base::Arc Arc;
   896       typedef typename Base::Arc Arc;
   897 
   897 
   898 
   898 
   899       /// The node observer registry.
   899       /// The node observer registry.
   900       typedef AlterationNotifier<AlterableDigraphComponent, Node> 
   900       typedef AlterationNotifier<AlterableDigraphComponent, Node>
   901       NodeNotifier;
   901       NodeNotifier;
   902       /// The arc observer registry.
   902       /// The arc observer registry.
   903       typedef AlterationNotifier<AlterableDigraphComponent, Arc> 
   903       typedef AlterationNotifier<AlterableDigraphComponent, Arc>
   904       ArcNotifier;
   904       ArcNotifier;
   905       
   905 
   906       /// \brief Gives back the node alteration notifier.
   906       /// \brief Gives back the node alteration notifier.
   907       ///
   907       ///
   908       /// Gives back the node alteration notifier.
   908       /// Gives back the node alteration notifier.
   909       NodeNotifier& notifier(Node) const {
   909       NodeNotifier& notifier(Node) const {
   910 	return NodeNotifier();
   910         return NodeNotifier();
   911       }
   911       }
   912       
   912 
   913       /// \brief Gives back the arc alteration notifier.
   913       /// \brief Gives back the arc alteration notifier.
   914       ///
   914       ///
   915       /// Gives back the arc alteration notifier.
   915       /// Gives back the arc alteration notifier.
   916       ArcNotifier& notifier(Arc) const {
   916       ArcNotifier& notifier(Arc) const {
   917 	return ArcNotifier();
   917         return ArcNotifier();
   918       }
   918       }
   919 
   919 
   920       template <typename _Digraph> 
   920       template <typename _Digraph>
   921       struct Constraints {
   921       struct Constraints {
   922 	void constraints() {
   922         void constraints() {
   923 	  checkConcept<Base, _Digraph>();
   923           checkConcept<Base, _Digraph>();
   924           typename _Digraph::NodeNotifier& nn 
   924           typename _Digraph::NodeNotifier& nn
   925             = digraph.notifier(typename _Digraph::Node());
   925             = digraph.notifier(typename _Digraph::Node());
   926 
   926 
   927           typename _Digraph::ArcNotifier& en 
   927           typename _Digraph::ArcNotifier& en
   928             = digraph.notifier(typename _Digraph::Arc());
   928             = digraph.notifier(typename _Digraph::Arc());
   929           
   929 
   930           ignore_unused_variable_warning(nn);
   930           ignore_unused_variable_warning(nn);
   931           ignore_unused_variable_warning(en);
   931           ignore_unused_variable_warning(en);
   932 	}
   932         }
   933 	
   933 
   934 	const _Digraph& digraph;
   934         const _Digraph& digraph;
   935 	
   935 
   936       };
   936       };
   937       
   937 
   938     };
   938     };
   939 
   939 
   940     /// \brief An empty alteration notifier undirected graph class.
   940     /// \brief An empty alteration notifier undirected graph class.
   941     ///  
   941     ///
   942     /// This class provides beside the core graph features alteration
   942     /// This class provides beside the core graph features alteration
   943     /// notifier interface for the graph structure.  This implements
   943     /// notifier interface for the graph structure.  This implements
   944     /// an observer-notifier pattern for each graph item. More
   944     /// an observer-notifier pattern for each graph item. More
   945     /// obsevers can be registered into the notifier and whenever an
   945     /// obsevers can be registered into the notifier and whenever an
   946     /// alteration occured in the graph all the observers will
   946     /// alteration occured in the graph all the observers will
   952       typedef _Base Base;
   952       typedef _Base Base;
   953       typedef typename Base::Edge Edge;
   953       typedef typename Base::Edge Edge;
   954 
   954 
   955 
   955 
   956       /// The arc observer registry.
   956       /// The arc observer registry.
   957       typedef AlterationNotifier<AlterableGraphComponent, Edge> 
   957       typedef AlterationNotifier<AlterableGraphComponent, Edge>
   958       EdgeNotifier;
   958       EdgeNotifier;
   959       
   959 
   960       /// \brief Gives back the arc alteration notifier.
   960       /// \brief Gives back the arc alteration notifier.
   961       ///
   961       ///
   962       /// Gives back the arc alteration notifier.
   962       /// Gives back the arc alteration notifier.
   963       EdgeNotifier& notifier(Edge) const {
   963       EdgeNotifier& notifier(Edge) const {
   964 	return EdgeNotifier();
   964         return EdgeNotifier();
   965       }
   965       }
   966 
   966 
   967       template <typename _Graph> 
   967       template <typename _Graph>
   968       struct Constraints {
   968       struct Constraints {
   969 	void constraints() {
   969         void constraints() {
   970 	  checkConcept<AlterableGraphComponent<Base>, _Graph>();
   970           checkConcept<AlterableGraphComponent<Base>, _Graph>();
   971           typename _Graph::EdgeNotifier& uen 
   971           typename _Graph::EdgeNotifier& uen
   972             = graph.notifier(typename _Graph::Edge());
   972             = graph.notifier(typename _Graph::Edge());
   973           ignore_unused_variable_warning(uen);
   973           ignore_unused_variable_warning(uen);
   974 	}
   974         }
   975 	
   975 
   976 	const _Graph& graph;
   976         const _Graph& graph;
   977 	
   977 
   978       };
   978       };
   979       
   979 
   980     };
   980     };
   981 
   981 
   982     /// \brief Class describing the concept of graph maps
   982     /// \brief Class describing the concept of graph maps
   983     /// 
   983     ///
   984     /// This class describes the common interface of the graph maps
   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
   985     /// (NodeMap, ArcMap), that is \ref maps-page "maps" which can be used to
   986     /// associate data to graph descriptors (nodes or arcs).
   986     /// associate data to graph descriptors (nodes or arcs).
   987     template <typename _Graph, typename _Item, typename _Value>
   987     template <typename _Graph, typename _Item, typename _Value>
   988     class GraphMap : public ReadWriteMap<_Item, _Value> {
   988     class GraphMap : public ReadWriteMap<_Item, _Value> {
  1007       GraphMap(const Graph&, const Value&) {}
  1007       GraphMap(const Graph&, const Value&) {}
  1008       /// \brief Copy constructor.
  1008       /// \brief Copy constructor.
  1009       ///
  1009       ///
  1010       /// Copy Constructor.
  1010       /// Copy Constructor.
  1011       GraphMap(const GraphMap&) : Parent() {}
  1011       GraphMap(const GraphMap&) : Parent() {}
  1012       
  1012 
  1013       /// \brief Assign operator.
  1013       /// \brief Assign operator.
  1014       ///
  1014       ///
  1015       /// Assign operator. It does not mofify the underlying graph,
  1015       /// Assign operator. It does not mofify the underlying graph,
  1016       /// it just iterates on the current item set and set the  map
  1016       /// it just iterates on the current item set and set the  map
  1017       /// with the value returned by the assigned map. 
  1017       /// with the value returned by the assigned map.
  1018       template <typename CMap>
  1018       template <typename CMap>
  1019       GraphMap& operator=(const CMap&) { 
  1019       GraphMap& operator=(const CMap&) {
  1020         checkConcept<ReadMap<Key, Value>, CMap>();
  1020         checkConcept<ReadMap<Key, Value>, CMap>();
  1021         return *this;
  1021         return *this;
  1022       }
  1022       }
  1023 
  1023 
  1024       template<typename _Map>
  1024       template<typename _Map>
  1025       struct Constraints {
  1025       struct Constraints {
  1026 	void constraints() {
  1026         void constraints() {
  1027 	  checkConcept<ReadWriteMap<Key, Value>, _Map >();
  1027           checkConcept<ReadWriteMap<Key, Value>, _Map >();
  1028 	  // Construction with a graph parameter
  1028           // Construction with a graph parameter
  1029 	  _Map a(g);
  1029           _Map a(g);
  1030 	  // Constructor with a graph and a default value parameter
  1030           // Constructor with a graph and a default value parameter
  1031 	  _Map a2(g,t);
  1031           _Map a2(g,t);
  1032 	  // Copy constructor.
  1032           // Copy constructor.
  1033 	  _Map b(c);
  1033           _Map b(c);
  1034           
  1034 
  1035           ReadMap<Key, Value> cmap;
  1035           ReadMap<Key, Value> cmap;
  1036           b = cmap;
  1036           b = cmap;
  1037 
  1037 
  1038 	  ignore_unused_variable_warning(a2);
  1038           ignore_unused_variable_warning(a2);
  1039 	  ignore_unused_variable_warning(b);
  1039           ignore_unused_variable_warning(b);
  1040 	}
  1040         }
  1041 
  1041 
  1042 	const _Map &c;
  1042         const _Map &c;
  1043 	const Graph &g;
  1043         const Graph &g;
  1044 	const typename GraphMap::Value &t;
  1044         const typename GraphMap::Value &t;
  1045       };
  1045       };
  1046 
  1046 
  1047     };
  1047     };
  1048 
  1048 
  1049     /// \brief An empty mappable digraph class.
  1049     /// \brief An empty mappable digraph class.
  1068       template <typename _Value>
  1068       template <typename _Value>
  1069       class NodeMap : public GraphMap<Digraph, Node, _Value> {
  1069       class NodeMap : public GraphMap<Digraph, Node, _Value> {
  1070       public:
  1070       public:
  1071         typedef GraphMap<MappableDigraphComponent, Node, _Value> Parent;
  1071         typedef GraphMap<MappableDigraphComponent, Node, _Value> Parent;
  1072 
  1072 
  1073 	/// \brief Construct a new map.
  1073         /// \brief Construct a new map.
  1074 	///
  1074         ///
  1075 	/// Construct a new map for the digraph.
  1075         /// Construct a new map for the digraph.
  1076 	explicit NodeMap(const MappableDigraphComponent& digraph) 
  1076         explicit NodeMap(const MappableDigraphComponent& digraph)
  1077           : Parent(digraph) {}
  1077           : Parent(digraph) {}
  1078 
  1078 
  1079 	/// \brief Construct a new map with default value.
  1079         /// \brief Construct a new map with default value.
  1080 	///
  1080         ///
  1081 	/// Construct a new map for the digraph and initalise the values.
  1081         /// Construct a new map for the digraph and initalise the values.
  1082 	NodeMap(const MappableDigraphComponent& digraph, const _Value& value)
  1082         NodeMap(const MappableDigraphComponent& digraph, const _Value& value)
  1083           : Parent(digraph, value) {}
  1083           : Parent(digraph, value) {}
  1084 
  1084 
  1085 	/// \brief Copy constructor.
  1085         /// \brief Copy constructor.
  1086 	///
  1086         ///
  1087 	/// Copy Constructor.
  1087         /// Copy Constructor.
  1088 	NodeMap(const NodeMap& nm) : Parent(nm) {}
  1088         NodeMap(const NodeMap& nm) : Parent(nm) {}
  1089 
  1089 
  1090 	/// \brief Assign operator.
  1090         /// \brief Assign operator.
  1091 	///
  1091         ///
  1092 	/// Assign operator.
  1092         /// Assign operator.
  1093         template <typename CMap>
  1093         template <typename CMap>
  1094         NodeMap& operator=(const CMap&) { 
  1094         NodeMap& operator=(const CMap&) {
  1095           checkConcept<ReadMap<Node, _Value>, CMap>();
  1095           checkConcept<ReadMap<Node, _Value>, CMap>();
  1096           return *this;
  1096           return *this;
  1097         }
  1097         }
  1098 
  1098 
  1099       };
  1099       };
  1105       template <typename _Value>
  1105       template <typename _Value>
  1106       class ArcMap : public GraphMap<Digraph, Arc, _Value> {
  1106       class ArcMap : public GraphMap<Digraph, Arc, _Value> {
  1107       public:
  1107       public:
  1108         typedef GraphMap<MappableDigraphComponent, Arc, _Value> Parent;
  1108         typedef GraphMap<MappableDigraphComponent, Arc, _Value> Parent;
  1109 
  1109 
  1110 	/// \brief Construct a new map.
  1110         /// \brief Construct a new map.
  1111 	///
  1111         ///
  1112 	/// Construct a new map for the digraph.
  1112         /// Construct a new map for the digraph.
  1113 	explicit ArcMap(const MappableDigraphComponent& digraph) 
  1113         explicit ArcMap(const MappableDigraphComponent& digraph)
  1114           : Parent(digraph) {}
  1114           : Parent(digraph) {}
  1115 
  1115 
  1116 	/// \brief Construct a new map with default value.
  1116         /// \brief Construct a new map with default value.
  1117 	///
  1117         ///
  1118 	/// Construct a new map for the digraph and initalise the values.
  1118         /// Construct a new map for the digraph and initalise the values.
  1119 	ArcMap(const MappableDigraphComponent& digraph, const _Value& value)
  1119         ArcMap(const MappableDigraphComponent& digraph, const _Value& value)
  1120           : Parent(digraph, value) {}
  1120           : Parent(digraph, value) {}
  1121 
  1121 
  1122 	/// \brief Copy constructor.
  1122         /// \brief Copy constructor.
  1123 	///
  1123         ///
  1124 	/// Copy Constructor.
  1124         /// Copy Constructor.
  1125 	ArcMap(const ArcMap& nm) : Parent(nm) {}
  1125         ArcMap(const ArcMap& nm) : Parent(nm) {}
  1126 
  1126 
  1127 	/// \brief Assign operator.
  1127         /// \brief Assign operator.
  1128 	///
  1128         ///
  1129 	/// Assign operator.
  1129         /// Assign operator.
  1130         template <typename CMap>
  1130         template <typename CMap>
  1131         ArcMap& operator=(const CMap&) { 
  1131         ArcMap& operator=(const CMap&) {
  1132           checkConcept<ReadMap<Arc, _Value>, CMap>();
  1132           checkConcept<ReadMap<Arc, _Value>, CMap>();
  1133           return *this;
  1133           return *this;
  1134         }
  1134         }
  1135 
  1135 
  1136       };
  1136       };
  1137 
  1137 
  1138 
  1138 
  1139       template <typename _Digraph>
  1139       template <typename _Digraph>
  1140       struct Constraints {
  1140       struct Constraints {
  1141 
  1141 
  1142 	struct Dummy {
  1142         struct Dummy {
  1143 	  int value;
  1143           int value;
  1144 	  Dummy() : value(0) {}
  1144           Dummy() : value(0) {}
  1145 	  Dummy(int _v) : value(_v) {}
  1145           Dummy(int _v) : value(_v) {}
  1146 	};
  1146         };
  1147 
  1147 
  1148 	void constraints() {
  1148         void constraints() {
  1149 	  checkConcept<Base, _Digraph>();
  1149           checkConcept<Base, _Digraph>();
  1150 	  { // int map test
  1150           { // int map test
  1151 	    typedef typename _Digraph::template NodeMap<int> IntNodeMap;
  1151             typedef typename _Digraph::template NodeMap<int> IntNodeMap;
  1152 	    checkConcept<GraphMap<_Digraph, typename _Digraph::Node, int>, 
  1152             checkConcept<GraphMap<_Digraph, typename _Digraph::Node, int>,
  1153 	      IntNodeMap >();
  1153               IntNodeMap >();
  1154 	  } { // bool map test
  1154           } { // bool map test
  1155 	    typedef typename _Digraph::template NodeMap<bool> BoolNodeMap;
  1155             typedef typename _Digraph::template NodeMap<bool> BoolNodeMap;
  1156 	    checkConcept<GraphMap<_Digraph, typename _Digraph::Node, bool>,
  1156             checkConcept<GraphMap<_Digraph, typename _Digraph::Node, bool>,
  1157 	      BoolNodeMap >();
  1157               BoolNodeMap >();
  1158 	  } { // Dummy map test
  1158           } { // Dummy map test
  1159 	    typedef typename _Digraph::template NodeMap<Dummy> DummyNodeMap;
  1159             typedef typename _Digraph::template NodeMap<Dummy> DummyNodeMap;
  1160 	    checkConcept<GraphMap<_Digraph, typename _Digraph::Node, Dummy>,
  1160             checkConcept<GraphMap<_Digraph, typename _Digraph::Node, Dummy>,
  1161 	      DummyNodeMap >();
  1161               DummyNodeMap >();
  1162 	  } 
  1162           }
  1163 
  1163 
  1164 	  { // int map test
  1164           { // int map test
  1165 	    typedef typename _Digraph::template ArcMap<int> IntArcMap;
  1165             typedef typename _Digraph::template ArcMap<int> IntArcMap;
  1166 	    checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, int>,
  1166             checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, int>,
  1167 	      IntArcMap >();
  1167               IntArcMap >();
  1168 	  } { // bool map test
  1168           } { // bool map test
  1169 	    typedef typename _Digraph::template ArcMap<bool> BoolArcMap;
  1169             typedef typename _Digraph::template ArcMap<bool> BoolArcMap;
  1170 	    checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, bool>,
  1170             checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, bool>,
  1171 	      BoolArcMap >();
  1171               BoolArcMap >();
  1172 	  } { // Dummy map test
  1172           } { // Dummy map test
  1173 	    typedef typename _Digraph::template ArcMap<Dummy> DummyArcMap;
  1173             typedef typename _Digraph::template ArcMap<Dummy> DummyArcMap;
  1174 	    checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, Dummy>, 
  1174             checkConcept<GraphMap<_Digraph, typename _Digraph::Arc, Dummy>,
  1175 	      DummyArcMap >();
  1175               DummyArcMap >();
  1176 	  } 
  1176           }
  1177 	}
  1177         }
  1178 
  1178 
  1179 	_Digraph& digraph;
  1179         _Digraph& digraph;
  1180       };
  1180       };
  1181     };
  1181     };
  1182 
  1182 
  1183     /// \brief An empty mappable base bipartite graph class.
  1183     /// \brief An empty mappable base bipartite graph class.
  1184     ///
  1184     ///
  1197       /// \brief ReadWrite map of the edges.
  1197       /// \brief ReadWrite map of the edges.
  1198       ///
  1198       ///
  1199       /// ReadWrite map of the edges.
  1199       /// ReadWrite map of the edges.
  1200       ///
  1200       ///
  1201       template <typename _Value>
  1201       template <typename _Value>
  1202       class EdgeMap : public GraphMap<Graph, Edge, _Value> {  
  1202       class EdgeMap : public GraphMap<Graph, Edge, _Value> {
  1203       public:
  1203       public:
  1204         typedef GraphMap<MappableGraphComponent, Edge, _Value> Parent;
  1204         typedef GraphMap<MappableGraphComponent, Edge, _Value> Parent;
  1205 
  1205 
  1206 	/// \brief Construct a new map.
  1206         /// \brief Construct a new map.
  1207 	///
  1207         ///
  1208 	/// Construct a new map for the graph.
  1208         /// Construct a new map for the graph.
  1209 	explicit EdgeMap(const MappableGraphComponent& graph) 
  1209         explicit EdgeMap(const MappableGraphComponent& graph)
  1210           : Parent(graph) {}
  1210           : Parent(graph) {}
  1211 
  1211 
  1212 	/// \brief Construct a new map with default value.
  1212         /// \brief Construct a new map with default value.
  1213 	///
  1213         ///
  1214 	/// Construct a new map for the graph and initalise the values.
  1214         /// Construct a new map for the graph and initalise the values.
  1215 	EdgeMap(const MappableGraphComponent& graph, const _Value& value)
  1215         EdgeMap(const MappableGraphComponent& graph, const _Value& value)
  1216           : Parent(graph, value) {}
  1216           : Parent(graph, value) {}
  1217 
  1217 
  1218 	/// \brief Copy constructor.
  1218         /// \brief Copy constructor.
  1219 	///
  1219         ///
  1220 	/// Copy Constructor.
  1220         /// Copy Constructor.
  1221 	EdgeMap(const EdgeMap& nm) : Parent(nm) {}
  1221         EdgeMap(const EdgeMap& nm) : Parent(nm) {}
  1222 
  1222 
  1223 	/// \brief Assign operator.
  1223         /// \brief Assign operator.
  1224 	///
  1224         ///
  1225 	/// Assign operator.
  1225         /// Assign operator.
  1226         template <typename CMap>
  1226         template <typename CMap>
  1227         EdgeMap& operator=(const CMap&) { 
  1227         EdgeMap& operator=(const CMap&) {
  1228           checkConcept<ReadMap<Edge, _Value>, CMap>();
  1228           checkConcept<ReadMap<Edge, _Value>, CMap>();
  1229           return *this;
  1229           return *this;
  1230         }
  1230         }
  1231 
  1231 
  1232       };
  1232       };
  1233 
  1233 
  1234 
  1234 
  1235       template <typename _Graph>
  1235       template <typename _Graph>
  1236       struct Constraints {
  1236       struct Constraints {
  1237 
  1237 
  1238 	struct Dummy {
  1238         struct Dummy {
  1239 	  int value;
  1239           int value;
  1240 	  Dummy() : value(0) {}
  1240           Dummy() : value(0) {}
  1241 	  Dummy(int _v) : value(_v) {}
  1241           Dummy(int _v) : value(_v) {}
  1242 	};
  1242         };
  1243 
  1243 
  1244 	void constraints() {
  1244         void constraints() {
  1245 	  checkConcept<MappableGraphComponent<Base>, _Graph>();
  1245           checkConcept<MappableGraphComponent<Base>, _Graph>();
  1246 
  1246 
  1247 	  { // int map test
  1247           { // int map test
  1248 	    typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
  1248             typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
  1249 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
  1249             checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
  1250 	      IntEdgeMap >();
  1250               IntEdgeMap >();
  1251 	  } { // bool map test
  1251           } { // bool map test
  1252 	    typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
  1252             typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
  1253 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
  1253             checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
  1254 	      BoolEdgeMap >();
  1254               BoolEdgeMap >();
  1255 	  } { // Dummy map test
  1255           } { // Dummy map test
  1256 	    typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap;
  1256             typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap;
  1257 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>, 
  1257             checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>,
  1258 	      DummyEdgeMap >();
  1258               DummyEdgeMap >();
  1259 	  } 
  1259           }
  1260 	}
  1260         }
  1261 
  1261 
  1262 	_Graph& graph;
  1262         _Graph& graph;
  1263       };
  1263       };
  1264     };
  1264     };
  1265 
  1265 
  1266     /// \brief An empty extendable digraph class.
  1266     /// \brief An empty extendable digraph class.
  1267     ///
  1267     ///
  1280       /// \brief Adds a new node to the digraph.
  1280       /// \brief Adds a new node to the digraph.
  1281       ///
  1281       ///
  1282       /// Adds a new node to the digraph.
  1282       /// Adds a new node to the digraph.
  1283       ///
  1283       ///
  1284       Node addNode() {
  1284       Node addNode() {
  1285 	return INVALID;
  1285         return INVALID;
  1286       }
  1286       }
  1287     
  1287 
  1288       /// \brief Adds a new arc connects the given two nodes.
  1288       /// \brief Adds a new arc connects the given two nodes.
  1289       ///
  1289       ///
  1290       /// Adds a new arc connects the the given two nodes.
  1290       /// Adds a new arc connects the the given two nodes.
  1291       Arc addArc(const Node&, const Node&) {
  1291       Arc addArc(const Node&, const Node&) {
  1292 	return INVALID;
  1292         return INVALID;
  1293       }
  1293       }
  1294 
  1294 
  1295       template <typename _Digraph>
  1295       template <typename _Digraph>
  1296       struct Constraints {
  1296       struct Constraints {
  1297 	void constraints() {
  1297         void constraints() {
  1298           checkConcept<Base, _Digraph>();
  1298           checkConcept<Base, _Digraph>();
  1299 	  typename _Digraph::Node node_a, node_b;
  1299           typename _Digraph::Node node_a, node_b;
  1300 	  node_a = digraph.addNode();
  1300           node_a = digraph.addNode();
  1301 	  node_b = digraph.addNode();
  1301           node_b = digraph.addNode();
  1302 	  typename _Digraph::Arc arc;
  1302           typename _Digraph::Arc arc;
  1303 	  arc = digraph.addArc(node_a, node_b);
  1303           arc = digraph.addArc(node_a, node_b);
  1304 	}
  1304         }
  1305 
  1305 
  1306 	_Digraph& digraph;
  1306         _Digraph& digraph;
  1307       };
  1307       };
  1308     };
  1308     };
  1309 
  1309 
  1310     /// \brief An empty extendable base undirected graph class.
  1310     /// \brief An empty extendable base undirected graph class.
  1311     ///
  1311     ///
  1325       /// \brief Adds a new node to the graph.
  1325       /// \brief Adds a new node to the graph.
  1326       ///
  1326       ///
  1327       /// Adds a new node to the graph.
  1327       /// Adds a new node to the graph.
  1328       ///
  1328       ///
  1329       Node addNode() {
  1329       Node addNode() {
  1330 	return INVALID;
  1330         return INVALID;
  1331       }
  1331       }
  1332     
  1332 
  1333       /// \brief Adds a new arc connects the given two nodes.
  1333       /// \brief Adds a new arc connects the given two nodes.
  1334       ///
  1334       ///
  1335       /// Adds a new arc connects the the given two nodes.
  1335       /// Adds a new arc connects the the given two nodes.
  1336       Edge addArc(const Node&, const Node&) {
  1336       Edge addArc(const Node&, const Node&) {
  1337 	return INVALID;
  1337         return INVALID;
  1338       }
  1338       }
  1339 
  1339 
  1340       template <typename _Graph>
  1340       template <typename _Graph>
  1341       struct Constraints {
  1341       struct Constraints {
  1342 	void constraints() {
  1342         void constraints() {
  1343 	  checkConcept<Base, _Graph>();
  1343           checkConcept<Base, _Graph>();
  1344 	  typename _Graph::Node node_a, node_b;
  1344           typename _Graph::Node node_a, node_b;
  1345 	  node_a = graph.addNode();
  1345           node_a = graph.addNode();
  1346 	  node_b = graph.addNode();
  1346           node_b = graph.addNode();
  1347 	  typename _Graph::Edge edge;
  1347           typename _Graph::Edge edge;
  1348 	  edge = graph.addEdge(node_a, node_b);
  1348           edge = graph.addEdge(node_a, node_b);
  1349 	}
  1349         }
  1350 
  1350 
  1351 	_Graph& graph;
  1351         _Graph& graph;
  1352       };
  1352       };
  1353     };
  1353     };
  1354 
  1354 
  1355     /// \brief An empty erasable digraph class.
  1355     /// \brief An empty erasable digraph class.
  1356     ///  
  1356     ///
  1357     /// This class provides beside the core digraph features core erase
  1357     /// This class provides beside the core digraph features core erase
  1358     /// functions for the digraph structure. The main difference between
  1358     /// functions for the digraph structure. The main difference between
  1359     /// the base and this interface is that the digraph alterations
  1359     /// the base and this interface is that the digraph alterations
  1360     /// should handled already on this level.
  1360     /// should handled already on this level.
  1361     template <typename _Base = BaseDigraphComponent>
  1361     template <typename _Base = BaseDigraphComponent>
  1366       typedef typename Base::Node Node;
  1366       typedef typename Base::Node Node;
  1367       typedef typename Base::Arc Arc;
  1367       typedef typename Base::Arc Arc;
  1368 
  1368 
  1369       /// \brief Erase a node from the digraph.
  1369       /// \brief Erase a node from the digraph.
  1370       ///
  1370       ///
  1371       /// Erase a node from the digraph. This function should 
  1371       /// Erase a node from the digraph. This function should
  1372       /// erase all arcs connecting to the node.
  1372       /// erase all arcs connecting to the node.
  1373       void erase(const Node&) {}    
  1373       void erase(const Node&) {}
  1374 
  1374 
  1375       /// \brief Erase an arc from the digraph.
  1375       /// \brief Erase an arc from the digraph.
  1376       ///
  1376       ///
  1377       /// Erase an arc from the digraph.
  1377       /// Erase an arc from the digraph.
  1378       ///
  1378       ///
  1379       void erase(const Arc&) {}
  1379       void erase(const Arc&) {}
  1380 
  1380 
  1381       template <typename _Digraph>
  1381       template <typename _Digraph>
  1382       struct Constraints {
  1382       struct Constraints {
  1383 	void constraints() {
  1383         void constraints() {
  1384           checkConcept<Base, _Digraph>();
  1384           checkConcept<Base, _Digraph>();
  1385 	  typename _Digraph::Node node;
  1385           typename _Digraph::Node node;
  1386 	  digraph.erase(node);
  1386           digraph.erase(node);
  1387 	  typename _Digraph::Arc arc;
  1387           typename _Digraph::Arc arc;
  1388 	  digraph.erase(arc);
  1388           digraph.erase(arc);
  1389 	}
  1389         }
  1390 
  1390 
  1391 	_Digraph& digraph;
  1391         _Digraph& digraph;
  1392       };
  1392       };
  1393     };
  1393     };
  1394 
  1394 
  1395     /// \brief An empty erasable base undirected graph class.
  1395     /// \brief An empty erasable base undirected graph class.
  1396     ///  
  1396     ///
  1397     /// This class provides beside the core undirected graph features
  1397     /// This class provides beside the core undirected graph features
  1398     /// core erase functions for the undirceted graph structure. The
  1398     /// core erase functions for the undirceted graph structure. The
  1399     /// main difference between the base and this interface is that
  1399     /// main difference between the base and this interface is that
  1400     /// the graph alterations should handled already on this level.
  1400     /// the graph alterations should handled already on this level.
  1401     template <typename _Base = BaseGraphComponent>
  1401     template <typename _Base = BaseGraphComponent>
  1408 
  1408 
  1409       /// \brief Erase a node from the graph.
  1409       /// \brief Erase a node from the graph.
  1410       ///
  1410       ///
  1411       /// Erase a node from the graph. This function should erase
  1411       /// Erase a node from the graph. This function should erase
  1412       /// arcs connecting to the node.
  1412       /// arcs connecting to the node.
  1413       void erase(const Node&) {}    
  1413       void erase(const Node&) {}
  1414 
  1414 
  1415       /// \brief Erase an arc from the graph.
  1415       /// \brief Erase an arc from the graph.
  1416       ///
  1416       ///
  1417       /// Erase an arc from the graph.
  1417       /// Erase an arc from the graph.
  1418       ///
  1418       ///
  1419       void erase(const Edge&) {}
  1419       void erase(const Edge&) {}
  1420 
  1420 
  1421       template <typename _Graph>
  1421       template <typename _Graph>
  1422       struct Constraints {
  1422       struct Constraints {
  1423 	void constraints() {
  1423         void constraints() {
  1424           checkConcept<Base, _Graph>();
  1424           checkConcept<Base, _Graph>();
  1425 	  typename _Graph::Node node;
  1425           typename _Graph::Node node;
  1426 	  graph.erase(node);
  1426           graph.erase(node);
  1427 	  typename _Graph::Edge edge;
  1427           typename _Graph::Edge edge;
  1428 	  graph.erase(edge);
  1428           graph.erase(edge);
  1429 	}
  1429         }
  1430 
  1430 
  1431 	_Graph& graph;
  1431         _Graph& graph;
  1432       };
  1432       };
  1433     };
  1433     };
  1434 
  1434 
  1435     /// \brief An empty clearable base digraph class.
  1435     /// \brief An empty clearable base digraph class.
  1436     ///
  1436     ///
  1446 
  1446 
  1447       /// \brief Erase all nodes and arcs from the digraph.
  1447       /// \brief Erase all nodes and arcs from the digraph.
  1448       ///
  1448       ///
  1449       /// Erase all nodes and arcs from the digraph.
  1449       /// Erase all nodes and arcs from the digraph.
  1450       ///
  1450       ///
  1451       void clear() {}    
  1451       void clear() {}
  1452 
  1452 
  1453       template <typename _Digraph>
  1453       template <typename _Digraph>
  1454       struct Constraints {
  1454       struct Constraints {
  1455 	void constraints() {
  1455         void constraints() {
  1456           checkConcept<Base, _Digraph>();
  1456           checkConcept<Base, _Digraph>();
  1457 	  digraph.clear();
  1457           digraph.clear();
  1458 	}
  1458         }
  1459 
  1459 
  1460 	_Digraph digraph;
  1460         _Digraph digraph;
  1461       };
  1461       };
  1462     };
  1462     };
  1463 
  1463 
  1464     /// \brief An empty clearable base undirected graph class.
  1464     /// \brief An empty clearable base undirected graph class.
  1465     ///
  1465     ///
  1473 
  1473 
  1474       typedef _Base Base;
  1474       typedef _Base Base;
  1475 
  1475 
  1476       template <typename _Graph>
  1476       template <typename _Graph>
  1477       struct Constraints {
  1477       struct Constraints {
  1478 	void constraints() {
  1478         void constraints() {
  1479           checkConcept<ClearableGraphComponent<Base>, _Graph>();
  1479           checkConcept<ClearableGraphComponent<Base>, _Graph>();
  1480 	}
  1480         }
  1481 
  1481 
  1482 	_Graph graph;
  1482         _Graph graph;
  1483       };
  1483       };
  1484     };
  1484     };
  1485 
  1485 
  1486   }
  1486   }
  1487 
  1487