src/lemon/concept/graph.h
author klao
Wed, 05 Jan 2005 14:34:00 +0000
changeset 1053 90f8696360b2
parent 989 ca95f8b5c931
child 1136 8d066154b66a
permissions -rw-r--r--
UndirGraphs: invalid edge bug
     1 /* -*- C++ -*-
     2  * src/lemon/concept/graph.h - Part of LEMON, a generic C++ optimization library
     3  *
     4  * Copyright (C) 2004 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     5  * (Egervary Combinatorial Optimization Research Group, EGRES).
     6  *
     7  * Permission to use, modify and distribute this software is granted
     8  * provided that this copyright notice appears in all copies. For
     9  * precise terms see the accompanying LICENSE file.
    10  *
    11  * This software is provided "AS IS" with no warranty of any kind,
    12  * express or implied, and with no claim as to its suitability for any
    13  * purpose.
    14  *
    15  */
    16 
    17 #ifndef LEMON_CONCEPT_GRAPH_H
    18 #define LEMON_CONCEPT_GRAPH_H
    19 
    20 ///\ingroup graph_concepts
    21 ///\file
    22 ///\brief Declaration of Graph.
    23 
    24 #include <lemon/invalid.h>
    25 #include <lemon/concept/maps.h>
    26 #include <lemon/concept_check.h>
    27 #include <lemon/concept/graph_component.h>
    28 
    29 namespace lemon {
    30   namespace concept {
    31     
    32     /// \addtogroup graph_concepts
    33     /// @{
    34 
    35 //     /// An empty static graph class.
    36   
    37 //     /// This class provides all the common features of a graph structure,
    38 //     /// however completely without implementations and real data structures
    39 //     /// behind the interface.
    40 //     /// All graph algorithms should compile with this class, but it will not
    41 //     /// run properly, of course.
    42 //     ///
    43 //     /// It can be used for checking the interface compatibility,
    44 //     /// or it can serve as a skeleton of a new graph structure.
    45 //     /// 
    46 //     /// Also, you will find here the full documentation of a certain graph
    47 //     /// feature, the documentation of a real graph imlementation
    48 //     /// like @ref ListGraph or
    49 //     /// @ref SmartGraph will just refer to this structure.
    50 //     ///
    51 //     /// \todo A pages describing the concept of concept description would
    52 //     /// be nice.
    53 //     class StaticGraph
    54 //     {
    55 //     public:
    56 //       /// Defalult constructor.
    57 
    58 //       /// Defalult constructor.
    59 //       ///
    60 //       StaticGraph() { }
    61 //       ///Copy consructor.
    62 
    63 // //       ///\todo It is not clear, what we expect from a copy constructor.
    64 // //       ///E.g. How to assign the nodes/edges to each other? What about maps?
    65 // //       StaticGraph(const StaticGraph& g) { }
    66 
    67 //       /// The base type of node iterators, 
    68 //       /// or in other words, the trivial node iterator.
    69 
    70 //       /// This is the base type of each node iterator,
    71 //       /// thus each kind of node iterator converts to this.
    72 //       /// More precisely each kind of node iterator should be inherited 
    73 //       /// from the trivial node iterator.
    74 //       class Node {
    75 //       public:
    76 // 	/// Default constructor
    77 
    78 // 	/// @warning The default constructor sets the iterator
    79 // 	/// to an undefined value.
    80 // 	Node() { }
    81 // 	/// Copy constructor.
    82 
    83 // 	/// Copy constructor.
    84 // 	///
    85 // 	Node(const Node&) { }
    86 
    87 // 	/// Invalid constructor \& conversion.
    88 
    89 // 	/// This constructor initializes the iterator to be invalid.
    90 // 	/// \sa Invalid for more details.
    91 // 	Node(Invalid) { }
    92 // 	/// Equality operator
    93 
    94 // 	/// Two iterators are equal if and only if they point to the
    95 // 	/// same object or both are invalid.
    96 // 	bool operator==(Node) const { return true; }
    97 
    98 // 	/// Inequality operator
    99 	
   100 // 	/// \sa operator==(Node n)
   101 // 	///
   102 // 	bool operator!=(Node) const { return true; }
   103 
   104 //       };
   105     
   106 //       /// This iterator goes through each node.
   107 
   108 //       /// This iterator goes through each node.
   109 //       /// Its usage is quite simple, for example you can count the number
   110 //       /// of nodes in graph \c g of type \c Graph like this:
   111 //       /// \code
   112 //       /// int count=0;
   113 //       /// for (Graph::NodeIt n(g); n!=INVALID ++n) ++count;
   114 //       /// \endcode
   115 //       class NodeIt : public Node {
   116 //       public:
   117 // 	/// Default constructor
   118 
   119 // 	/// @warning The default constructor sets the iterator
   120 // 	/// to an undefined value.
   121 // 	NodeIt() { }
   122 // 	/// Copy constructor.
   123 	
   124 // 	/// Copy constructor.
   125 // 	///
   126 // 	NodeIt(const NodeIt&) { }
   127 // 	/// Invalid constructor \& conversion.
   128 
   129 // 	/// Initialize the iterator to be invalid.
   130 // 	/// \sa Invalid for more details.
   131 // 	NodeIt(Invalid) { }
   132 // 	/// Sets the iterator to the first node.
   133 
   134 // 	/// Sets the iterator to the first node of \c g.
   135 // 	///
   136 // 	NodeIt(const StaticGraph& g) { }
   137 // 	/// Node -> NodeIt conversion.
   138 
   139 // 	/// Sets the iterator to the node of \c g pointed by the trivial 
   140 // 	/// iterator n.
   141 // 	/// This feature necessitates that each time we 
   142 // 	/// iterate the edge-set, the iteration order is the same.
   143 // 	NodeIt(const StaticGraph& g, const Node& n) { }
   144 // 	/// Next node.
   145 
   146 // 	/// Assign the iterator to the next node.
   147 // 	///
   148 // 	NodeIt& operator++() { return *this; }
   149 //       };
   150     
   151     
   152 //       /// The base type of the edge iterators.
   153 
   154 //       /// The base type of the edge iterators.
   155 //       ///
   156 //       class Edge {
   157 //       public:
   158 // 	/// Default constructor
   159 
   160 // 	/// @warning The default constructor sets the iterator
   161 // 	/// to an undefined value.
   162 // 	Edge() { }
   163 // 	/// Copy constructor.
   164 
   165 // 	/// Copy constructor.
   166 // 	///
   167 // 	Edge(const Edge&) { }
   168 // 	/// Initialize the iterator to be invalid.
   169 
   170 // 	/// Initialize the iterator to be invalid.
   171 // 	///
   172 // 	Edge(Invalid) { }
   173 // 	/// Equality operator
   174 
   175 // 	/// Two iterators are equal if and only if they point to the
   176 // 	/// same object or both are invalid.
   177 // 	bool operator==(Edge) const { return true; }
   178 // 	/// Inequality operator
   179 
   180 // 	/// \sa operator==(Node n)
   181 // 	///
   182 // 	bool operator!=(Edge) const { return true; }
   183 //       };
   184     
   185 //       /// This iterator goes trough the outgoing edges of a node.
   186 
   187 //       /// This iterator goes trough the \e outgoing edges of a certain node
   188 //       /// of a graph.
   189 //       /// Its usage is quite simple, for example you can count the number
   190 //       /// of outgoing edges of a node \c n
   191 //       /// in graph \c g of type \c Graph as follows.
   192 //       /// \code
   193 //       /// int count=0;
   194 //       /// for (Graph::OutEdgeIt e(g, n); e!=INVALID; ++e) ++count;
   195 //       /// \endcode
   196     
   197 //       class OutEdgeIt : public Edge {
   198 //       public:
   199 // 	/// Default constructor
   200 
   201 // 	/// @warning The default constructor sets the iterator
   202 // 	/// to an undefined value.
   203 // 	OutEdgeIt() { }
   204 // 	/// Copy constructor.
   205 
   206 // 	/// Copy constructor.
   207 // 	///
   208 // 	OutEdgeIt(const OutEdgeIt&) { }
   209 // 	/// Initialize the iterator to be invalid.
   210 
   211 // 	/// Initialize the iterator to be invalid.
   212 // 	///
   213 // 	OutEdgeIt(Invalid) { }
   214 // 	/// This constructor sets the iterator to first outgoing edge.
   215     
   216 // 	/// This constructor set the iterator to the first outgoing edge of
   217 // 	/// node
   218 // 	///@param n the node
   219 // 	///@param g the graph
   220 // 	OutEdgeIt(const StaticGraph& g, const Node& n) { }
   221 // 	/// Edge -> OutEdgeIt conversion
   222 
   223 // 	/// Sets the iterator to the value of the trivial iterator \c e.
   224 // 	/// This feature necessitates that each time we 
   225 // 	/// iterate the edge-set, the iteration order is the same.
   226 // 	OutEdgeIt(const StaticGraph& g, const Edge& e) { }
   227 // 	///Next outgoing edge
   228 	
   229 // 	/// Assign the iterator to the next 
   230 // 	/// outgoing edge of the corresponding node.
   231 // 	OutEdgeIt& operator++() { return *this; }
   232 //       };
   233 
   234 //       /// This iterator goes trough the incoming edges of a node.
   235 
   236 //       /// This iterator goes trough the \e incoming edges of a certain node
   237 //       /// of a graph.
   238 //       /// Its usage is quite simple, for example you can count the number
   239 //       /// of outgoing edges of a node \c n
   240 //       /// in graph \c g of type \c Graph as follows.
   241 //       /// \code
   242 //       /// int count=0;
   243 //       /// for(Graph::InEdgeIt e(g, n); e!=INVALID; ++e) ++count;
   244 //       /// \endcode
   245 
   246 //       class InEdgeIt : public Edge {
   247 //       public:
   248 // 	/// Default constructor
   249 
   250 // 	/// @warning The default constructor sets the iterator
   251 // 	/// to an undefined value.
   252 // 	InEdgeIt() { }
   253 // 	/// Copy constructor.
   254 
   255 // 	/// Copy constructor.
   256 // 	///
   257 // 	InEdgeIt(const InEdgeIt&) { }
   258 // 	/// Initialize the iterator to be invalid.
   259 
   260 // 	/// Initialize the iterator to be invalid.
   261 // 	///
   262 // 	InEdgeIt(Invalid) { }
   263 // 	/// This constructor sets the iterator to first incoming edge.
   264     
   265 // 	/// This constructor set the iterator to the first incoming edge of
   266 // 	/// node
   267 // 	///@param n the node
   268 // 	///@param g the graph
   269 // 	InEdgeIt(const StaticGraph& g, const Node& n) { }
   270 // 	/// Edge -> InEdgeIt conversion
   271 
   272 // 	/// Sets the iterator to the value of the trivial iterator \c e.
   273 // 	/// This feature necessitates that each time we 
   274 // 	/// iterate the edge-set, the iteration order is the same.
   275 // 	InEdgeIt(const StaticGraph& g, const Edge& n) { }
   276 // 	/// Next incoming edge
   277 
   278 // 	/// Assign the iterator to the next inedge of the corresponding node.
   279 // 	///
   280 // 	InEdgeIt& operator++() { return *this; }
   281 //       };
   282 //       /// This iterator goes through each edge.
   283 
   284 //       /// This iterator goes through each edge of a graph.
   285 //       /// Its usage is quite simple, for example you can count the number
   286 //       /// of edges in a graph \c g of type \c Graph as follows:
   287 //       /// \code
   288 //       /// int count=0;
   289 //       /// for(Graph::EdgeIt e(g); e!=INVALID; ++e) ++count;
   290 //       /// \endcode
   291 //       class EdgeIt : public Edge {
   292 //       public:
   293 // 	/// Default constructor
   294 
   295 // 	/// @warning The default constructor sets the iterator
   296 // 	/// to an undefined value.
   297 // 	EdgeIt() { }
   298 // 	/// Copy constructor.
   299 
   300 // 	/// Copy constructor.
   301 // 	///
   302 // 	EdgeIt(const EdgeIt&) { }
   303 // 	/// Initialize the iterator to be invalid.
   304 
   305 // 	/// Initialize the iterator to be invalid.
   306 // 	///
   307 // 	EdgeIt(Invalid) { }
   308 // 	/// This constructor sets the iterator to first edge.
   309     
   310 // 	/// This constructor set the iterator to the first edge of
   311 // 	/// node
   312 // 	///@param g the graph
   313 // 	EdgeIt(const StaticGraph& g) { }
   314 // 	/// Edge -> EdgeIt conversion
   315 
   316 // 	/// Sets the iterator to the value of the trivial iterator \c e.
   317 // 	/// This feature necessitates that each time we 
   318 // 	/// iterate the edge-set, the iteration order is the same.
   319 // 	EdgeIt(const StaticGraph&, const Edge&) { } 
   320 //     	///Next edge
   321 	
   322 // 	/// Assign the iterator to the next 
   323 // 	/// edge of the corresponding node.
   324 // 	EdgeIt& operator++() { return *this; }
   325 //       };
   326 //       ///Gives back the target node of an edge.
   327 
   328 //       ///Gives back the target node of an edge.
   329 //       ///
   330 //       Node target(Edge) const { return INVALID; }
   331 //       ///Gives back the source node of an edge.
   332 
   333 //       ///Gives back the source node of an edge.
   334 //       ///
   335 //       Node source(Edge) const { return INVALID; }
   336 //       /// Read write map of the nodes to type \c T.
   337 
   338 //       /// \ingroup concept
   339 //       /// ReadWrite map of the nodes to type \c T.
   340 //       /// \sa Reference
   341 //       /// \warning Making maps that can handle bool type (NodeMap<bool>)
   342 //       /// needs some extra attention!
   343 //       template<class T> 
   344 //       class NodeMap : public ReadWriteMap< Node, T >
   345 //       {
   346 //       public:
   347 
   348 // 	///\e
   349 // 	NodeMap(const StaticGraph&) { }
   350 // 	///\e
   351 // 	NodeMap(const StaticGraph&, T) { }
   352 
   353 // 	///Copy constructor
   354 // 	NodeMap(const NodeMap&) { }
   355 // 	///Assignment operator
   356 // 	NodeMap& operator=(const NodeMap&) { return *this; }
   357 // 	// \todo fix this concept
   358 //       };
   359 
   360 //       /// Read write map of the edges to type \c T.
   361 
   362 //       /// \ingroup concept
   363 //       ///Reference map of the edges to type \c T.
   364 //       /// \sa Reference
   365 //       /// \warning Making maps that can handle bool type (EdgeMap<bool>)
   366 //       /// needs some extra attention!
   367 //       template<class T> 
   368 //       class EdgeMap : public ReadWriteMap<Edge,T>
   369 //       {
   370 //       public:
   371 
   372 // 	///\e
   373 // 	EdgeMap(const StaticGraph&) { }
   374 // 	///\e
   375 // 	EdgeMap(const StaticGraph&, T) { }
   376 // 	///Copy constructor
   377 // 	EdgeMap(const EdgeMap&) { }
   378 // 	///Assignment operator
   379 // 	EdgeMap& operator=(const EdgeMap&) { return *this; }
   380 // 	// \todo fix this concept    
   381 //       };
   382 //     };
   383 
   384 //     /// An empty non-static graph class.
   385     
   386 //     /// This class provides everything that \ref StaticGraph
   387 //     /// with additional functionality which enables to build a
   388 //     /// graph from scratch.
   389 //     class ExtendableGraph : public StaticGraph
   390 //     {
   391 //     public:
   392 //       /// Defalult constructor.
   393 
   394 //       /// Defalult constructor.
   395 //       ///
   396 //       ExtendableGraph() { }
   397 //       ///Add a new node to the graph.
   398 
   399 //       /// \return the new node.
   400 //       ///
   401 //       Node addNode() { return INVALID; }
   402 //       ///Add a new edge to the graph.
   403 
   404 //       ///Add a new edge to the graph with source node \c s
   405 //       ///and target node \c t.
   406 //       ///\return the new edge.
   407 //       Edge addEdge(Node s, Node t) { return INVALID; }
   408     
   409 //       /// Resets the graph.
   410 
   411 //       /// This function deletes all edges and nodes of the graph.
   412 //       /// It also frees the memory allocated to store them.
   413 //       /// \todo It might belong to \ref ErasableGraph.
   414 //       void clear() { }
   415 //     };
   416 
   417 //     /// An empty erasable graph class.
   418   
   419 //     /// This class is an extension of \ref ExtendableGraph. It also makes it
   420 //     /// possible to erase edges or nodes.
   421 //     class ErasableGraph : public ExtendableGraph
   422 //     {
   423 //     public:
   424 //       /// Defalult constructor.
   425 
   426 //       /// Defalult constructor.
   427 //       ///
   428 //       ErasableGraph() { }
   429 //       /// Deletes a node.
   430 
   431 //       /// Deletes node \c n node.
   432 //       ///
   433 //       void erase(Node n) { }
   434 //       /// Deletes an edge.
   435 
   436 //       /// Deletes edge \c e edge.
   437 //       ///
   438 //       void erase(Edge e) { }
   439 //     };
   440 
   441     
   442     /************* New GraphBase stuff **************/
   443 
   444 
   445     /// A minimal GraphBase concept
   446 
   447     /// This class describes a minimal concept which can be extended to a
   448     /// full-featured graph with \ref GraphFactory.
   449     class GraphBase {
   450     public:
   451 
   452       GraphBase() {}
   453 
   454       /// \bug Should we demand that Node and Edge be subclasses of the
   455       /// Graph class???
   456 
   457       typedef GraphItem<'n'> Node;
   458       typedef GraphItem<'e'> Edge;
   459 
   460 //       class Node : public BaseGraphItem<'n'> {};
   461 //       class Edge : public BaseGraphItem<'e'> {};
   462 
   463       // Graph operation
   464       void firstNode(Node &n) const { }
   465       void firstEdge(Edge &e) const { }
   466 
   467       void firstOutEdge(Edge &e, Node) const { }
   468       void firstInEdge(Edge &e, Node) const { }
   469 
   470       void nextNode(Node &n) const { }
   471       void nextEdge(Edge &e) const { }
   472 
   473 
   474       // Question: isn't it reasonable if this methods have a Node
   475       // parameter? Like this:
   476       // Edge& nextOut(Edge &e, Node) const { return e; }
   477       void nextOutEdge(Edge &e) const { }
   478       void nextInEdge(Edge &e) const { }
   479 
   480       Node target(Edge) const { return Node(); }
   481       Node source(Edge) const { return Node(); }
   482       
   483 
   484       // Do we need id, nodeNum, edgeNum and co. in this basic graphbase
   485       // concept?
   486 
   487 
   488       // Maps.
   489       //
   490       // We need a special slimer concept which does not provide maps (it
   491       // wouldn't be strictly slimer, cause for map-factory id() & friends
   492       // a required...)
   493 
   494       template<typename T>
   495       class NodeMap : public GraphMap<GraphBase, Node, T> {};
   496 
   497       template<typename T>
   498       class EdgeMap : public GraphMap<GraphBase, Node, T> {};
   499     };
   500 
   501 
   502 
   503 
   504     /**************** The full-featured graph concepts ****************/
   505 
   506     
   507     class StaticGraph 
   508       :  virtual public BaseGraphComponent,
   509 	 public IterableGraphComponent, public MappableGraphComponent {
   510     public:
   511       typedef BaseGraphComponent::Node Node;
   512       typedef BaseGraphComponent::Edge Edge;
   513 
   514       template <typename _Graph>
   515       struct Constraints {
   516 	void constraints() {
   517 	  checkConcept<IterableGraphComponent, _Graph>();
   518 	  checkConcept<MappableGraphComponent, _Graph>();
   519 	}
   520       };
   521     };
   522 
   523     class ExtendableGraph 
   524       :  virtual public BaseGraphComponent, public StaticGraph,
   525 	 public ExtendableGraphComponent, public ClearableGraphComponent {
   526     public:
   527       typedef BaseGraphComponent::Node Node;
   528       typedef BaseGraphComponent::Edge Edge;
   529 
   530       template <typename _Graph>
   531       struct Constraints {
   532 	void constraints() {
   533 	  checkConcept<StaticGraph, _Graph >();
   534 	  checkConcept<ExtendableGraphComponent, _Graph >();
   535 	  checkConcept<ClearableGraphComponent, _Graph >();
   536 	}
   537       };
   538     };
   539 
   540     class ErasableGraph 
   541       :  virtual public BaseGraphComponent, public ExtendableGraph,
   542 	 public ErasableGraphComponent {
   543     public:
   544       typedef BaseGraphComponent::Node Node;
   545       typedef BaseGraphComponent::Edge Edge;
   546 
   547       template <typename _Graph>
   548       struct Constraints {
   549 	void constraints() {
   550 	  checkConcept<ExtendableGraph, _Graph >();
   551 	  checkConcept<ErasableGraphComponent, _Graph >();
   552 	}
   553       };
   554     };
   555 
   556     // @}
   557   } //namespace concept  
   558 } //namespace lemon
   559 
   560 
   561 
   562 #endif // LEMON_CONCEPT_GRAPH_H