lemon/concept/graph_component.h
changeset 2125 2f2cbe4e78a8
parent 2111 ea1fa1bc3f6d
equal deleted inserted replaced
13:19eae3e5eb43 14:76d27b068502
    30 #include <lemon/bits/alteration_notifier.h>
    30 #include <lemon/bits/alteration_notifier.h>
    31 
    31 
    32 namespace lemon {
    32 namespace lemon {
    33   namespace concept {
    33   namespace concept {
    34 
    34 
    35     /****************   Graph iterator concepts   ****************/
    35     /// \brief Skeleton class for graph Node and Edge types
    36 
    36     ///
    37     /// Skeleton class for graph Node and Edge types
       
    38 
       
    39     /// This class describes the interface of Node and Edge (and UEdge
    37     /// This class describes the interface of Node and Edge (and UEdge
    40     /// in undirected graphs) subtypes of graph types.
    38     /// in undirected graphs) subtypes of graph types.
    41     ///
    39     ///
    42     /// \note This class is a template class so that we can use it to
    40     /// \note This class is a template class so that we can use it to
    43     /// create graph skeleton classes. The reason for this is than Node
    41     /// create graph skeleton classes. The reason for this is than Node
    48 #ifndef DOXYGEN
    46 #ifndef DOXYGEN
    49     template <char _selector = '0'>
    47     template <char _selector = '0'>
    50 #endif
    48 #endif
    51     class GraphItem {
    49     class GraphItem {
    52     public:
    50     public:
    53       /// Default constructor.
    51       /// \brief Default constructor.
    54       
    52       ///      
    55       /// \warning The default constructor is not required to set
    53       /// \warning The default constructor is not required to set
    56       /// 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
    57       /// as uninitialized.
    55       /// as uninitialized.
    58       GraphItem() {}
    56       GraphItem() {}
       
    57       /// \brief Copy constructor.
       
    58       ///
    59       /// Copy constructor.
    59       /// Copy constructor.
    60       
    60       ///
    61       /// Copy constructor.
    61       GraphItem(const GraphItem &) {}
    62       ///
    62       /// \brief Invalid constructor \& conversion.
    63       GraphItem(GraphItem const&) {}
    63       ///
    64       /// Invalid constructor \& conversion.
       
    65 
       
    66       /// This constructor initializes the item to be invalid.
    64       /// This constructor initializes the item to be invalid.
    67       /// \sa Invalid for more details.
    65       /// \sa Invalid for more details.
    68       GraphItem(Invalid) {}
    66       GraphItem(Invalid) {}
    69       /// Assign operator for nodes.
    67       /// \brief Assign operator for nodes.
    70 
    68       ///
    71       /// The nodes are assignable. 
    69       /// The nodes are assignable. 
    72       ///
    70       ///
    73       GraphItem& operator=(GraphItem const&) { return *this; }
    71       GraphItem& operator=(GraphItem const&) { return *this; }
    74       /// Equality operator.
    72       /// \brief Equality operator.
    75       
    73       ///
    76       /// Two iterators are equal if and only if they represents the
    74       /// Two iterators are equal if and only if they represents the
    77       /// same node in the graph or both are invalid.
    75       /// same node in the graph or both are invalid.
    78       bool operator==(GraphItem) const { return false; }
    76       bool operator==(GraphItem) const { return false; }
    79       /// Inequality operator.
    77       /// \brief Inequality operator.
    80 	
    78       ///
    81       /// \sa operator==(const Node& n)
    79       /// \sa operator==(const Node& n)
    82       ///
    80       ///
    83       bool operator!=(GraphItem) const { return false; }
    81       bool operator!=(GraphItem) const { return false; }
    84 
    82 
    85       /// Artificial ordering operator.
    83       /// \brief Artificial ordering operator.
    86 
    84       ///
    87       /// To allow the use of graph descriptors as key type in std::map or
    85       /// To allow the use of graph descriptors as key type in std::map or
    88       /// similar associative container we require this.
    86       /// similar associative container we require this.
    89       ///
    87       ///
    90       /// \note This operator only have to define some strict ordering of
    88       /// \note This operator only have to define some strict ordering of
    91       /// the items; this order has nothing to do with the iteration
    89       /// the items; this order has nothing to do with the iteration
    92       /// ordering of the items.
    90       /// ordering of the items.
    93       ///
       
    94       /// \bug This is a technical requirement. Do we really need this?
       
    95       bool operator<(GraphItem) const { return false; }
    91       bool operator<(GraphItem) const { return false; }
    96 
    92 
    97       template<typename _GraphItem>
    93       template<typename _GraphItem>
    98       struct Constraints {
    94       struct Constraints {
    99 	void constraints() {
    95 	void constraints() {
   105 
   101 
   106 	  bool b;
   102 	  bool b;
   107 	  //	  b = (ia == ib) && (ia != ib) && (ia < ib);
   103 	  //	  b = (ia == ib) && (ia != ib) && (ia < ib);
   108 	  b = (ia == ib) && (ia != ib);
   104 	  b = (ia == ib) && (ia != ib);
   109 	  b = (ia == INVALID) && (ib != INVALID);
   105 	  b = (ia == INVALID) && (ib != INVALID);
   110 	  //	  b = (ia < ib);
   106           b = (ia < ib);
   111 	}
   107 	}
   112 
   108 
   113 	const _GraphItem &ia;
   109 	const _GraphItem &ia;
   114 	const _GraphItem &ib;
   110 	const _GraphItem &ib;
   115       };
   111       };
   116     };
   112     };
   117 
   113 
   118     /// A type describing the concept of graph node
   114     /// \brief An empty base graph class.
   119 
   115     ///  
   120     /// This is an instantiation of \ref GraphItem which can be used as a
       
   121     /// Node subtype in graph skeleton definitions
       
   122     typedef GraphItem<'n'> GraphNode;
       
   123 
       
   124     /// A type describing the concept of graph edge
       
   125 
       
   126     /// This is an instantiation of \ref GraphItem which can be used as a
       
   127     /// Edge subtype in graph skeleton definitions
       
   128     typedef GraphItem<'e'> GraphEdge;
       
   129 
       
   130 
       
   131     /**************** Basic features of graphs ****************/
       
   132 
       
   133     /// An empty base graph class.
       
   134   
       
   135     /// This class provides the minimal set of features needed for a graph
   116     /// This class provides the minimal set of features needed for a graph
   136     /// structure. All graph concepts have to be conform to this base
   117     /// structure. All graph concepts have to be conform to this base
   137     /// graph.
   118     /// graph. It just provides types for nodes and edges and functions to
   138     ///
   119     /// get the source and the target of the edges.
   139     /// \bug This is not true. The minimal graph concept is the
       
   140     /// BaseIterableGraphComponent.
       
   141 
       
   142     class BaseGraphComponent {
   120     class BaseGraphComponent {
   143     public:
   121     public:
   144 
   122 
   145       typedef BaseGraphComponent Graph;
   123       typedef BaseGraphComponent Graph;
   146       
   124       
   147       /// Node class of the graph.
   125       /// \brief Node class of the graph.
   148 
   126       ///
   149       /// This class represents the Nodes of the graph. 
   127       /// This class represents the Nodes of the graph. 
   150       ///
   128       ///
   151       typedef GraphItem<'n'> Node;
   129       typedef GraphItem<'n'> Node;
   152 
   130 
   153       /// Edge class of the graph.
   131       /// \brief Edge class of the graph.
   154 
   132       ///
   155       /// This class represents the Edges of the graph. 
   133       /// This class represents the Edges of the graph. 
   156       ///
   134       ///
   157       typedef GraphItem<'e'> Edge;
   135       typedef GraphItem<'e'> Edge;
   158 
   136 
   159       ///Gives back the target node of an edge.
   137       /// \brief Gives back the target node of an edge.
   160 
   138       ///
   161       ///Gives back the target node of an edge.
   139       /// Gives back the target node of an edge.
   162       ///
   140       ///
   163       Node target(const Edge&) const { return INVALID;}
   141       Node target(const Edge&) const { return INVALID;}
   164 
   142 
   165       ///Gives back the source node of an edge.
   143       /// \brief Gives back the source node of an edge.
   166 
   144       ///
   167       ///Gives back the source node of an edge.
   145       /// Gives back the source node of an edge.
   168       ///
   146       ///
   169       Node source(const Edge&) const { return INVALID;}
   147       Node source(const Edge&) const { return INVALID;}
   170 
   148 
       
   149       /// \brief Gives back the opposite node on the given edge.
       
   150       ///
       
   151       /// Gives back the opposite node on the given edge.
       
   152       Node oppositeNode(const Node&, const Edge&) const {
       
   153         return INVALID;
       
   154       }
   171 
   155 
   172       template <typename _Graph>
   156       template <typename _Graph>
   173       struct Constraints {
   157       struct Constraints {
   174 	typedef typename _Graph::Node Node;
   158 	typedef typename _Graph::Node Node;
   175 	typedef typename _Graph::Edge Edge;
   159 	typedef typename _Graph::Edge Edge;
   180 	  {
   164 	  {
   181 	    Node n;
   165 	    Node n;
   182 	    Edge e(INVALID);
   166 	    Edge e(INVALID);
   183 	    n = graph.source(e);
   167 	    n = graph.source(e);
   184 	    n = graph.target(e);
   168 	    n = graph.target(e);
       
   169             n = graph.oppositeNode(n, e);
   185 	  }      
   170 	  }      
   186 	}
   171 	}
   187       
   172       
   188 	const _Graph& graph;
   173 	const _Graph& graph;
   189       };
   174       };
   190     };
   175     };
   191 
   176 
   192     /// An empty iterable base graph class.
   177     /// \brief An empty base undirected graph class.
   193   
   178     ///  
       
   179     /// This class provides the minimal set of features needed for an
       
   180     /// undirected graph structure. All undirected graph concepts have
       
   181     /// to be conform to this base graph. It just provides types for
       
   182     /// nodes, edges and undirected edges and functions to get the
       
   183     /// source and the target of the edges and undirected edges,
       
   184     /// conversion from edges to undirected edges and function to get
       
   185     /// both direction of the undirected edges.
       
   186     class BaseUGraphComponent : public BaseGraphComponent {
       
   187     public:
       
   188       typedef BaseGraphComponent::Node Node;
       
   189       typedef BaseGraphComponent::Edge Edge;
       
   190       /// \brief Undirected edge class of the graph.
       
   191       ///
       
   192       /// This class represents the undirected edges of the graph.
       
   193       /// The undirected graphs can be used as a directed graph which
       
   194       /// for each edge contains the opposite edge too so the graph is
       
   195       /// bidirected. The undirected edge represents two opposite
       
   196       /// directed edges.
       
   197       class UEdge : public GraphItem<'u'> {
       
   198       public:
       
   199         typedef GraphItem<'u'> Parent;
       
   200         /// \brief Default constructor.
       
   201         ///      
       
   202         /// \warning The default constructor is not required to set
       
   203         /// the item to some well-defined value. So you should consider it
       
   204         /// as uninitialized.
       
   205         UEdge() {}
       
   206         /// \brief Copy constructor.
       
   207         ///
       
   208         /// Copy constructor.
       
   209         ///
       
   210         UEdge(const UEdge &) : Parent() {}
       
   211         /// \brief Invalid constructor \& conversion.
       
   212         ///
       
   213         /// This constructor initializes the item to be invalid.
       
   214         /// \sa Invalid for more details.
       
   215         UEdge(Invalid) {}
       
   216         /// \brief Converter from edge to undirected edge.
       
   217         ///
       
   218         /// Besides the core graph item functionality each edge should
       
   219         /// be convertible to the represented undirected edge. 
       
   220         UEdge(const Edge&) {}
       
   221       };
       
   222 
       
   223       /// \brief Returns the direction of the edge.
       
   224       ///
       
   225       /// Returns the direction of the edge. Each edge represents an
       
   226       /// undirected edge with a direction. It gives back the
       
   227       /// direction.
       
   228       bool direction(const Edge&) const { return true; }
       
   229 
       
   230       /// \brief Returns the directed edge.
       
   231       ///
       
   232       /// Returns the directed edge from its direction and the
       
   233       /// represented undirected edge.
       
   234       Edge direct(const UEdge&, bool) const { return INVALID;} 
       
   235 
       
   236       /// \brief Returns the directed edge.
       
   237       ///
       
   238       /// Returns the directed edge from its source and the
       
   239       /// represented undirected edge.
       
   240       Edge direct(const UEdge&, const Node&) const { return INVALID;} 
       
   241 
       
   242       /// \brief Returns the opposite edge.
       
   243       ///
       
   244       /// Returns the opposite edge. It is the edge representing the
       
   245       /// same undirected edge and has opposite direction.
       
   246       Edge oppositeEdge(const Edge&) const { return INVALID;}
       
   247 
       
   248       /// \brief Gives back the target node of an undirected edge.
       
   249       ///
       
   250       /// Gives back the target node of an undirected edge. The name
       
   251       /// target is a little confusing because the undirected edge
       
   252       /// does not have target but it just means that one of the end 
       
   253       /// node.
       
   254       Node target(const UEdge&) const { return INVALID;}
       
   255 
       
   256       /// \brief Gives back the source node of an undirected edge.
       
   257       ///
       
   258       /// Gives back the source node of an undirected edge. The name
       
   259       /// source is a little confusing because the undirected edge
       
   260       /// does not have source but it just means that one of the end 
       
   261       /// node.
       
   262       Node source(const UEdge&) const { return INVALID;}
       
   263       
       
   264       template <typename _Graph>
       
   265       struct Constraints {
       
   266 	typedef typename _Graph::Node Node;
       
   267 	typedef typename _Graph::Edge Edge;
       
   268 	typedef typename _Graph::UEdge UEdge;
       
   269       
       
   270 	void constraints() {
       
   271           checkConcept<BaseGraphComponent, _Graph>();
       
   272 	  checkConcept<GraphItem<'u'>, UEdge>();
       
   273 	  {
       
   274 	    Node n;
       
   275 	    UEdge ue(INVALID);
       
   276             Edge e;
       
   277 	    n = graph.source(ue);
       
   278 	    n = graph.target(ue);
       
   279             e = graph.direct(ue, true);
       
   280             e = graph.direct(ue, n);
       
   281             e = graph.oppositeEdge(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 iterable base graph class.
       
   294     ///  
   194     /// This class provides beside the core graph features
   295     /// This class provides beside the core graph features
   195     /// core iterable interface for the graph structure.
   296     /// core iterable interface for the graph structure.
   196     /// Most of the base graphs should be conform to this concept.
   297     /// Most of the base graphs should be conform to this concept.
   197 
   298     template <typename _Base = BaseGraphComponent>
   198     class BaseIterableGraphComponent : virtual public BaseGraphComponent {
   299     class BaseIterableGraphComponent : public _Base {
   199     public:
   300     public:
   200 
   301 
   201       typedef BaseGraphComponent::Node Node;
   302       typedef _Base Base; 
   202       typedef BaseGraphComponent::Edge Edge;
   303       typedef typename Base::Node Node;
   203 
   304       typedef typename Base::Edge Edge;
   204       /// Gives back the first Node in the iterating order.
   305 
   205       
   306       /// \brief Gives back the first node in the iterating order.
   206       /// Gives back the first Node in the iterating order.
   307       ///      
       
   308       /// Gives back the first node in the iterating order.
   207       ///     
   309       ///     
   208       void first(Node&) const {}
   310       void first(Node&) const {}
   209 
   311 
   210       /// Gives back the next Node in the iterating order.
   312       /// \brief Gives back the next node in the iterating order.
   211       
   313       ///
   212       /// Gives back the next Node in the iterating order.
   314       /// Gives back the next node in the iterating order.
   213       ///     
   315       ///     
   214       void next(Node&) const {}
   316       void next(Node&) const {}
   215 
   317 
   216       /// Gives back the first Edge in the iterating order.
   318       /// \brief Gives back the first edge in the iterating order.
   217       
   319       ///
   218       /// Gives back the first Edge in the iterating order.
   320       /// Gives back the first edge in the iterating order.
   219       ///     
   321       ///     
   220       void first(Edge&) const {}
   322       void first(Edge&) const {}
   221       /// Gives back the next Edge in the iterating order.
   323 
   222       
   324       /// \brief Gives back the next edge in the iterating order.
   223       /// Gives back the next Edge in the iterating order.
   325       ///
       
   326       /// Gives back the next edge in the iterating order.
   224       ///     
   327       ///     
   225       void next(Edge&) const {}
   328       void next(Edge&) const {}
   226 
   329 
   227 
   330 
   228       /// Gives back the first of the Edges point to the given Node.
   331       /// \brief Gives back the first of the edges point to the given
   229       
   332       /// node.
   230       /// Gives back the first of the Edges point to the given Node.
   333       ///
       
   334       /// Gives back the first of the edges point to the given node.
   231       ///     
   335       ///     
   232       void firstIn(Edge&, const Node&) const {}
   336       void firstIn(Edge&, const Node&) const {}
   233 
   337 
   234       /// Gives back the next of the Edges points to the given Node.
   338       /// \brief Gives back the next of the edges points to the given
   235 
   339       /// node.
   236 
   340       ///
   237       /// Gives back the next of the Edges points to the given Node.
   341       /// Gives back the next of the edges points to the given node.
   238       ///
   342       ///
   239       void nextIn(Edge&) const {}
   343       void nextIn(Edge&) const {}
   240 
   344 
   241       /// Gives back the first of the Edges start from the given Node.
   345       /// \brief Gives back the first of the edges start from the
   242       
   346       /// given node.
   243       /// Gives back the first of the Edges start from the given Node.
   347       ///      
       
   348       /// Gives back the first of the edges start from the given node.
   244       ///     
   349       ///     
   245       void firstOut(Edge&, const Node&) const {}
   350       void firstOut(Edge&, const Node&) const {}
   246 
   351 
   247       /// Gives back the next of the Edges start from the given Node.
   352       /// \brief Gives back the next of the edges start from the given
   248       
   353       /// node.
   249       /// Gives back the next of the Edges start from the given Node.
   354       ///
       
   355       /// Gives back the next of the edges start from the given node.
   250       ///     
   356       ///     
   251       void nextOut(Edge&) const {}
   357       void nextOut(Edge&) const {}
   252 
   358 
   253 
   359 
   254       template <typename _Graph>
   360       template <typename _Graph>
   278 
   384 
   279 	const _Graph& graph;
   385 	const _Graph& graph;
   280       };
   386       };
   281     };
   387     };
   282 
   388 
   283     /// An empty idable base graph class.
   389     /// \brief An empty iterable base undirected graph class.
   284   
   390     ///  
       
   391     /// This class provides beside the core undirceted graph features
       
   392     /// core iterable interface for the undirected graph structure.
       
   393     /// Most of the base undirected graphs should be conform to this
       
   394     /// concept.
       
   395     template <typename _Base = BaseUGraphComponent>
       
   396     class BaseIterableUGraphComponent 
       
   397       : public BaseIterableGraphComponent<_Base> {
       
   398     public:
       
   399 
       
   400       typedef _Base Base; 
       
   401       typedef typename Base::UEdge UEdge;
       
   402       typedef typename Base::Node Node;
       
   403 
       
   404       using BaseIterableGraphComponent<_Base>::first;
       
   405       using BaseIterableGraphComponent<_Base>::next;
       
   406 
       
   407       /// \brief Gives back the first undirected edge in the iterating
       
   408       /// order.
       
   409       ///
       
   410       /// Gives back the first undirected edge in the iterating order.
       
   411       ///     
       
   412       void first(UEdge&) const {}
       
   413 
       
   414       /// \brief Gives back the next undirected edge in the iterating
       
   415       /// order.
       
   416       ///
       
   417       /// Gives back the next undirected edge in the iterating order.
       
   418       ///     
       
   419       void next(UEdge&) const {}
       
   420 
       
   421 
       
   422       /// \brief Gives back the first of the undirected edges from the
       
   423       /// given node.
       
   424       ///
       
   425       /// Gives back the first of the undirected edges from the given
       
   426       /// node. The bool parameter gives back that direction which
       
   427       /// gives a good direction of the uedge so the source of the
       
   428       /// directed edge is the given node.
       
   429       void firstInc(UEdge&, bool&, const Node&) const {}
       
   430 
       
   431       /// \brief Gives back the next of the undirected edges from the
       
   432       /// given node.
       
   433       ///
       
   434       /// Gives back the next of the undirected edges from the given
       
   435       /// node. The bool parameter should be used as the \c firstInc()
       
   436       /// use it.
       
   437       void nextInc(UEdge&, bool&) const {}
       
   438 
       
   439       template <typename _Graph>
       
   440       struct Constraints {
       
   441       
       
   442 	void constraints() {
       
   443 	  checkConcept<Base, _Graph >();
       
   444 	  checkConcept<BaseIterableGraphComponent<Base>, _Graph>();
       
   445 	  typename _Graph::Node node;
       
   446 	  typename _Graph::UEdge uedge;
       
   447           bool dir;
       
   448 	  {
       
   449 	    graph.first(uedge);
       
   450 	    graph.next(uedge);
       
   451 	  }
       
   452 	  {
       
   453 	    graph.firstInc(uedge, dir, node);
       
   454 	    graph.nextInc(uedge, dir);
       
   455 	  }
       
   456 	}
       
   457 
       
   458 	const _Graph& graph;
       
   459       };
       
   460     };
       
   461 
       
   462     /// \brief An empty idable base graph class.
       
   463     ///  
   285     /// This class provides beside the core graph features
   464     /// This class provides beside the core graph features
   286     /// core id functions for the graph structure.
   465     /// core id functions for the graph structure.
   287     /// The most of the base graphs should be conform to this concept.
   466     /// The most of the base graphs should be conform to this concept.
   288     /// The id's are unique and immutable.
   467     /// The id's are unique and immutable.
   289     class IDableGraphComponent : virtual public BaseGraphComponent {
   468     template <typename _Base = BaseGraphComponent>
   290     public:
   469     class IDableGraphComponent : public _Base {
   291 
   470     public:
   292       typedef BaseGraphComponent::Node Node;
   471 
   293       typedef BaseGraphComponent::Edge Edge;
   472       typedef _Base Base;
   294 
   473       typedef typename Base::Node Node;
   295       /// Gives back an unique integer id for the Node. 
   474       typedef typename Base::Edge Edge;
   296 
   475 
       
   476       /// \brief Gives back an unique integer id for the Node. 
       
   477       ///
   297       /// Gives back an unique integer id for the Node. 
   478       /// Gives back an unique integer id for the Node. 
   298       ///
   479       ///
   299       int id(const Node&) const { return -1;}
   480       int id(const Node&) const { return -1;}
   300 
   481 
   301       /// \brief Gives back the node by the unique id.
   482       /// \brief Gives back the node by the unique id.
   302       ///
   483       ///
   303       /// Gives back the node by the unique id.
   484       /// Gives back the node by the unique id.
   304       /// If the graph does not contain node with the given id
   485       /// If the graph does not contain node with the given id
   305       /// then the result of the function is undetermined. 
   486       /// then the result of the function is undetermined. 
   306       Node fromId(int , Node) const { return INVALID;}
   487       Node nodeFromId(int) const { return INVALID;}
   307 
   488 
   308       /// \brief Gives back an unique integer id for the Edge. 
   489       /// \brief Gives back an unique integer id for the Edge. 
   309       ///
   490       ///
   310       /// Gives back an unique integer id for the Edge. 
   491       /// Gives back an unique integer id for the Edge. 
   311       ///
   492       ///
   314       /// \brief Gives back the edge by the unique id.
   495       /// \brief Gives back the edge by the unique id.
   315       ///
   496       ///
   316       /// Gives back the edge by the unique id.
   497       /// Gives back the edge by the unique id.
   317       /// If the graph does not contain edge with the given id
   498       /// If the graph does not contain edge with the given id
   318       /// then the result of the function is undetermined. 
   499       /// then the result of the function is undetermined. 
   319       Edge fromId(int, Edge) const { return INVALID;}
   500       Edge edgeFromId(int) const { return INVALID;}
       
   501 
       
   502       /// \brief Gives back an integer greater or equal to the maximum
       
   503       /// Node id.
       
   504       ///
       
   505       /// Gives back an integer greater or equal to the maximum Node
       
   506       /// id.
       
   507       int maxNodeId() const { return -1;}
       
   508 
       
   509       /// \brief Gives back an integer greater or equal to the maximum
       
   510       /// Edge id.
       
   511       ///
       
   512       /// Gives back an integer greater or equal to the maximum Edge
       
   513       /// id.
       
   514       int maxEdgeId() const { return -1;}
   320 
   515 
   321       template <typename _Graph>
   516       template <typename _Graph>
   322       struct Constraints {
   517       struct Constraints {
   323 
   518 
   324 	void constraints() {
   519 	void constraints() {
   325 	  checkConcept< BaseGraphComponent, _Graph >();
   520 	  checkConcept< BaseGraphComponent, _Graph >();
   326 	  typename _Graph::Node node;
   521 	  typename _Graph::Node node;
   327 	  int nid = graph.id(node);
   522 	  int nid = graph.id(node);
   328 	  nid = graph.id(node);
   523 	  nid = graph.id(node);
   329 	  node = graph.fromId(nid, Node());
   524 	  node = graph.nodeFromId(nid);
   330 	  typename _Graph::Edge edge;
   525 	  typename _Graph::Edge edge;
   331 	  int eid = graph.id(edge);
   526 	  int eid = graph.id(edge);
   332 	  eid = graph.id(edge);
   527 	  eid = graph.id(edge);
   333 	  edge = graph.fromId(eid, Edge());
   528 	  edge = graph.edgeFromId(eid);
       
   529 
       
   530 	  nid = graph.maxNodeId();
       
   531 	  ignore_unused_variable_warning(nid);
       
   532 	  eid = graph.maxEdgeId();
       
   533 	  ignore_unused_variable_warning(eid);
   334 	}
   534 	}
   335 
   535 
   336 	const _Graph& graph;
   536 	const _Graph& graph;
   337       };
   537       };
   338     };
   538     };
   339 
   539 
   340 
   540     /// \brief An empty idable base undirected graph class.
   341     /// An empty max-idable base graph class.
   541     ///  
   342   
   542     /// This class provides beside the core undirected graph features
   343     /// This class provides beside the core graph features
   543     /// core id functions for the undirected graph structure.  The
   344     /// core max id functions for the graph structure.
   544     /// most of the base undirected graphs should be conform to this
   345     /// The most of the base graphs should be conform to this concept.
   545     /// concept.  The id's are unique and immutable.
   346     /// The id's are unique and immutable.
   546     template <typename _Base = BaseUGraphComponent>
   347     class MaxIDableGraphComponent : virtual public BaseGraphComponent {
   547     class IDableUGraphComponent : public IDableGraphComponent<_Base> {
   348     public:
   548     public:
   349 
   549 
   350       /// Gives back an integer greater or equal to the maximum Node id. 
   550       typedef _Base Base;
   351 
   551       typedef typename Base::UEdge UEdge;
   352       /// Gives back an integer greater or equal to the maximum Node id. 
   552 
   353       ///
   553       using IDableGraphComponent<_Base>::id;
   354       int maxId(Node = INVALID) const { return -1;}
   554 
   355 
   555       /// \brief Gives back an unique integer id for the UEdge. 
   356       /// Gives back an integer greater or equal to the maximum Edge id. 
   556       ///
   357 
   557       /// Gives back an unique integer id for the UEdge. 
   358       /// Gives back an integer greater or equal to the maximum Edge id. 
   558       ///
   359       ///
   559       int id(const UEdge&) const { return -1;}
   360       int maxId(Edge = INVALID) const { return -1;}
   560 
   361 
   561       /// \brief Gives back the undirected edge by the unique id.
   362       template <typename _Graph>
   562       ///
   363       struct Constraints {
   563       /// Gives back the undirected edge by the unique id.  If the
   364 
   564       /// graph does not contain edge with the given id then the
   365 	void constraints() {
   565       /// result of the function is undetermined.
   366 	  checkConcept<BaseGraphComponent, _Graph>();
   566       UEdge uEdgeFromId(int) const { return INVALID;}
   367 	  int nid = graph.maxId(typename _Graph::Node());
   567 
   368 	  ignore_unused_variable_warning(nid);
   568       /// \brief Gives back an integer greater or equal to the maximum
   369 	  int eid = graph.maxId(typename _Graph::Edge());
   569       /// UEdge id.
   370 	  ignore_unused_variable_warning(eid);
   570       ///
   371 	}
   571       /// Gives back an integer greater or equal to the maximum UEdge
   372       
   572       /// id.
       
   573       int maxUEdgeId() const { return -1;}
       
   574 
       
   575       template <typename _Graph>
       
   576       struct Constraints {
       
   577 
       
   578 	void constraints() {
       
   579 	  checkConcept<Base, _Graph >();
       
   580 	  checkConcept<IDableGraphComponent<Base>, _Graph >();
       
   581 	  typename _Graph::UEdge uedge;
       
   582 	  int ueid = graph.id(uedge);
       
   583 	  ueid = graph.id(uedge);
       
   584 	  uedge = graph.uEdgeFromId(ueid);
       
   585 	  ueid = graph.maxUEdgeId();
       
   586 	  ignore_unused_variable_warning(ueid);
       
   587 	}
       
   588 
   373 	const _Graph& graph;
   589 	const _Graph& graph;
   374       };
   590       };
   375     };
   591     };
   376 
   592 
   377     /// An empty extendable base graph class.
   593     /// \brief An empty extendable base graph class.
   378   
   594     ///
   379     /// This class provides beside the core graph features
   595     /// This class provides beside the core graph features
   380     /// core graph extend interface for the graph structure.
   596     /// core graph extend interface for the graph structure.
   381     /// The most of the base graphs should be conform to this concept.
   597     /// The most of the base graphs should be conform to this concept.
   382     class BaseExtendableGraphComponent : virtual public BaseGraphComponent {
   598     template <typename _Base = BaseGraphComponent>
   383     public:
   599     class BaseExtendableGraphComponent : public _Base {
   384 
   600     public:
   385       typedef BaseGraphComponent::Node Node;
   601 
   386       typedef BaseGraphComponent::Edge Edge;
   602       typedef typename _Base::Node Node;
   387 
   603       typedef typename _Base::Edge Edge;
   388       /// Adds a new Node to the graph.
   604 
   389 
   605       /// \brief Adds a new node to the graph.
   390       /// Adds a new Node to the graph.
   606       ///
       
   607       /// Adds a new node to the graph.
   391       ///
   608       ///
   392       Node addNode() {
   609       Node addNode() {
   393 	return INVALID;
   610 	return INVALID;
   394       }
   611       }
   395     
   612     
   396       /// Adds a new Edge connects the two Nodes to the graph.
   613       /// \brief Adds a new edge connects the given two nodes.
   397 
   614       ///
   398       /// Adds a new Edge connects the two Nodes to the graph.
   615       /// Adds a new edge connects the the given two nodes.
   399       ///
       
   400       Edge addEdge(const Node&, const Node&) {
   616       Edge addEdge(const Node&, const Node&) {
   401 	return INVALID;
   617 	return INVALID;
   402       }
   618       }
   403 
   619 
   404       template <typename _Graph>
   620       template <typename _Graph>
   405       struct Constraints {
   621       struct Constraints {
   406 	void constraints() {
   622 	void constraints() {
   407 	  checkConcept<BaseGraphComponent, _Graph >();
       
   408 	  typename _Graph::Node node_a, node_b;
   623 	  typename _Graph::Node node_a, node_b;
   409 	  node_a = graph.addNode();
   624 	  node_a = graph.addNode();
   410 	  node_b = graph.addNode();
   625 	  node_b = graph.addNode();
   411 	  typename _Graph::Edge edge;
   626 	  typename _Graph::Edge edge;
   412 	  edge = graph.addEdge(node_a, node_b);
   627 	  edge = graph.addEdge(node_a, node_b);
   414 
   629 
   415 	_Graph& graph;
   630 	_Graph& graph;
   416       };
   631       };
   417     };
   632     };
   418 
   633 
   419     /// An empty erasable base graph class.
   634     /// \brief An empty extendable base undirected graph class.
   420   
   635     ///
       
   636     /// This class provides beside the core undirected graph features
       
   637     /// core undircted graph extend interface for the graph structure.
       
   638     /// The most of the base graphs should be conform to this concept.
       
   639     template <typename _Base = BaseUGraphComponent>
       
   640     class BaseExtendableUGraphComponent : public _Base {
       
   641     public:
       
   642 
       
   643       typedef typename _Base::Node Node;
       
   644       typedef typename _Base::UEdge UEdge;
       
   645 
       
   646       /// \brief Adds a new node to the graph.
       
   647       ///
       
   648       /// Adds a new node to the graph.
       
   649       ///
       
   650       Node addNode() {
       
   651 	return INVALID;
       
   652       }
       
   653     
       
   654       /// \brief Adds a new edge connects the given two nodes.
       
   655       ///
       
   656       /// Adds a new edge connects the the given two nodes.
       
   657       UEdge addEdge(const Node&, const Node&) {
       
   658 	return INVALID;
       
   659       }
       
   660 
       
   661       template <typename _Graph>
       
   662       struct Constraints {
       
   663 	void constraints() {
       
   664 	  typename _Graph::Node node_a, node_b;
       
   665 	  node_a = graph.addNode();
       
   666 	  node_b = graph.addNode();
       
   667 	  typename _Graph::UEdge uedge;
       
   668 	  uedge = graph.addUEdge(node_a, node_b);
       
   669 	}
       
   670 
       
   671 	_Graph& graph;
       
   672       };
       
   673     };
       
   674 
       
   675     /// \brief An empty erasable base graph class.
       
   676     ///  
   421     /// This class provides beside the core graph features
   677     /// This class provides beside the core graph features
   422     /// core erase functions for the graph structure.
   678     /// core erase functions for the graph structure.
   423     /// The most of the base graphs should be conform to this concept.
   679     /// The most of the base graphs should be conform to this concept.
   424     class BaseErasableGraphComponent : virtual public BaseGraphComponent {
   680     template <typename _Base = BaseGraphComponent>
   425     public:
   681     class BaseErasableGraphComponent : public _Base {
   426 
   682     public:
   427       typedef BaseGraphComponent::Node Node;
   683 
   428       typedef BaseGraphComponent::Edge Edge;
   684       typedef _Base Base;
   429 
   685       typedef typename Base::Node Node;
   430       /// Erase a Node from the graph.
   686       typedef typename Base::Edge Edge;
   431       
   687 
   432       /// Erase a Node from the graph. This function should not
   688       /// \brief Erase a node from the graph.
       
   689       ///
       
   690       /// Erase a node from the graph. This function should not
   433       /// erase edges connecting to the Node.
   691       /// erase edges connecting to the Node.
   434       void erase(const Node&) {}    
   692       void erase(const Node&) {}    
   435 
   693 
   436       /// Erase an Edge from the graph.
   694       /// \brief Erase an edge from the graph.
   437 
   695       ///
   438       /// Erase an Edge from the graph.
   696       /// Erase an edge from the graph.
   439       ///
   697       ///
   440       void erase(const Edge&) {}
   698       void erase(const Edge&) {}
   441 
   699 
   442       template <typename _Graph>
   700       template <typename _Graph>
   443       struct Constraints {
   701       struct Constraints {
   444 	void constraints() {
   702 	void constraints() {
   445 	  checkConcept<BaseGraphComponent, _Graph>();
       
   446 	  typename _Graph::Node node;
   703 	  typename _Graph::Node node;
   447 	  graph.erase(node);
   704 	  graph.erase(node);
   448 	  typename _Graph::Edge edge;
   705 	  typename _Graph::Edge edge;
   449 	  graph.erase(edge);
   706 	  graph.erase(edge);
   450 	}
   707 	}
   451 
   708 
   452 	_Graph& graph;
   709 	_Graph& graph;
   453       };
   710       };
   454     };
   711     };
   455 
   712 
   456     /// An empty clearable base graph class.
   713     /// \brief An empty erasable base undirected graph class.
   457   
   714     ///  
       
   715     /// This class provides beside the core undirected graph features
       
   716     /// core erase functions for the undirceted graph structure.
       
   717     template <typename _Base = BaseUGraphComponent>
       
   718     class BaseErasableUGraphComponent : public _Base {
       
   719     public:
       
   720 
       
   721       typedef _Base Base;
       
   722       typedef typename Base::Node Node;
       
   723       typedef typename Base::UEdge UEdge;
       
   724 
       
   725       /// \brief Erase a node from the graph.
       
   726       ///
       
   727       /// Erase a node from the graph. This function should not
       
   728       /// erase edges connecting to the Node.
       
   729       void erase(const Node&) {}    
       
   730 
       
   731       /// \brief Erase an edge from the graph.
       
   732       ///
       
   733       /// Erase an edge from the graph.
       
   734       ///
       
   735       void erase(const UEdge&) {}
       
   736 
       
   737       template <typename _Graph>
       
   738       struct Constraints {
       
   739 	void constraints() {
       
   740 	  typename _Graph::Node node;
       
   741 	  graph.erase(node);
       
   742 	  typename _Graph::Edge edge;
       
   743 	  graph.erase(edge);
       
   744 	}
       
   745 
       
   746 	_Graph& graph;
       
   747       };
       
   748     };
       
   749 
       
   750     /// \brief An empty clearable base graph class.
       
   751     ///
   458     /// This class provides beside the core graph features
   752     /// This class provides beside the core graph features
   459     /// core clear functions for the graph structure.
   753     /// core clear functions for the graph structure.
   460     /// The most of the base graphs should be conform to this concept.
   754     /// The most of the base graphs should be conform to this concept.
   461     class BaseClearableGraphComponent : virtual public BaseGraphComponent {
   755     template <typename _Base = BaseGraphComponent>
   462     public:
   756     class BaseClearableGraphComponent : public _Base {
   463 
   757     public:
   464       /// Erase all the Nodes and Edges from the graph.
   758 
   465 
   759       /// \brief Erase all the nodes and edges from the graph.
   466       /// Erase all the Nodes and Edges from the graph.
   760       ///
       
   761       /// Erase all the nodes and edges from the graph.
   467       ///
   762       ///
   468       void clear() {}    
   763       void clear() {}    
   469 
   764 
   470       template <typename _Graph>
   765       template <typename _Graph>
   471       struct Constraints {
   766       struct Constraints {
   472 	void constraints() {
   767 	void constraints() {
   473 	  checkConcept<BaseGraphComponent, _Graph>();
       
   474 	  graph.clear();
   768 	  graph.clear();
   475 	}
   769 	}
   476 
   770 
   477 	_Graph graph;
   771 	_Graph graph;
   478       };
   772       };
   479     };
   773     };
   480 
   774 
   481 
   775     /// \brief An empty clearable base undirected graph class.
   482     /// Skeleton class for graph NodeIt and EdgeIt
   776     ///
   483 
   777     /// This class provides beside the core undirected graph features
       
   778     /// core clear functions for the undirected graph structure.
       
   779     /// The most of the base graphs should be conform to this concept.
       
   780     template <typename _Base = BaseUGraphComponent>
       
   781     class BaseClearableUGraphComponent : public _Base {
       
   782     public:
       
   783 
       
   784       /// \brief Erase all the nodes and undirected edges from the graph.
       
   785       ///
       
   786       /// Erase all the nodes and undirected edges from the graph.
       
   787       ///
       
   788       void clear() {}    
       
   789 
       
   790       template <typename _Graph>
       
   791       struct Constraints {
       
   792 	void constraints() {
       
   793 	  graph.clear();
       
   794 	}
       
   795 
       
   796 	_Graph graph;
       
   797       };
       
   798     };
       
   799 
       
   800 
       
   801     /// \brief Skeleton class for graph NodeIt and EdgeIt
       
   802     ///
   484     /// Skeleton class for graph NodeIt and EdgeIt.
   803     /// Skeleton class for graph NodeIt and EdgeIt.
   485     ///
   804     ///
   486     template <typename _Graph, typename _Item>
   805     template <typename _Graph, typename _Item>
   487     class GraphIterator : public _Item {
   806     class GraphItemIt : public _Item {
   488     public:
   807     public:
   489       /// \todo Don't we need the Item type as typedef?
   808       /// \brief Default constructor.
   490 
   809       ///
   491       /// Default constructor.
       
   492       
       
   493       /// @warning The default constructor sets the iterator
   810       /// @warning The default constructor sets the iterator
   494       /// to an undefined value.
   811       /// to an undefined value.
   495       GraphIterator() {}
   812       GraphItemIt() {}
       
   813       /// \brief Copy constructor.
       
   814       ///
   496       /// Copy constructor.
   815       /// Copy constructor.
   497       
   816       ///
   498       /// Copy constructor.
   817       GraphItemIt(const GraphItemIt& ) {}
   499       ///
   818       /// \brief Sets the iterator to the first item.
   500       GraphIterator(GraphIterator const&) {}
   819       ///
   501       /// Sets the iterator to the first item.
       
   502       
       
   503       /// Sets the iterator to the first item of \c the graph.
   820       /// Sets the iterator to the first item of \c the graph.
   504       ///
   821       ///
   505       explicit GraphIterator(const _Graph&) {}
   822       explicit GraphItemIt(const _Graph&) {}
   506       /// Invalid constructor \& conversion.
   823       /// \brief Invalid constructor \& conversion.
   507 
   824       ///
   508       /// This constructor initializes the item to be invalid.
   825       /// This constructor initializes the item to be invalid.
   509       /// \sa Invalid for more details.
   826       /// \sa Invalid for more details.
   510       GraphIterator(Invalid) {}
   827       GraphItemIt(Invalid) {}
   511       /// Assign operator for items.
   828       /// \brief Assign operator for items.
   512 
   829       ///
   513       /// The items are assignable. 
   830       /// The items are assignable. 
   514       ///
   831       ///
   515       GraphIterator& operator=(GraphIterator const&) { return *this; }      
   832       GraphItemIt& operator=(const GraphItemIt&) { return *this; }      
   516       /// Next item.
   833       /// \brief Next item.
   517 
   834       /// 
   518       /// Assign the iterator to the next item.
   835       /// Assign the iterator to the next item.
   519       ///
   836       ///
   520       GraphIterator& operator++() { return *this; }
   837       GraphItemIt& operator++() { return *this; }
   521       //	Node operator*() const { return INVALID; }
   838       /// \brief Equality operator
   522       /// Equality operator
   839       /// 
   523 
       
   524       /// Two iterators are equal if and only if they point to the
   840       /// Two iterators are equal if and only if they point to the
   525       /// same object or both are invalid.
   841       /// same object or both are invalid.
   526       bool operator==(const GraphIterator&) const { return true;}
   842       bool operator==(const GraphItemIt&) const { return true;}
   527       /// Inequality operator
   843       /// \brief Inequality operator
   528 	
   844       ///	
   529       /// \sa operator==(Node n)
   845       /// \sa operator==(Node n)
   530       ///
   846       ///
   531       bool operator!=(const GraphIterator&) const { return true;}
   847       bool operator!=(const GraphItemIt&) const { return true;}
   532       
   848       
   533       template<typename _GraphIterator>
   849       template<typename _GraphItemIt>
   534       struct Constraints {
   850       struct Constraints {
   535 	void constraints() {
   851 	void constraints() {
   536 	  //	  checkConcept< Item, _GraphIterator >();
   852 	  _GraphItemIt it1(g);	
   537 	  _GraphIterator it1(g);
   853 	  _GraphItemIt it2;
   538 	
       
   539 	  /// \todo Do we need NodeIt(Node) kind of constructor?
       
   540 	  //	_GraphIterator it2(bj);
       
   541 	  _GraphIterator it2;
       
   542 
   854 
   543 	  it2 = ++it1;
   855 	  it2 = ++it1;
   544 	  ++it2 = it1;
   856 	  ++it2 = it1;
   545 	  ++(++it1);
   857 	  ++(++it1);
   546 	  /// \bug This should be: is_base_and_derived<BaseItem, _GraphIterator>
   858 
   547 	  _Item bi = it1;
   859 	  _Item bi = it1;
   548 	  bi = it2;
   860 	  bi = it2;
   549 	}
   861 	}
   550 	_Graph& g;
   862 	_Graph& g;
   551       };
   863       };
   552     };
   864     };
   553 
   865 
   554     /// Skeleton class for graph InEdgeIt and OutEdgeIt
   866     /// \brief Skeleton class for graph InEdgeIt and OutEdgeIt
   555 
   867     ///
   556     /// \note Because InEdgeIt and OutEdgeIt may not inherit from the same
   868     /// \note Because InEdgeIt and OutEdgeIt may not inherit from the same
   557     /// base class, the _selector is a additional template parameter. For 
   869     /// base class, the _selector is a additional template parameter. For 
   558     /// InEdgeIt you should instantiate it with character 'i' and for 
   870     /// InEdgeIt you should instantiate it with character 'i' and for 
   559     /// OutEdgeIt with 'o'.
   871     /// OutEdgeIt with 'o'.
   560     /// \todo Is this a good name for this concept?
   872     template <typename _Graph,
   561     template <typename Graph,
   873 	      typename _Item = typename _Graph::Edge,
   562 	      typename Edge = typename Graph::Edge,
   874               typename _Base = typename _Graph::Node, 
   563 	      char _selector = '0'>
   875 	      char _selector = '0'>
   564     class GraphIncIterator : public Edge {
   876     class GraphIncIt : public _Item {
   565     public:
   877     public:
   566       /// Default constructor.
   878       /// \brief Default constructor.
   567       
   879       ///
   568       /// @warning The default constructor sets the iterator
   880       /// @warning The default constructor sets the iterator
   569       /// to an undefined value.
   881       /// to an undefined value.
   570       GraphIncIterator() {}
   882       GraphIncIt() {}
       
   883       /// \brief Copy constructor.
       
   884       ///
   571       /// Copy constructor.
   885       /// Copy constructor.
   572       
   886       ///
   573       /// Copy constructor.
   887       GraphIncIt(GraphIncIt const& gi) : _Item(gi) {}
   574       ///
   888       /// \brief Sets the iterator to the first edge incoming into or outgoing 
   575       GraphIncIterator(GraphIncIterator const& gi) :Edge(gi) {}
   889       /// from the node.
       
   890       ///
   576       /// Sets the iterator to the first edge incoming into or outgoing 
   891       /// Sets the iterator to the first edge incoming into or outgoing 
   577       /// from the node.
   892       /// from the node.
   578       
   893       ///
   579       /// Sets the iterator to the first edge incoming into or outgoing 
   894       explicit GraphIncIt(const _Graph&, const _Base&) {}
   580       /// from the node.
   895       /// \brief Invalid constructor \& conversion.
   581       ///
   896       ///
   582       explicit GraphIncIterator(const Graph&, const typename Graph::Node&) {}
       
   583       /// Invalid constructor \& conversion.
       
   584 
       
   585       /// This constructor initializes the item to be invalid.
   897       /// This constructor initializes the item to be invalid.
   586       /// \sa Invalid for more details.
   898       /// \sa Invalid for more details.
   587       GraphIncIterator(Invalid) {}
   899       GraphIncIt(Invalid) {}
   588       /// Assign operator for nodes.
   900       /// \brief Assign operator for iterators.
   589 
   901       ///
   590       /// The nodes are assignable. 
   902       /// The iterators are assignable. 
   591       ///
   903       ///
   592       GraphIncIterator& operator=(GraphIncIterator const&) { return *this; }      
   904       GraphIncIt& operator=(GraphIncIt const&) { return *this; }      
   593       /// Next edge.
   905       /// \brief Next item.
   594 
   906       ///
   595       /// Assign the iterator to the next node.
   907       /// Assign the iterator to the next item.
   596       ///
   908       ///
   597       GraphIncIterator& operator++() { return *this; }
   909       GraphIncIt& operator++() { return *this; }
   598 
   910 
   599       //	Node operator*() const { return INVALID; }
   911       /// \brief Equality operator
   600 
   912       ///
   601       /// Equality operator
       
   602 
       
   603       /// Two iterators are equal if and only if they point to the
   913       /// Two iterators are equal if and only if they point to the
   604       /// same object or both are invalid.
   914       /// same object or both are invalid.
   605       bool operator==(const GraphIncIterator&) const { return true;}
   915       bool operator==(const GraphIncIt&) const { return true;}
   606 
   916 
   607       /// Inequality operator
   917       /// \brief Inequality operator
   608 	
   918       ///
   609       /// \sa operator==(Node n)
   919       /// \sa operator==(Node n)
   610       ///
   920       ///
   611       bool operator!=(const GraphIncIterator&) const { return true;}
   921       bool operator!=(const GraphIncIt&) const { return true;}
   612 
   922 
   613       template <typename _GraphIncIterator>
   923       template <typename _GraphIncIt>
   614       struct Constraints {
   924       struct Constraints {
   615 	typedef typename Graph::Node Node;
   925 	void constraints() {
   616 	void constraints() {
   926 	  checkConcept<GraphItem<_selector>, _GraphIncIt>();
   617 	  checkConcept<GraphItem<'e'>, _GraphIncIterator>();
   927 	  _GraphIncIt it1(graph, node);
   618 	  _GraphIncIterator it1(graph, node);
   928 	  _GraphIncIt it2;
   619 	  /// \todo Do we need OutEdgeIt(Edge) kind of constructor?
       
   620 	  //	_GraphIncIterator it2(edge);
       
   621 	  _GraphIncIterator it2;
       
   622 
   929 
   623 	  it2 = ++it1;
   930 	  it2 = ++it1;
   624 	  ++it2 = it1;
   931 	  ++it2 = it1;
   625 	  ++(++it1);
   932 	  ++(++it1);
   626 	  Edge e = it1;
   933 	  _Item e = it1;
   627 	  e = it2;
   934 	  e = it2;
   628 
   935 
   629 	  const_constraits();
   936 	}
   630 	}
   937 
   631 
   938 	_Item edge;
   632 	void const_constraits() {
   939 	_Base node;
   633 	  Node n = graph.baseNode(it);
   940 	_Graph graph;
   634 	  n = graph.runningNode(it);
   941 	_GraphIncIt it;
   635 	}
   942       };
   636 
   943     };
   637 	Edge edge;
   944 
   638 	Node node;
   945 
   639 	Graph graph;
   946     /// \brief An empty iterable graph class.
   640 	_GraphIncIterator it;
   947     ///
   641       };
       
   642     };
       
   643 
       
   644 
       
   645     /// An empty iterable base graph class.
       
   646   
       
   647     /// This class provides beside the core graph features
   948     /// This class provides beside the core graph features
   648     /// iterator based iterable interface for the graph structure.
   949     /// iterator based iterable interface for the graph structure.
   649     /// This concept is part of the GraphConcept.
   950     /// This concept is part of the GraphConcept.
   650     class IterableGraphComponent : virtual public BaseGraphComponent {
   951     template <typename _Base = BaseGraphComponent>
       
   952     class IterableGraphComponent : public _Base {
   651 
   953 
   652     public:
   954     public:
   653     
   955     
       
   956       typedef _Base Base;
       
   957       typedef typename Base::Node Node;
       
   958       typedef typename Base::Edge Edge;
       
   959 
   654       typedef IterableGraphComponent Graph;
   960       typedef IterableGraphComponent Graph;
   655 
   961 
   656       typedef BaseGraphComponent::Node Node;
   962 
   657       typedef BaseGraphComponent::Edge Edge;
   963       /// \brief This iterator goes through each node.
   658 
   964       ///
   659       /// This iterator goes through each node.
   965       /// This iterator goes through each node.
   660 
   966       ///
       
   967       typedef GraphItemIt<Graph, Node> NodeIt;
       
   968 
       
   969       /// \brief This iterator goes through each node.
       
   970       ///
   661       /// This iterator goes through each node.
   971       /// This iterator goes through each node.
   662       ///
   972       ///
   663       typedef GraphIterator<Graph, Node> NodeIt;
   973       typedef GraphItemIt<Graph, Edge> EdgeIt;
   664       /// This iterator goes through each node.
   974 
   665 
   975       /// \brief This iterator goes trough the incoming edges of a node.
   666       /// This iterator goes through each node.
   976       ///
   667       ///
       
   668       typedef GraphIterator<Graph, Edge> EdgeIt;
       
   669       /// This iterator goes trough the incoming edges of a node.
       
   670 
       
   671       /// This iterator goes trough the \e inccoming edges of a certain node
   977       /// This iterator goes trough the \e inccoming edges of a certain node
   672       /// of a graph.
   978       /// of a graph.
   673       typedef GraphIncIterator<Graph, Edge, 'i'> InEdgeIt;
   979       typedef GraphIncIt<Graph, Edge, Node, 'i'> InEdgeIt;
   674       /// This iterator goes trough the outgoing edges of a node.
   980 
   675 
   981       /// \brief This iterator goes trough the outgoing edges of a node.
       
   982       ///
   676       /// This iterator goes trough the \e outgoing edges of a certain node
   983       /// This iterator goes trough the \e outgoing edges of a certain node
   677       /// of a graph.
   984       /// of a graph.
   678       typedef GraphIncIterator<Graph, Edge, 'o'> OutEdgeIt;
   985       typedef GraphIncIt<Graph, Edge, Node, 'o'> OutEdgeIt;
   679 
   986 
   680       /// \brief The base node of the iterator.
   987       /// \brief The base node of the iterator.
   681       ///
   988       ///
   682       /// Gives back the base node of the iterator.
   989       /// Gives back the base node of the iterator.
   683       /// It is always the target of the pointed edge.
   990       /// It is always the target of the pointed edge.
   709 
  1016 
   710     
  1017     
   711       template <typename _Graph> 
  1018       template <typename _Graph> 
   712       struct Constraints {
  1019       struct Constraints {
   713 	void constraints() {
  1020 	void constraints() {
   714 	  checkConcept< BaseGraphComponent, _Graph>();
  1021 	  checkConcept<Base, _Graph>();
   715 	  
  1022 	  
   716 	  checkConcept<GraphIterator<_Graph, typename _Graph::Edge>,
  1023 	  checkConcept<GraphItemIt<_Graph, typename _Graph::Edge>,
   717 	    typename _Graph::EdgeIt >();
  1024 	    typename _Graph::EdgeIt >();
   718 	  checkConcept<GraphIterator<_Graph, typename _Graph::Node>,
  1025 	  checkConcept<GraphItemIt<_Graph, typename _Graph::Node>,
   719 	    typename _Graph::NodeIt >();
  1026 	    typename _Graph::NodeIt >();
   720 	  checkConcept<GraphIncIterator<_Graph>, typename _Graph::InEdgeIt>();
  1027 	  checkConcept<GraphIncIt<_Graph, typename _Graph::Edge, 
   721 	  checkConcept<GraphIncIterator<_Graph>, typename _Graph::OutEdgeIt>();
  1028             typename _Graph::Node, 'i'>, typename _Graph::InEdgeIt>();
   722 
  1029 	  checkConcept<GraphIncIt<_Graph, typename _Graph::Edge, 
   723 	  typename _Graph::Node n(INVALID);
  1030             typename _Graph::Node, 'o'>, typename _Graph::OutEdgeIt>();
   724 	  typename _Graph::Edge e(INVALID);
  1031 
   725 	  n = graph.oppositeNode(n, e);
  1032           typename _Graph::Node n;
   726 	}
  1033           typename _Graph::InEdgeIt ieit(INVALID);
       
  1034           typename _Graph::OutEdgeIt oeit(INVALID);
       
  1035           n = graph.baseNode(ieit);
       
  1036           n = graph.runningNode(ieit);
       
  1037           n = graph.baseNode(oeit);
       
  1038           n = graph.runningNode(oeit);
       
  1039           ignore_unused_variable_warning(n);
       
  1040         }
   727 	
  1041 	
   728 	const _Graph& graph;
  1042 	const _Graph& graph;
   729 	
  1043 	
   730       };
  1044       };
   731     };
  1045     };
   732 
  1046 
   733     /// An empty alteration notifier base graph class.
  1047     /// \brief An empty iterable undirected graph class.
   734   
  1048     ///
   735     /// This class provides beside the core graph features
  1049     /// This class provides beside the core graph features iterator
   736     /// alteration notifier interface for the graph structure.
  1050     /// based iterable interface for the undirected graph structure.
   737     /// This is an observer-notifier pattern. More Obsevers can
  1051     /// This concept is part of the GraphConcept.
   738     /// be registered into the notifier and whenever an alteration
  1052     template <typename _Base = BaseUGraphComponent>
   739     /// occured in the graph all the observers will notified about it.
  1053     class IterableUGraphComponent : public IterableGraphComponent<_Base> {
   740     class AlterableGraphComponent : virtual public BaseIterableGraphComponent {
  1054     public:
   741     public:
  1055 
   742 
  1056       typedef _Base Base;
       
  1057       typedef typename Base::Node Node;
       
  1058       typedef typename Base::Edge Edge;
       
  1059       typedef typename Base::UEdge UEdge;
       
  1060 
       
  1061     
       
  1062       typedef IterableUGraphComponent Graph;
       
  1063       using IterableGraphComponent<_Base>::baseNode;
       
  1064       using IterableGraphComponent<_Base>::runningNode;
       
  1065 
       
  1066 
       
  1067       /// \brief This iterator goes through each node.
       
  1068       ///
       
  1069       /// This iterator goes through each node.
       
  1070       typedef GraphItemIt<Graph, UEdge> UEdgeIt;
       
  1071       /// \brief This iterator goes trough the incident edges of a
       
  1072       /// node.
       
  1073       ///
       
  1074       /// This iterator goes trough the incident edges of a certain
       
  1075       /// node of a graph.
       
  1076       typedef GraphIncIt<Graph, UEdge, Node, 'u'> IncEdgeIt;
       
  1077       /// \brief The base node of the iterator.
       
  1078       ///
       
  1079       /// Gives back the base node of the iterator.
       
  1080       Node baseNode(const IncEdgeIt&) const { return INVALID; }
       
  1081 
       
  1082       /// \brief The running node of the iterator.
       
  1083       ///
       
  1084       /// Gives back the running node of the iterator.
       
  1085       Node runningNode(const IncEdgeIt&) const { return INVALID; }
       
  1086 
       
  1087       template <typename _Graph> 
       
  1088       struct Constraints {
       
  1089 	void constraints() {
       
  1090 	  checkConcept<Base, _Graph>();
       
  1091 	  checkConcept<IterableGraphComponent<Base>, _Graph>();
       
  1092 	  
       
  1093 	  checkConcept<GraphItemIt<_Graph, typename _Graph::UEdge>,
       
  1094 	    typename _Graph::UEdgeIt >();
       
  1095 	  checkConcept<GraphIncIt<_Graph, typename _Graph::UEdge, 
       
  1096             typename _Graph::Node, 'u'>, typename _Graph::IncEdgeIt>();
       
  1097 
       
  1098           typename _Graph::Node n;
       
  1099           typename _Graph::IncEdgeIt ueit(INVALID);
       
  1100           n = graph.baseNode(ueit);
       
  1101           n = graph.runningNode(ueit);
       
  1102 	}
       
  1103 	
       
  1104 	const _Graph& graph;
       
  1105 	
       
  1106       };
       
  1107     };
       
  1108 
       
  1109     /// \brief An empty alteration notifier graph class.
       
  1110     ///  
       
  1111     /// This class provides beside the core graph features alteration
       
  1112     /// notifier interface for the graph structure.  This implements
       
  1113     /// an observer-notifier pattern for each graph item. More
       
  1114     /// obsevers can be registered into the notifier and whenever an
       
  1115     /// alteration occured in the graph all the observers will
       
  1116     /// notified about it.
       
  1117     template <typename _Base = BaseGraphComponent>
       
  1118     class AlterableGraphComponent : public _Base {
       
  1119     public:
       
  1120 
       
  1121       typedef _Base Base;
       
  1122       typedef typename Base::Node Node;
       
  1123       typedef typename Base::Edge Edge;
       
  1124 
       
  1125 
       
  1126       /// The node observer registry.
       
  1127       typedef AlterationNotifier<AlterableGraphComponent, Node> 
       
  1128       NodeNotifier;
   743       /// The edge observer registry.
  1129       /// The edge observer registry.
   744       typedef AlterationNotifier<AlterableGraphComponent, Edge> 
  1130       typedef AlterationNotifier<AlterableGraphComponent, Edge> 
   745       EdgeNotifier;
  1131       EdgeNotifier;
   746       /// The node observer registry.
       
   747       typedef AlterationNotifier<AlterableGraphComponent, Node> 
       
   748       NodeNotifier;
       
   749       
       
   750       /// \brief Gives back the edge alteration notifier.
       
   751       ///
       
   752       /// Gives back the edge alteration notifier.
       
   753       EdgeNotifier getNotifier(Edge) const {
       
   754 	return EdgeNotifier();
       
   755       }
       
   756       
  1132       
   757       /// \brief Gives back the node alteration notifier.
  1133       /// \brief Gives back the node alteration notifier.
   758       ///
  1134       ///
   759       /// Gives back the node alteration notifier.
  1135       /// Gives back the node alteration notifier.
   760       NodeNotifier getNotifier(Node) const {
  1136       NodeNotifier& getNotifier(Node) const {
   761 	return NodeNotifier();
  1137 	return NodeNotifier();
   762       }
  1138       }
   763       
  1139       
   764     };
  1140       /// \brief Gives back the edge alteration notifier.
   765 
  1141       ///
   766 
  1142       /// Gives back the edge alteration notifier.
   767     /// Class describing the concept of graph maps
  1143       EdgeNotifier& getNotifier(Edge) const {
   768 
  1144 	return EdgeNotifier();
       
  1145       }
       
  1146 
       
  1147       template <typename _Graph> 
       
  1148       struct Constraints {
       
  1149 	void constraints() {
       
  1150 	  checkConcept<Base, _Graph>();
       
  1151           typename _Graph::NodeNotifier& nn 
       
  1152             = graph.getNotifier(typename _Graph::Node());
       
  1153 
       
  1154           typename _Graph::EdgeNotifier& en 
       
  1155             = graph.getNotifier(typename _Graph::Edge());
       
  1156           
       
  1157           ignore_unused_variable_warning(nn);
       
  1158           ignore_unused_variable_warning(en);
       
  1159 	}
       
  1160 	
       
  1161 	const _Graph& graph;
       
  1162 	
       
  1163       };
       
  1164       
       
  1165     };
       
  1166 
       
  1167     /// \brief An empty alteration notifier undirected graph class.
       
  1168     ///  
       
  1169     /// This class provides beside the core graph features alteration
       
  1170     /// notifier interface for the graph structure.  This implements
       
  1171     /// an observer-notifier pattern for each graph item. More
       
  1172     /// obsevers can be registered into the notifier and whenever an
       
  1173     /// alteration occured in the graph all the observers will
       
  1174     /// notified about it.
       
  1175     template <typename _Base = BaseUGraphComponent>
       
  1176     class AlterableUGraphComponent : public AlterableGraphComponent<_Base> {
       
  1177     public:
       
  1178 
       
  1179       typedef _Base Base;
       
  1180       typedef typename Base::UEdge UEdge;
       
  1181 
       
  1182 
       
  1183       /// The edge observer registry.
       
  1184       typedef AlterationNotifier<AlterableUGraphComponent, UEdge> 
       
  1185       UEdgeNotifier;
       
  1186       
       
  1187       /// \brief Gives back the edge alteration notifier.
       
  1188       ///
       
  1189       /// Gives back the edge alteration notifier.
       
  1190       UEdgeNotifier& getNotifier(UEdge) const {
       
  1191 	return UEdgeNotifier();
       
  1192       }
       
  1193 
       
  1194       template <typename _Graph> 
       
  1195       struct Constraints {
       
  1196 	void constraints() {
       
  1197 	  checkConcept<Base, _Graph>();
       
  1198           checkConcept<AlterableGraphComponent, _Graph>();
       
  1199           typename _Graph::UEdgeNotifier& uen 
       
  1200             = graph.getNotifier(typename _Graph::UEdge());
       
  1201           ignore_unused_variable_warning(uen);
       
  1202 	}
       
  1203 	
       
  1204 	const _Graph& graph;
       
  1205 	
       
  1206       };
       
  1207       
       
  1208     };
       
  1209 
       
  1210 
       
  1211     /// \brief Class describing the concept of graph maps
       
  1212     /// 
   769     /// This class describes the common interface of the graph maps
  1213     /// This class describes the common interface of the graph maps
   770     /// (NodeMap, EdgeMap), that is \ref maps-page "maps" which can be used to
  1214     /// (NodeMap, EdgeMap), that is \ref maps-page "maps" which can be used to
   771     /// associate data to graph descriptors (nodes or edges).
  1215     /// associate data to graph descriptors (nodes or edges).
   772     template <typename Graph, typename Item, typename _Value>
  1216     template <typename _Graph, typename _Item, typename _Value>
   773     class GraphMap : public ReadWriteMap<Item, _Value> {
  1217     class GraphMap : public ReadWriteMap<_Item, _Value> {
   774     protected:      
  1218     public:
   775       GraphMap() {}
  1219 
   776     public:
  1220       typedef ReadWriteMap<_Item, _Value> Parent;
       
  1221 
       
  1222       /// The graph type of the map.
       
  1223       typedef _Graph Graph;
       
  1224       /// The key type of the map.
       
  1225       typedef _Item Key;
       
  1226       /// The value type of the map.
       
  1227       typedef _Value Value;
       
  1228 
   777       /// \brief Construct a new map.
  1229       /// \brief Construct a new map.
   778       ///
  1230       ///
   779       /// Construct a new map for the graph.
  1231       /// Construct a new map for the graph.
   780       explicit GraphMap(const Graph&) {}
  1232       explicit GraphMap(const Graph&) {}
   781       /// \brief Construct a new map with default value.
  1233       /// \brief Construct a new map with default value.
   782       ///
  1234       ///
   783       /// Construct a new map for the graph and initalise the values.
  1235       /// Construct a new map for the graph and initalise the values.
   784       GraphMap(const Graph&, const _Value&) {}
  1236       GraphMap(const Graph&, const Value&) {}
   785       /// \brief Copy constructor.
  1237       /// \brief Copy constructor.
   786       ///
  1238       ///
   787       /// Copy Constructor.
  1239       /// Copy Constructor.
   788       GraphMap(const GraphMap& gm) :ReadWriteMap<Item, _Value>(gm) {}
  1240       GraphMap(const GraphMap&) : Parent() {}
   789       
  1241       
   790       /// \brief Assign operator.
  1242       /// \brief Assign operator.
   791       ///
  1243       ///
   792       /// Assign operator.
  1244       /// Assign operator. It does not mofify the underlying graph,
   793       GraphMap& operator=(const GraphMap&) { return *this;}
  1245       /// it just iterates on the current item set and set the  map
       
  1246       /// with the value returned by the assigned map. 
       
  1247       template <typename CMap>
       
  1248       GraphMap& operator=(const CMap&) { 
       
  1249         checkConcept<ReadMap<Key, Value>, CMap>();
       
  1250         return *this;
       
  1251       }
   794 
  1252 
   795       template<typename _Map>
  1253       template<typename _Map>
   796       struct Constraints {
  1254       struct Constraints {
   797 	void constraints() {
  1255 	void constraints() {
   798 	  checkConcept<ReadWriteMap<Item, _Value>, _Map >();
  1256 	  checkConcept<ReadWriteMap<Key, Value>, _Map >();
   799 	  // Construction with a graph parameter
  1257 	  // Construction with a graph parameter
   800 	  _Map a(g);
  1258 	  _Map a(g);
   801 	  // Constructor with a graph and a default value parameter
  1259 	  // Constructor with a graph and a default value parameter
   802 	  _Map a2(g,t);
  1260 	  _Map a2(g,t);
   803 	  // Copy constructor. Do we need it?
  1261 	  // Copy constructor.
   804 	  _Map b=c;
  1262 	  _Map b(c);
       
  1263           
       
  1264           ReadMap<Key, Value> cmap;
       
  1265           b = cmap;
   805 
  1266 
   806 	  ignore_unused_variable_warning(a2);
  1267 	  ignore_unused_variable_warning(a2);
       
  1268 	  ignore_unused_variable_warning(b);
   807 	}
  1269 	}
   808 
  1270 
   809 	const _Map &c;
  1271 	const _Map &c;
   810 	const Graph &g;
  1272 	const Graph &g;
   811 	const typename GraphMap::Value &t;
  1273 	const typename GraphMap::Value &t;
   812       };
  1274       };
   813 
  1275 
   814     };
  1276     };
   815 
  1277 
   816     /// An empty mappable base graph class.
  1278     /// \brief An empty mappable graph class.
   817   
  1279     ///
   818     /// This class provides beside the core graph features
  1280     /// This class provides beside the core graph features
   819     /// map interface for the graph structure.
  1281     /// map interface for the graph structure.
   820     /// This concept is part of the GraphConcept.
  1282     /// This concept is part of the Graph concept.
   821     class MappableGraphComponent : virtual public BaseGraphComponent {
  1283     template <typename _Base = BaseGraphComponent>
   822     public:
  1284     class MappableGraphComponent : public _Base  {
       
  1285     public:
       
  1286 
       
  1287       typedef _Base Base;
       
  1288       typedef typename Base::Node Node;
       
  1289       typedef typename Base::Edge Edge;
   823 
  1290 
   824       typedef MappableGraphComponent Graph;
  1291       typedef MappableGraphComponent Graph;
   825 
  1292 
   826       typedef BaseGraphComponent::Node Node;
  1293       /// \brief ReadWrite map of the nodes.
   827       typedef BaseGraphComponent::Edge Edge;
  1294       ///
   828 
       
   829       /// ReadWrite map of the nodes.
  1295       /// ReadWrite map of the nodes.
   830     
  1296       ///
   831       /// ReadWrite map of the nodes.
  1297       template <typename Value>
   832       ///
  1298       class NodeMap : public GraphMap<Graph, Node, Value> {
   833       template <typename _Value>
       
   834       class NodeMap : public GraphMap<Graph, Node, _Value> {
       
   835       private:
  1299       private:
   836 	NodeMap();
  1300 	NodeMap();
   837       public:
  1301       public:
       
  1302         typedef GraphMap<Graph, Node, Value> Parent;
       
  1303 
   838 	/// \brief Construct a new map.
  1304 	/// \brief Construct a new map.
   839 	///
  1305 	///
   840 	/// Construct a new map for the graph.
  1306 	/// Construct a new map for the graph.
   841 	/// \todo call the right parent class constructor
  1307 	/// \todo call the right parent class constructor
   842 	explicit NodeMap(const Graph&) {}
  1308 	explicit NodeMap(const Graph& graph) : Parent(graph) {}
       
  1309 
   843 	/// \brief Construct a new map with default value.
  1310 	/// \brief Construct a new map with default value.
   844 	///
  1311 	///
   845 	/// Construct a new map for the graph and initalise the values.
  1312 	/// Construct a new map for the graph and initalise the values.
   846 	NodeMap(const Graph&, const _Value&) {}
  1313 	NodeMap(const Graph& graph, const Value& value)
       
  1314           : Parent(graph, value) {}
       
  1315 
   847 	/// \brief Copy constructor.
  1316 	/// \brief Copy constructor.
   848 	///
  1317 	///
   849 	/// Copy Constructor.
  1318 	/// Copy Constructor.
   850 	NodeMap(const NodeMap& nm) : GraphMap<Graph, Node, _Value>(nm) {}
  1319 	NodeMap(const NodeMap& nm) : Parent(nm) {}
   851 
  1320 
   852 	/// \brief Assign operator.
  1321 	/// \brief Assign operator.
   853 	///
  1322 	///
   854 	/// Assign operator.
  1323 	/// Assign operator.
   855 	NodeMap& operator=(const NodeMap&) { return *this;}
  1324         template <typename CMap>
   856 
  1325         NodeMap& operator=(const CMap&) { 
   857       };
  1326           checkConcept<ReadMap<Node, Value>, CMap>();
   858 
  1327           return *this;
       
  1328         }
       
  1329 
       
  1330       };
       
  1331 
       
  1332       /// \brief ReadWrite map of the edges.
       
  1333       ///
   859       /// ReadWrite map of the edges.
  1334       /// ReadWrite map of the edges.
   860     
  1335       ///
   861       /// ReadWrite map of the edges.
  1336       template <typename Value>
   862       ///
  1337       class EdgeMap : public GraphMap<Graph, Edge, Value> {
   863       template <typename _Value>
       
   864       class EdgeMap : public GraphMap<Graph, Edge, _Value> {
       
   865       private:
  1338       private:
   866 	EdgeMap();
  1339 	EdgeMap();
   867       public:
  1340       public:
       
  1341         typedef GraphMap<Graph, Edge, Value> Parent;
       
  1342 
   868 	/// \brief Construct a new map.
  1343 	/// \brief Construct a new map.
   869 	///
  1344 	///
   870 	/// Construct a new map for the graph.
  1345 	/// Construct a new map for the graph.
   871 	/// \todo call the right parent class constructor
  1346 	/// \todo call the right parent class constructor
   872 	explicit EdgeMap(const Graph&) {}
  1347 	explicit EdgeMap(const Graph& graph) : Parent(graph) {}
       
  1348 
   873 	/// \brief Construct a new map with default value.
  1349 	/// \brief Construct a new map with default value.
   874 	///
  1350 	///
   875 	/// Construct a new map for the graph and initalise the values.
  1351 	/// Construct a new map for the graph and initalise the values.
   876 	EdgeMap(const Graph&, const _Value&) {}
  1352 	EdgeMap(const Graph& graph, const Value& value)
       
  1353           : Parent(graph, value) {}
       
  1354 
   877 	/// \brief Copy constructor.
  1355 	/// \brief Copy constructor.
   878 	///
  1356 	///
   879 	/// Copy Constructor.
  1357 	/// Copy Constructor.
   880 	EdgeMap(const EdgeMap& em) :GraphMap<Graph, Edge, _Value>(em) {}
  1358 	EdgeMap(const EdgeMap& nm) : Parent(nm) {}
   881 
  1359 
   882 	/// \brief Assign operator.
  1360 	/// \brief Assign operator.
   883 	///
  1361 	///
   884 	/// Assign operator.
  1362 	/// Assign operator.
   885 	EdgeMap& operator=(const EdgeMap&) { return *this;}
  1363         template <typename CMap>
   886 
  1364         EdgeMap& operator=(const CMap&) { 
   887       };
  1365           checkConcept<ReadMap<Edge, Value>, CMap>();
   888 
  1366           return *this;
   889       template <typename _Graph>
  1367         }
   890       struct Constraints {
  1368 
   891 
  1369       };
   892 	struct Type {
  1370 
       
  1371 
       
  1372       template <typename _Graph>
       
  1373       struct Constraints {
       
  1374 
       
  1375 	struct Dummy {
   893 	  int value;
  1376 	  int value;
   894 	  Type() : value(0) {}
  1377 	  Dummy() : value(0) {}
   895 	  Type(int _v) : value(_v) {}
  1378 	  Dummy(int _v) : value(_v) {}
   896 	};
  1379 	};
   897 
  1380 
   898 	void constraints() {
  1381 	void constraints() {
   899 	  checkConcept<BaseGraphComponent, _Graph>();
  1382 	  checkConcept<Base, _Graph>();
   900 	  { // int map test
  1383 	  { // int map test
   901 	    typedef typename _Graph::template NodeMap<int> IntNodeMap;
  1384 	    typedef typename _Graph::template NodeMap<int> IntNodeMap;
   902 	    checkConcept<GraphMap<_Graph, typename _Graph::Node, int>, 
  1385 	    checkConcept<GraphMap<_Graph, typename _Graph::Node, int>, 
   903 	      IntNodeMap >();
  1386 	      IntNodeMap >();
   904 	  } { // bool map test
  1387 	  } { // bool map test
   905 	    typedef typename _Graph::template NodeMap<bool> BoolNodeMap;
  1388 	    typedef typename _Graph::template NodeMap<bool> BoolNodeMap;
   906 	    checkConcept<GraphMap<_Graph, typename _Graph::Node, bool>,
  1389 	    checkConcept<GraphMap<_Graph, typename _Graph::Node, bool>,
   907 	      BoolNodeMap >();
  1390 	      BoolNodeMap >();
   908 	  } { // Type map test
  1391 	  } { // Dummy map test
   909 	    typedef typename _Graph::template NodeMap<Type> TypeNodeMap;
  1392 	    typedef typename _Graph::template NodeMap<Dummy> DummyNodeMap;
   910 	    checkConcept<GraphMap<_Graph, typename _Graph::Node, Type>,
  1393 	    checkConcept<GraphMap<_Graph, typename _Graph::Node, Dummy>,
   911 	      TypeNodeMap >();
  1394 	      DummyNodeMap >();
   912 	  } 
  1395 	  } 
   913 
  1396 
   914 	  { // int map test
  1397 	  { // int map test
   915 	    typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
  1398 	    typedef typename _Graph::template EdgeMap<int> IntEdgeMap;
   916 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
  1399 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, int>,
   917 	      IntEdgeMap >();
  1400 	      IntEdgeMap >();
   918 	  } { // bool map test
  1401 	  } { // bool map test
   919 	    typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
  1402 	    typedef typename _Graph::template EdgeMap<bool> BoolEdgeMap;
   920 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
  1403 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, bool>,
   921 	      BoolEdgeMap >();
  1404 	      BoolEdgeMap >();
   922 	  } { // Type map test
  1405 	  } { // Dummy map test
   923 	    typedef typename _Graph::template EdgeMap<Type> TypeEdgeMap;
  1406 	    typedef typename _Graph::template EdgeMap<Dummy> DummyEdgeMap;
   924 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, Type>, 
  1407 	    checkConcept<GraphMap<_Graph, typename _Graph::Edge, Dummy>, 
   925 	      TypeEdgeMap >();
  1408 	      DummyEdgeMap >();
   926 	  } 
  1409 	  } 
   927 	}
  1410 	}
   928 
  1411 
   929 	_Graph& graph;
  1412 	_Graph& graph;
   930       };
  1413       };
   931     };
  1414     };
   932 
  1415 
   933 
  1416     /// \brief An empty mappable base graph class.
   934 //     /// Skeleton class which describes an edge with direction in \ref
  1417     ///
   935 //     /// UGraph "undirected graph".
  1418     /// This class provides beside the core graph features
   936     template <typename UGraph>
  1419     /// map interface for the graph structure.
   937     class UGraphEdge : public UGraph::UEdge {
  1420     /// This concept is part of the UGraph concept.
   938       typedef typename UGraph::UEdge UEdge;
  1421     template <typename _Base = BaseUGraphComponent>
   939       typedef typename UGraph::Node Node;
  1422     class MappableUGraphComponent : public MappableGraphComponent<_Base>  {
   940     public:
  1423     public:
   941 
  1424 
   942       /// \e
  1425       typedef _Base Base;
   943       UGraphEdge() {}
  1426       typedef typename Base::UEdge UEdge;
   944 
  1427 
   945       /// \e
  1428       typedef MappableUGraphComponent Graph;
   946       UGraphEdge(const UGraphEdge& e) : UGraph::UEdge(e) {}
  1429 
   947 
  1430       /// \brief ReadWrite map of the uedges.
   948       /// \e
  1431       ///
   949       UGraphEdge(Invalid) {}
  1432       /// ReadWrite map of the uedges.
   950 
  1433       ///
   951       /// \brief Directed edge from undirected edge and a source node.
  1434       template <typename Value>
   952       ///
  1435       class UEdgeMap : public GraphMap<Graph, UEdge, Value> {  
   953       /// Constructs a directed edge from undirected edge and a source node.
  1436       public:
   954       ///
  1437         typedef GraphMap<Graph, UEdge, Value> Parent;
   955       /// \note You have to specify the graph for this constructor.
  1438 
   956       UGraphEdge(const UGraph &g,
  1439 	/// \brief Construct a new map.
   957 		     UEdge u_edge, Node n) {
  1440 	///
   958 	ignore_unused_variable_warning(u_edge);
  1441 	/// Construct a new map for the graph.
   959 	ignore_unused_variable_warning(g);
  1442 	/// \todo call the right parent class constructor
   960 	ignore_unused_variable_warning(n);
  1443 	explicit UEdgeMap(const Graph& graph) : Parent(graph) {}
   961       }
  1444 
   962 
  1445 	/// \brief Construct a new map with default value.
   963       /// \e
  1446 	///
   964       UGraphEdge& operator=(UGraphEdge) { return *this; }
  1447 	/// Construct a new map for the graph and initalise the values.
   965 
  1448 	UEdgeMap(const Graph& graph, const Value& value)
   966       /// \e
  1449           : Parent(graph, value) {}
   967       bool operator==(UGraphEdge) const { return true; }
  1450 
   968       /// \e
  1451 	/// \brief Copy constructor.
   969       bool operator!=(UGraphEdge) const { return false; }
  1452 	///
   970 
  1453 	/// Copy Constructor.
   971       /// \e
  1454 	UEdgeMap(const UEdgeMap& nm) : Parent(nm) {}
   972       bool operator<(UGraphEdge) const { return false; }
  1455 
   973 
  1456 	/// \brief Assign operator.
   974       template <typename Edge>
  1457 	///
   975       struct Constraints {
  1458 	/// Assign operator.
   976 	void constraints() {
  1459         template <typename CMap>
   977 	  const_constraints();
  1460         UEdgeMap& operator=(const CMap&) { 
   978 	}
  1461           checkConcept<ReadMap<UEdge, Value>, CMap>();
   979 	void const_constraints() const {
  1462           return *this;
   980 	  /// \bug This should be is_base_and_derived ...
  1463         }
   981 	  UEdge ue = e;
  1464 
   982 	  ue = e;
  1465       };
   983 
  1466 
   984 	  Edge e_with_source(graph,ue,n);
  1467 
   985 	  ignore_unused_variable_warning(e_with_source);
  1468       template <typename _Graph>
   986 	}
       
   987 	Edge e;
       
   988 	UEdge ue;
       
   989 	UGraph graph;
       
   990 	Node n;
       
   991       };
       
   992     };
       
   993     
       
   994 
       
   995     struct BaseIterableUGraphConcept {
       
   996 
       
   997       template <typename Graph>
       
   998       struct Constraints {
       
   999 
       
  1000 	typedef typename Graph::UEdge UEdge;
       
  1001 	typedef typename Graph::Edge Edge;
       
  1002 	typedef typename Graph::Node Node;
       
  1003 
       
  1004 	void constraints() {
       
  1005 	  checkConcept<BaseIterableGraphComponent, Graph>();
       
  1006 	  checkConcept<GraphItem<>, UEdge>();
       
  1007 	  //checkConcept<UGraphEdge<Graph>, Edge>();
       
  1008 
       
  1009 	  graph.first(ue);
       
  1010 	  graph.next(ue);
       
  1011 
       
  1012 	  const_constraints();
       
  1013 	}
       
  1014 	void const_constraints() {
       
  1015 	  Node n;
       
  1016 	  n = graph.target(ue);
       
  1017 	  n = graph.source(ue);
       
  1018 	  n = graph.oppositeNode(n0, ue);
       
  1019 
       
  1020 	  bool b;
       
  1021 	  b = graph.direction(e);
       
  1022 	  Edge e = graph.direct(UEdge(), true);
       
  1023 	  e = graph.direct(UEdge(), n);
       
  1024  
       
  1025 	  ignore_unused_variable_warning(b);
       
  1026 	}
       
  1027 
       
  1028 	Graph graph;
       
  1029 	Edge e;
       
  1030 	Node n0;
       
  1031 	UEdge ue;
       
  1032       };
       
  1033 
       
  1034     };
       
  1035 
       
  1036 
       
  1037     struct IterableUGraphConcept {
       
  1038 
       
  1039       template <typename Graph>
       
  1040       struct Constraints {
       
  1041 	void constraints() {
       
  1042 	  /// \todo we don't need the iterable component to be base iterable
       
  1043 	  /// Don't we really???
       
  1044 	  //checkConcept< BaseIterableUGraphConcept, Graph > ();
       
  1045 
       
  1046 	  checkConcept<IterableGraphComponent, Graph> ();
       
  1047 
       
  1048 	  typedef typename Graph::UEdge UEdge;
       
  1049 	  typedef typename Graph::UEdgeIt UEdgeIt;
       
  1050 	  typedef typename Graph::IncEdgeIt IncEdgeIt;
       
  1051 
       
  1052 	  checkConcept<GraphIterator<Graph, UEdge>, UEdgeIt>();
       
  1053 	  checkConcept<GraphIncIterator<Graph, UEdge>, IncEdgeIt>();
       
  1054 	}
       
  1055       };
       
  1056 
       
  1057     };
       
  1058 
       
  1059     struct MappableUGraphConcept {
       
  1060 
       
  1061       template <typename Graph>
       
  1062       struct Constraints {
  1469       struct Constraints {
  1063 
  1470 
  1064 	struct Dummy {
  1471 	struct Dummy {
  1065 	  int value;
  1472 	  int value;
  1066 	  Dummy() : value(0) {}
  1473 	  Dummy() : value(0) {}
  1067 	  Dummy(int _v) : value(_v) {}
  1474 	  Dummy(int _v) : value(_v) {}
  1068 	};
  1475 	};
  1069 
  1476 
  1070 	void constraints() {
  1477 	void constraints() {
  1071 	  checkConcept<MappableGraphComponent, Graph>();
  1478 	  checkConcept<Base, _Graph>();
  1072 
  1479 	  checkConcept<MappableGraphComponent<Base>, _Graph>();
  1073 	  typedef typename Graph::template UEdgeMap<int> IntMap;
  1480 
  1074 	  checkConcept<GraphMap<Graph, typename Graph::UEdge, int>,
  1481 	  { // int map test
  1075 	    IntMap >();
  1482 	    typedef typename _Graph::template UEdgeMap<int> IntUEdgeMap;
  1076 
  1483 	    checkConcept<GraphMap<_Graph, typename _Graph::UEdge, int>,
  1077 	  typedef typename Graph::template UEdgeMap<bool> BoolMap;
  1484 	      IntUEdgeMap >();
  1078 	  checkConcept<GraphMap<Graph, typename Graph::UEdge, bool>,
  1485 	  } { // bool map test
  1079 	    BoolMap >();
  1486 	    typedef typename _Graph::template UEdgeMap<bool> BoolUEdgeMap;
  1080 
  1487 	    checkConcept<GraphMap<_Graph, typename _Graph::UEdge, bool>,
  1081 	  typedef typename Graph::template UEdgeMap<Dummy> DummyMap;
  1488 	      BoolUEdgeMap >();
  1082 	  checkConcept<GraphMap<Graph, typename Graph::UEdge, Dummy>,
  1489 	  } { // Dummy map test
  1083 	    DummyMap >();
  1490 	    typedef typename _Graph::template UEdgeMap<Dummy> DummyUEdgeMap;
  1084 	}
  1491 	    checkConcept<GraphMap<_Graph, typename _Graph::UEdge, Dummy>, 
  1085       };
  1492 	      DummyUEdgeMap >();
  1086 
  1493 	  } 
       
  1494 	}
       
  1495 
       
  1496 	_Graph& graph;
       
  1497       };
       
  1498     };
       
  1499 
       
  1500 
       
  1501     /// \brief An empty extendable graph class.
       
  1502     ///
       
  1503     /// This class provides beside the core graph features graph
       
  1504     /// extendable interface for the graph structure.  The main
       
  1505     /// difference between the base and this interface is that the
       
  1506     /// graph alterations should handled already on this level.
       
  1507     template <typename _Base = BaseGraphComponent>
       
  1508     class ExtendableGraphComponent : public _Base {
       
  1509     public:
       
  1510 
       
  1511       typedef typename _Base::Node Node;
       
  1512       typedef typename _Base::Edge Edge;
       
  1513 
       
  1514       /// \brief Adds a new node to the graph.
       
  1515       ///
       
  1516       /// Adds a new node to the graph.
       
  1517       ///
       
  1518       Node addNode() {
       
  1519 	return INVALID;
       
  1520       }
       
  1521     
       
  1522       /// \brief Adds a new edge connects the given two nodes.
       
  1523       ///
       
  1524       /// Adds a new edge connects the the given two nodes.
       
  1525       Edge addEdge(const Node&, const Node&) {
       
  1526 	return INVALID;
       
  1527       }
       
  1528 
       
  1529       template <typename _Graph>
       
  1530       struct Constraints {
       
  1531 	void constraints() {
       
  1532 	  typename _Graph::Node node_a, node_b;
       
  1533 	  node_a = graph.addNode();
       
  1534 	  node_b = graph.addNode();
       
  1535 	  typename _Graph::Edge edge;
       
  1536 	  edge = graph.addEdge(node_a, node_b);
       
  1537 	}
       
  1538 
       
  1539 	_Graph& graph;
       
  1540       };
       
  1541     };
       
  1542 
       
  1543     /// \brief An empty extendable base undirected graph class.
       
  1544     ///
       
  1545     /// This class provides beside the core undirected graph features
       
  1546     /// core undircted graph extend interface for the graph structure.
       
  1547     /// The main difference between the base and this interface is
       
  1548     /// that the graph alterations should handled already on this
       
  1549     /// level.
       
  1550     template <typename _Base = BaseUGraphComponent>
       
  1551     class ExtendableUGraphComponent : public _Base {
       
  1552     public:
       
  1553 
       
  1554       typedef typename _Base::Node Node;
       
  1555       typedef typename _Base::UEdge UEdge;
       
  1556 
       
  1557       /// \brief Adds a new node to the graph.
       
  1558       ///
       
  1559       /// Adds a new node to the graph.
       
  1560       ///
       
  1561       Node addNode() {
       
  1562 	return INVALID;
       
  1563       }
       
  1564     
       
  1565       /// \brief Adds a new edge connects the given two nodes.
       
  1566       ///
       
  1567       /// Adds a new edge connects the the given two nodes.
       
  1568       UEdge addEdge(const Node&, const Node&) {
       
  1569 	return INVALID;
       
  1570       }
       
  1571 
       
  1572       template <typename _Graph>
       
  1573       struct Constraints {
       
  1574 	void constraints() {
       
  1575 	  typename _Graph::Node node_a, node_b;
       
  1576 	  node_a = graph.addNode();
       
  1577 	  node_b = graph.addNode();
       
  1578 	  typename _Graph::UEdge uedge;
       
  1579 	  uedge = graph.addUEdge(node_a, node_b);
       
  1580 	}
       
  1581 
       
  1582 	_Graph& graph;
       
  1583       };
       
  1584     };
       
  1585 
       
  1586     /// \brief An empty erasable graph class.
       
  1587     ///  
       
  1588     /// This class provides beside the core graph features core erase
       
  1589     /// functions for the graph structure. The main difference between
       
  1590     /// the base and this interface is that the graph alterations
       
  1591     /// should handled already on this level.
       
  1592     template <typename _Base = BaseGraphComponent>
       
  1593     class ErasableGraphComponent : public _Base {
       
  1594     public:
       
  1595 
       
  1596       typedef _Base Base;
       
  1597       typedef typename Base::Node Node;
       
  1598       typedef typename Base::Edge Edge;
       
  1599 
       
  1600       /// \brief Erase a node from the graph.
       
  1601       ///
       
  1602       /// Erase a node from the graph. This function should 
       
  1603       /// erase all edges connecting to the node.
       
  1604       void erase(const Node&) {}    
       
  1605 
       
  1606       /// \brief Erase an edge from the graph.
       
  1607       ///
       
  1608       /// Erase an edge from the graph.
       
  1609       ///
       
  1610       void erase(const Edge&) {}
       
  1611 
       
  1612       template <typename _Graph>
       
  1613       struct Constraints {
       
  1614 	void constraints() {
       
  1615 	  typename _Graph::Node node;
       
  1616 	  graph.erase(node);
       
  1617 	  typename _Graph::Edge edge;
       
  1618 	  graph.erase(edge);
       
  1619 	}
       
  1620 
       
  1621 	_Graph& graph;
       
  1622       };
       
  1623     };
       
  1624 
       
  1625     /// \brief An empty erasable base undirected graph class.
       
  1626     ///  
       
  1627     /// This class provides beside the core undirected graph features
       
  1628     /// core erase functions for the undirceted graph structure. The
       
  1629     /// main difference between the base and this interface is that
       
  1630     /// the graph alterations should handled already on this level.
       
  1631     template <typename _Base = BaseUGraphComponent>
       
  1632     class ErasableUGraphComponent : public _Base {
       
  1633     public:
       
  1634 
       
  1635       typedef _Base Base;
       
  1636       typedef typename Base::Node Node;
       
  1637       typedef typename Base::UEdge UEdge;
       
  1638 
       
  1639       /// \brief Erase a node from the graph.
       
  1640       ///
       
  1641       /// Erase a node from the graph. This function should erase
       
  1642       /// edges connecting to the node.
       
  1643       void erase(const Node&) {}    
       
  1644 
       
  1645       /// \brief Erase an edge from the graph.
       
  1646       ///
       
  1647       /// Erase an edge from the graph.
       
  1648       ///
       
  1649       void erase(const UEdge&) {}
       
  1650 
       
  1651       template <typename _Graph>
       
  1652       struct Constraints {
       
  1653 	void constraints() {
       
  1654 	  typename _Graph::Node node;
       
  1655 	  graph.erase(node);
       
  1656 	  typename _Graph::Edge edge;
       
  1657 	  graph.erase(edge);
       
  1658 	}
       
  1659 
       
  1660 	_Graph& graph;
       
  1661       };
       
  1662     };
       
  1663 
       
  1664     /// \brief An empty clearable base graph class.
       
  1665     ///
       
  1666     /// This class provides beside the core graph features core clear
       
  1667     /// functions for the graph structure. The main difference between
       
  1668     /// the base and this interface is that the graph alterations
       
  1669     /// should handled already on this level.
       
  1670     template <typename _Base = BaseGraphComponent>
       
  1671     class ClearableGraphComponent : public _Base {
       
  1672     public:
       
  1673 
       
  1674       /// \brief Erase all nodes and edges from the graph.
       
  1675       ///
       
  1676       /// Erase all nodes and edges from the graph.
       
  1677       ///
       
  1678       void clear() {}    
       
  1679 
       
  1680       template <typename _Graph>
       
  1681       struct Constraints {
       
  1682 	void constraints() {
       
  1683 	  graph.clear();
       
  1684 	}
       
  1685 
       
  1686 	_Graph graph;
       
  1687       };
       
  1688     };
       
  1689 
       
  1690     /// \brief An empty clearable base undirected graph class.
       
  1691     ///
       
  1692     /// This class provides beside the core undirected graph features
       
  1693     /// core clear functions for the undirected graph structure. The
       
  1694     /// main difference between the base and this interface is that
       
  1695     /// the graph alterations should handled already on this level.
       
  1696     template <typename _Base = BaseUGraphComponent>
       
  1697     class ClearableUGraphComponent : public _Base {
       
  1698     public:
       
  1699 
       
  1700       /// \brief Erase all nodes and undirected edges from the graph.
       
  1701       ///
       
  1702       /// Erase all nodes and undirected edges from the graph.
       
  1703       ///
       
  1704       void clear() {}    
       
  1705 
       
  1706       template <typename _Graph>
       
  1707       struct Constraints {
       
  1708 	void constraints() {
       
  1709 	  graph.clear();
       
  1710 	}
       
  1711 
       
  1712 	_Graph graph;
       
  1713       };
  1087     };
  1714     };
  1088 
  1715 
  1089   }
  1716   }
  1090 
  1717 
  1091 }
  1718 }