lemon/concept/graph.h
author deba
Tue, 17 Oct 2006 10:50:57 +0000
changeset 2247 269a0dcee70b
parent 2134 914602e294be
permissions -rw-r--r--
Update the Path concept
Concept check for paths

DirPath renamed to Path
The interface updated to the new lemon interface
Make difference between the empty path and the path from one node
Builder interface have not been changed
// I wanted but there was not accordance about it

UPath is removed
It was a buggy implementation, it could not iterate on the
nodes in the right order
Right way to use undirected paths => path of edges in undirected graphs

The tests have been modified to the current implementation
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2006
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_CONCEPT_GRAPH_H
    20 #define LEMON_CONCEPT_GRAPH_H
    21 
    22 ///\ingroup graph_concepts
    23 ///\file
    24 ///\brief Declaration of Graph.
    25 
    26 #include <lemon/bits/invalid.h>
    27 #include <lemon/bits/utility.h>
    28 #include <lemon/concept/maps.h>
    29 #include <lemon/concept_check.h>
    30 #include <lemon/concept/graph_components.h>
    31 
    32 namespace lemon {
    33   namespace concept {
    34 
    35     /// \addtogroup graph_concepts
    36     /// @{
    37 
    38     /// The directed graph concept
    39 
    40     /// This class describes the \ref concept "concept" of the
    41     /// immutable directed graphs.
    42     ///
    43     /// Note that actual graph implementation like @ref ListGraph or
    44     /// @ref SmartGraph may have several additional functionality.
    45     ///
    46     /// \sa concept
    47     class Graph {
    48     private:
    49       ///Graphs are \e not copy constructible. Use GraphCopy() instead.
    50       
    51       ///Graphs are \e not copy constructible. Use GraphCopy() instead.
    52       ///
    53       Graph(const Graph &) {};
    54       ///\brief Assignment of \ref Graph "Graph"s to another ones are
    55       ///\e not allowed. Use GraphCopy() instead.
    56       
    57       ///Assignment of \ref Graph "Graph"s to another ones are
    58       ///\e not allowed.  Use GraphCopy() instead.
    59 
    60       void operator=(const Graph &) {}
    61     public:
    62       ///\e
    63 
    64       /// Defalult constructor.
    65 
    66       /// Defalult constructor.
    67       ///
    68       Graph() { }
    69       /// Class for identifying a node of the graph
    70 
    71       /// This class identifies a node of the graph. It also serves
    72       /// as a base class of the node iterators,
    73       /// thus they will convert to this type.
    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 	/// Artificial ordering operator.
   105 	
   106 	/// To allow the use of graph descriptors as key type in std::map or
   107 	/// similar associative container we require this.
   108 	///
   109 	/// \note This operator only have to define some strict ordering of
   110 	/// the items; this order has nothing to do with the iteration
   111 	/// ordering of the items.
   112 	bool operator<(Node) const { return false; }
   113 
   114       };
   115     
   116       /// This iterator goes through each node.
   117 
   118       /// This iterator goes through each node.
   119       /// Its usage is quite simple, for example you can count the number
   120       /// of nodes in graph \c g of type \c Graph like this:
   121       ///\code
   122       /// int count=0;
   123       /// for (Graph::NodeIt n(g); n!=INVALID; ++n) ++count;
   124       ///\endcode
   125       class NodeIt : public Node {
   126       public:
   127         /// Default constructor
   128 
   129         /// @warning The default constructor sets the iterator
   130         /// to an undefined value.
   131         NodeIt() { }
   132         /// Copy constructor.
   133         
   134         /// Copy constructor.
   135         ///
   136         NodeIt(const NodeIt& n) : Node(n) { }
   137         /// Invalid constructor \& conversion.
   138 
   139         /// Initialize the iterator to be invalid.
   140         /// \sa Invalid for more details.
   141         NodeIt(Invalid) { }
   142         /// Sets the iterator to the first node.
   143 
   144         /// Sets the iterator to the first node of \c g.
   145         ///
   146         NodeIt(const Graph&) { }
   147         /// Node -> NodeIt conversion.
   148 
   149         /// Sets the iterator to the node of \c the graph pointed by 
   150 	/// the trivial iterator.
   151         /// This feature necessitates that each time we 
   152         /// iterate the edge-set, the iteration order is the same.
   153         NodeIt(const Graph&, const Node&) { }
   154         /// Next node.
   155 
   156         /// Assign the iterator to the next node.
   157         ///
   158         NodeIt& operator++() { return *this; }
   159       };
   160     
   161     
   162       /// Class for identifying an edge of the graph
   163 
   164       /// This class identifies an edge of the graph. It also serves
   165       /// as a base class of the edge iterators,
   166       /// thus they will convert to this type.
   167       class Edge {
   168       public:
   169         /// Default constructor
   170 
   171         /// @warning The default constructor sets the iterator
   172         /// to an undefined value.
   173         Edge() { }
   174         /// Copy constructor.
   175 
   176         /// Copy constructor.
   177         ///
   178         Edge(const Edge&) { }
   179         /// Initialize the iterator to be invalid.
   180 
   181         /// Initialize the iterator to be invalid.
   182         ///
   183         Edge(Invalid) { }
   184         /// Equality operator
   185 
   186         /// Two iterators are equal if and only if they point to the
   187         /// same object or both are invalid.
   188         bool operator==(Edge) const { return true; }
   189         /// Inequality operator
   190 
   191         /// \sa operator==(Edge n)
   192         ///
   193         bool operator!=(Edge) const { return true; }
   194 
   195 	/// Artificial ordering operator.
   196 	
   197 	/// To allow the use of graph descriptors as key type in std::map or
   198 	/// similar associative container we require this.
   199 	///
   200 	/// \note This operator only have to define some strict ordering of
   201 	/// the items; this order has nothing to do with the iteration
   202 	/// ordering of the items.
   203 	bool operator<(Edge) const { return false; }
   204       };
   205     
   206       /// This iterator goes trough the outgoing edges of a node.
   207 
   208       /// This iterator goes trough the \e outgoing edges of a certain node
   209       /// of a graph.
   210       /// Its usage is quite simple, for example you can count the number
   211       /// of outgoing edges of a node \c n
   212       /// in graph \c g of type \c Graph as follows.
   213       ///\code
   214       /// int count=0;
   215       /// for (Graph::OutEdgeIt e(g, n); e!=INVALID; ++e) ++count;
   216       ///\endcode
   217     
   218       class OutEdgeIt : public Edge {
   219       public:
   220         /// Default constructor
   221 
   222         /// @warning The default constructor sets the iterator
   223         /// to an undefined value.
   224         OutEdgeIt() { }
   225         /// Copy constructor.
   226 
   227         /// Copy constructor.
   228         ///
   229         OutEdgeIt(const OutEdgeIt& e) : Edge(e) { }
   230         /// Initialize the iterator to be invalid.
   231 
   232         /// Initialize the iterator to be invalid.
   233         ///
   234         OutEdgeIt(Invalid) { }
   235         /// This constructor sets the iterator to the first outgoing edge.
   236     
   237         /// This constructor sets the iterator to the first outgoing edge of
   238         /// the node.
   239         OutEdgeIt(const Graph&, const Node&) { }
   240         /// Edge -> OutEdgeIt conversion
   241 
   242         /// Sets the iterator to the value of the trivial iterator.
   243 	/// This feature necessitates that each time we 
   244         /// iterate the edge-set, the iteration order is the same.
   245         OutEdgeIt(const Graph&, const Edge&) { }
   246         ///Next outgoing edge
   247         
   248         /// Assign the iterator to the next 
   249         /// outgoing edge of the corresponding node.
   250         OutEdgeIt& operator++() { return *this; }
   251       };
   252 
   253       /// This iterator goes trough the incoming edges of a node.
   254 
   255       /// This iterator goes trough the \e incoming edges of a certain node
   256       /// of a graph.
   257       /// Its usage is quite simple, for example you can count the number
   258       /// of outgoing edges of a node \c n
   259       /// in graph \c g of type \c Graph as follows.
   260       ///\code
   261       /// int count=0;
   262       /// for(Graph::InEdgeIt e(g, n); e!=INVALID; ++e) ++count;
   263       ///\endcode
   264 
   265       class InEdgeIt : public Edge {
   266       public:
   267         /// Default constructor
   268 
   269         /// @warning The default constructor sets the iterator
   270         /// to an undefined value.
   271         InEdgeIt() { }
   272         /// Copy constructor.
   273 
   274         /// Copy constructor.
   275         ///
   276         InEdgeIt(const InEdgeIt& e) : Edge(e) { }
   277         /// Initialize the iterator to be invalid.
   278 
   279         /// Initialize the iterator to be invalid.
   280         ///
   281         InEdgeIt(Invalid) { }
   282         /// This constructor sets the iterator to first incoming edge.
   283     
   284         /// This constructor set the iterator to the first incoming edge of
   285         /// the node.
   286         InEdgeIt(const Graph&, const Node&) { }
   287         /// Edge -> InEdgeIt conversion
   288 
   289         /// Sets the iterator to the value of the trivial iterator \c e.
   290         /// This feature necessitates that each time we 
   291         /// iterate the edge-set, the iteration order is the same.
   292         InEdgeIt(const Graph&, const Edge&) { }
   293         /// Next incoming edge
   294 
   295         /// Assign the iterator to the next inedge of the corresponding node.
   296         ///
   297         InEdgeIt& operator++() { return *this; }
   298       };
   299       /// This iterator goes through each edge.
   300 
   301       /// This iterator goes through each edge of a graph.
   302       /// Its usage is quite simple, for example you can count the number
   303       /// of edges in a graph \c g of type \c Graph as follows:
   304       ///\code
   305       /// int count=0;
   306       /// for(Graph::EdgeIt e(g); e!=INVALID; ++e) ++count;
   307       ///\endcode
   308       class EdgeIt : public Edge {
   309       public:
   310         /// Default constructor
   311 
   312         /// @warning The default constructor sets the iterator
   313         /// to an undefined value.
   314         EdgeIt() { }
   315         /// Copy constructor.
   316 
   317         /// Copy constructor.
   318         ///
   319         EdgeIt(const EdgeIt& e) : Edge(e) { }
   320         /// Initialize the iterator to be invalid.
   321 
   322         /// Initialize the iterator to be invalid.
   323         ///
   324         EdgeIt(Invalid) { }
   325         /// This constructor sets the iterator to the first edge.
   326     
   327         /// This constructor sets the iterator to the first edge of \c g.
   328         ///@param g the graph
   329         EdgeIt(const Graph& g) { ignore_unused_variable_warning(g); }
   330         /// Edge -> EdgeIt conversion
   331 
   332         /// Sets the iterator to the value of the trivial iterator \c e.
   333         /// This feature necessitates that each time we 
   334         /// iterate the edge-set, the iteration order is the same.
   335         EdgeIt(const Graph&, const Edge&) { } 
   336         ///Next edge
   337         
   338         /// Assign the iterator to the next edge.
   339         EdgeIt& operator++() { return *this; }
   340       };
   341       ///Gives back the target node of an edge.
   342 
   343       ///Gives back the target node of an edge.
   344       ///
   345       Node target(Edge) const { return INVALID; }
   346       ///Gives back the source node of an edge.
   347 
   348       ///Gives back the source node of an edge.
   349       ///
   350       Node source(Edge) const { return INVALID; }
   351 
   352       void first(Node&) const {}
   353       void next(Node&) const {}
   354 
   355       void first(Edge&) const {}
   356       void next(Edge&) const {}
   357 
   358 
   359       void firstIn(Edge&, const Node&) const {}
   360       void nextIn(Edge&) const {}
   361 
   362       void firstOut(Edge&, const Node&) const {}
   363       void nextOut(Edge&) const {}
   364 
   365       /// \brief The base node of the iterator.
   366       ///
   367       /// Gives back the base node of the iterator.
   368       /// It is always the target of the pointed edge.
   369       Node baseNode(const InEdgeIt&) const { return INVALID; }
   370 
   371       /// \brief The running node of the iterator.
   372       ///
   373       /// Gives back the running node of the iterator.
   374       /// It is always the source of the pointed edge.
   375       Node runningNode(const InEdgeIt&) const { return INVALID; }
   376 
   377       /// \brief The base node of the iterator.
   378       ///
   379       /// Gives back the base node of the iterator.
   380       /// It is always the source of the pointed edge.
   381       Node baseNode(const OutEdgeIt&) const { return INVALID; }
   382 
   383       /// \brief The running node of the iterator.
   384       ///
   385       /// Gives back the running node of the iterator.
   386       /// It is always the target of the pointed edge.
   387       Node runningNode(const OutEdgeIt&) const { return INVALID; }
   388 
   389       /// \brief The opposite node on the given edge.
   390       ///
   391       /// Gives back the opposite node on the given edge.
   392       Node oppositeNode(const Node&, const Edge&) const { return INVALID; }
   393 
   394       /// \brief Read write map of the nodes to type \c T.
   395       /// 
   396       /// ReadWrite map of the nodes to type \c T.
   397       /// \sa Reference
   398       template<class T> 
   399       class NodeMap : public ReadWriteMap< Node, T > {
   400       public:
   401 
   402         ///\e
   403         NodeMap(const Graph&) { }
   404         ///\e
   405         NodeMap(const Graph&, T) { }
   406 
   407         ///Copy constructor
   408         NodeMap(const NodeMap& nm) : ReadWriteMap< Node, T >(nm) { }
   409         ///Assignment operator
   410         template <typename CMap>
   411         NodeMap& operator=(const CMap&) { 
   412           checkConcept<ReadMap<Node, T>, CMap>();
   413           return *this; 
   414         }
   415       };
   416 
   417       /// \brief Read write map of the edges to type \c T.
   418       ///
   419       /// Reference map of the edges to type \c T.
   420       /// \sa Reference
   421       template<class T> 
   422       class EdgeMap : public ReadWriteMap<Edge,T> {
   423       public:
   424 
   425         ///\e
   426         EdgeMap(const Graph&) { }
   427         ///\e
   428         EdgeMap(const Graph&, T) { }
   429         ///Copy constructor
   430         EdgeMap(const EdgeMap& em) : ReadWriteMap<Edge,T>(em) { }
   431         ///Assignment operator
   432         template <typename CMap>
   433         EdgeMap& operator=(const CMap&) { 
   434           checkConcept<ReadMap<Edge, T>, CMap>();
   435           return *this; 
   436         }
   437       };
   438 
   439       template <typename RGraph>
   440       struct Constraints {
   441         void constraints() {
   442           checkConcept<IterableGraphComponent<>, Graph>();
   443           checkConcept<MappableGraphComponent<>, Graph>();
   444         }
   445       };
   446 
   447     };
   448     
   449     // @}
   450   } //namespace concept  
   451 } //namespace lemon
   452 
   453 
   454 
   455 #endif // LEMON_CONCEPT_GRAPH_H