lemon/concept/ugraph.h
changeset 2119 4cf25c61ea65
parent 2021 11455e986b95
child 2120 a907fb95f1e0
equal deleted inserted replaced
7:214604ebe2d8 8:88a164673a59
    16  *
    16  *
    17  */
    17  */
    18 
    18 
    19 ///\ingroup graph_concepts
    19 ///\ingroup graph_concepts
    20 ///\file
    20 ///\file
    21 ///\brief Undirected graphs and components of.
    21 ///\brief The concept of the undirected graphs.
    22 
    22 
    23 
    23 
    24 #ifndef LEMON_CONCEPT_UGRAPH_H
    24 #ifndef LEMON_CONCEPT_UGRAPH_H
    25 #define LEMON_CONCEPT_UGRAPH_H
    25 #define LEMON_CONCEPT_UGRAPH_H
    26 
    26 
    28 #include <lemon/concept/graph.h>
    28 #include <lemon/concept/graph.h>
    29 #include <lemon/bits/utility.h>
    29 #include <lemon/bits/utility.h>
    30 
    30 
    31 namespace lemon {
    31 namespace lemon {
    32   namespace concept {
    32   namespace concept {
    33 
       
    34 //     /// Skeleton class which describes an edge with direction in \ref
       
    35 //     /// UGraph "undirected graph".
       
    36     template <typename UGraph>
       
    37     class UGraphEdge : public UGraph::UEdge {
       
    38       typedef typename UGraph::UEdge UEdge;
       
    39       typedef typename UGraph::Node Node;
       
    40     public:
       
    41 
       
    42       /// \e
       
    43       UGraphEdge() {}
       
    44 
       
    45       /// \e
       
    46       UGraphEdge(const UGraphEdge& e) : UGraph::UEdge(e) {}
       
    47 
       
    48       /// \e
       
    49       UGraphEdge(Invalid) {}
       
    50 
       
    51       /// \brief Directed edge from undirected edge and a source node.
       
    52       ///
       
    53       /// Constructs a directed edge from undirected edge and a source node.
       
    54       ///
       
    55       /// \note You have to specify the graph for this constructor.
       
    56       UGraphEdge(const UGraph &g,
       
    57 		     UEdge u_edge, Node n) {
       
    58 	ignore_unused_variable_warning(u_edge);
       
    59 	ignore_unused_variable_warning(g);
       
    60 	ignore_unused_variable_warning(n);
       
    61       }
       
    62 
       
    63       /// \e
       
    64       UGraphEdge& operator=(UGraphEdge) { return *this; }
       
    65 
       
    66       /// \e
       
    67       bool operator==(UGraphEdge) const { return true; }
       
    68       /// \e
       
    69       bool operator!=(UGraphEdge) const { return false; }
       
    70 
       
    71       /// \e
       
    72       bool operator<(UGraphEdge) const { return false; }
       
    73 
       
    74       template <typename Edge>
       
    75       struct Constraints {
       
    76 	void constraints() {
       
    77 	  const_constraints();
       
    78 	}
       
    79 	void const_constraints() const {
       
    80 	  /// \bug This should be is_base_and_derived ...
       
    81 	  UEdge ue = e;
       
    82 	  ue = e;
       
    83 
       
    84 	  Edge e_with_source(graph,ue,n);
       
    85 	  ignore_unused_variable_warning(e_with_source);
       
    86 	}
       
    87 	Edge e;
       
    88 	UEdge ue;
       
    89 	UGraph graph;
       
    90 	Node n;
       
    91       };
       
    92     };
       
    93     
       
    94 
       
    95     struct BaseIterableUGraphConcept {
       
    96 
       
    97       template <typename Graph>
       
    98       struct Constraints {
       
    99 
       
   100 	typedef typename Graph::UEdge UEdge;
       
   101 	typedef typename Graph::Edge Edge;
       
   102 	typedef typename Graph::Node Node;
       
   103 
       
   104 	void constraints() {
       
   105 	  checkConcept<BaseIterableGraphComponent, Graph>();
       
   106 	  checkConcept<GraphItem<>, UEdge>();
       
   107 	  //checkConcept<UGraphEdge<Graph>, Edge>();
       
   108 
       
   109 	  graph.first(ue);
       
   110 	  graph.next(ue);
       
   111 
       
   112 	  const_constraints();
       
   113 	}
       
   114 	void const_constraints() {
       
   115 	  Node n;
       
   116 	  n = graph.target(ue);
       
   117 	  n = graph.source(ue);
       
   118 	  n = graph.oppositeNode(n0, ue);
       
   119 
       
   120 	  bool b;
       
   121 	  b = graph.direction(e);
       
   122 	  Edge e = graph.direct(UEdge(), true);
       
   123 	  e = graph.direct(UEdge(), n);
       
   124  
       
   125 	  ignore_unused_variable_warning(b);
       
   126 	}
       
   127 
       
   128 	Graph graph;
       
   129 	Edge e;
       
   130 	Node n0;
       
   131 	UEdge ue;
       
   132       };
       
   133 
       
   134     };
       
   135 
       
   136 
       
   137     struct IterableUGraphConcept {
       
   138 
       
   139       template <typename Graph>
       
   140       struct Constraints {
       
   141 	void constraints() {
       
   142 	  /// \todo we don't need the iterable component to be base iterable
       
   143 	  /// Don't we really???
       
   144 	  //checkConcept< BaseIterableUGraphConcept, Graph > ();
       
   145 
       
   146 	  checkConcept<IterableGraphComponent, Graph> ();
       
   147 
       
   148 	  typedef typename Graph::UEdge UEdge;
       
   149 	  typedef typename Graph::UEdgeIt UEdgeIt;
       
   150 	  typedef typename Graph::IncEdgeIt IncEdgeIt;
       
   151 
       
   152 	  checkConcept<GraphIterator<Graph, UEdge>, UEdgeIt>();
       
   153 	  checkConcept<GraphIncIterator<Graph, UEdge>, IncEdgeIt>();
       
   154 	}
       
   155       };
       
   156 
       
   157     };
       
   158 
       
   159     struct MappableUGraphConcept {
       
   160 
       
   161       template <typename Graph>
       
   162       struct Constraints {
       
   163 
       
   164 	struct Dummy {
       
   165 	  int value;
       
   166 	  Dummy() : value(0) {}
       
   167 	  Dummy(int _v) : value(_v) {}
       
   168 	};
       
   169 
       
   170 	void constraints() {
       
   171 	  checkConcept<MappableGraphComponent, Graph>();
       
   172 
       
   173 	  typedef typename Graph::template UEdgeMap<int> IntMap;
       
   174 	  checkConcept<GraphMap<Graph, typename Graph::UEdge, int>,
       
   175 	    IntMap >();
       
   176 
       
   177 	  typedef typename Graph::template UEdgeMap<bool> BoolMap;
       
   178 	  checkConcept<GraphMap<Graph, typename Graph::UEdge, bool>,
       
   179 	    BoolMap >();
       
   180 
       
   181 	  typedef typename Graph::template UEdgeMap<Dummy> DummyMap;
       
   182 	  checkConcept<GraphMap<Graph, typename Graph::UEdge, Dummy>,
       
   183 	    DummyMap >();
       
   184 	}
       
   185       };
       
   186 
       
   187     };
       
   188 
       
   189     struct ExtendableUGraphConcept {
       
   190 
       
   191       template <typename Graph>
       
   192       struct Constraints {
       
   193 	void constraints() {
       
   194 	  node_a = graph.addNode();
       
   195 	  uedge = graph.addEdge(node_a, node_b);
       
   196 	}
       
   197 	typename Graph::Node node_a, node_b;
       
   198 	typename Graph::UEdge uedge;
       
   199 	Graph graph;
       
   200       };
       
   201 
       
   202     };
       
   203 
       
   204     struct ErasableUGraphConcept {
       
   205 
       
   206       template <typename Graph>
       
   207       struct Constraints {
       
   208 	void constraints() {
       
   209 	  graph.erase(n);
       
   210 	  graph.erase(e);
       
   211 	}
       
   212 	Graph graph;
       
   213 	typename Graph::Node n;
       
   214 	typename Graph::UEdge e;
       
   215       };
       
   216 
       
   217     };
       
   218 
    33 
   219     /// \addtogroup graph_concepts
    34     /// \addtogroup graph_concepts
   220     /// @{
    35     /// @{
   221 
    36 
   222 
    37 
   229     /// without any sensible implementation. So any algorithm for
    44     /// without any sensible implementation. So any algorithm for
   230     /// undirected graph should compile with this class, but it will not
    45     /// undirected graph should compile with this class, but it will not
   231     /// run properly, of couse.
    46     /// run properly, of couse.
   232     ///
    47     ///
   233     /// In LEMON undirected graphs also fulfill the concept of directed
    48     /// In LEMON undirected graphs also fulfill the concept of directed
   234     /// graphs (\ref lemon::concept::StaticGraph "Graph Concept"). For
    49     /// graphs (\ref lemon::concept::Graph "Graph Concept"). For
   235     /// explanation of this and more see also the page \ref ugraphs,
    50     /// explanation of this and more see also the page \ref graphs,
   236     /// a tutorial about undirected graphs.
    51     /// a tutorial about graphs.
   237     ///
    52     ///
   238     /// You can assume that all undirected graph can be handled
    53     /// You can assume that all undirected graph can be handled
   239     /// as a static directed graph. This way it is fully conform
    54     /// as a directed graph. This way it is fully conform
   240     /// to the StaticGraph concept.
    55     /// to the Graph concept.
   241 
    56 
   242     class UGraph {
    57     class UGraph {
   243     public:
    58     public:
   244       ///\e
    59       ///\e
   245 
    60 
   797       Node source(Edge) const { return INVALID; }
   612       Node source(Edge) const { return INVALID; }
   798 
   613 
   799       /// \brief Target node of the directed edge.
   614       /// \brief Target node of the directed edge.
   800       Node target(Edge) const { return INVALID; }
   615       Node target(Edge) const { return INVALID; }
   801 
   616 
   802 //       /// \brief First node of the graph
       
   803 //       ///
       
   804 //       /// \note This method is part of so called \ref
       
   805 //       /// developpers_interface "Developpers' interface", so it shouldn't
       
   806 //       /// be used in an end-user program.
       
   807       void first(Node&) const {}
   617       void first(Node&) const {}
   808 //       /// \brief Next node of the graph
       
   809 //       ///
       
   810 //       /// \note This method is part of so called \ref
       
   811 //       /// developpers_interface "Developpers' interface", so it shouldn't
       
   812 //       /// be used in an end-user program.
       
   813       void next(Node&) const {}
   618       void next(Node&) const {}
   814 
   619 
   815 //       /// \brief First undirected edge of the graph
       
   816 //       ///
       
   817 //       /// \note This method is part of so called \ref
       
   818 //       /// developpers_interface "Developpers' interface", so it shouldn't
       
   819 //       /// be used in an end-user program.
       
   820       void first(UEdge&) const {}
   620       void first(UEdge&) const {}
   821 //       /// \brief Next undirected edge of the graph
       
   822 //       ///
       
   823 //       /// \note This method is part of so called \ref
       
   824 //       /// developpers_interface "Developpers' interface", so it shouldn't
       
   825 //       /// be used in an end-user program.
       
   826       void next(UEdge&) const {}
   621       void next(UEdge&) const {}
   827 
   622 
   828 //       /// \brief First directed edge of the graph
       
   829 //       ///
       
   830 //       /// \note This method is part of so called \ref
       
   831 //       /// developpers_interface "Developpers' interface", so it shouldn't
       
   832 //       /// be used in an end-user program.
       
   833       void first(Edge&) const {}
   623       void first(Edge&) const {}
   834 //       /// \brief Next directed edge of the graph
       
   835 //       ///
       
   836 //       /// \note This method is part of so called \ref
       
   837 //       /// developpers_interface "Developpers' interface", so it shouldn't
       
   838 //       /// be used in an end-user program.
       
   839       void next(Edge&) const {}
   624       void next(Edge&) const {}
   840 
   625 
   841 //       /// \brief First outgoing edge from a given node
       
   842 //       ///
       
   843 //       /// \note This method is part of so called \ref
       
   844 //       /// developpers_interface "Developpers' interface", so it shouldn't
       
   845 //       /// be used in an end-user program.
       
   846       void firstOut(Edge&, Node) const {}
   626       void firstOut(Edge&, Node) const {}
   847 //       /// \brief Next outgoing edge to a node
       
   848 //       ///
       
   849 //       /// \note This method is part of so called \ref
       
   850 //       /// developpers_interface "Developpers' interface", so it shouldn't
       
   851 //       /// be used in an end-user program.
       
   852       void nextOut(Edge&) const {}
   627       void nextOut(Edge&) const {}
   853 
   628 
   854 //       /// \brief First incoming edge to a given node
       
   855 //       ///
       
   856 //       /// \note This method is part of so called \ref
       
   857 //       /// developpers_interface "Developpers' interface", so it shouldn't
       
   858 //       /// be used in an end-user program.
       
   859       void firstIn(Edge&, Node) const {}
   629       void firstIn(Edge&, Node) const {}
   860 //       /// \brief Next incoming edge to a node
       
   861 //       ///
       
   862 //       /// \note This method is part of so called \ref
       
   863 //       /// developpers_interface "Developpers' interface", so it shouldn't
       
   864 //       /// be used in an end-user program.
       
   865       void nextIn(Edge&) const {}
   630       void nextIn(Edge&) const {}
   866 
   631 
   867 
   632 
   868       void firstInc(UEdge &, bool &, const Node &) const {}
   633       void firstInc(UEdge &, bool &, const Node &) const {}
   869 
       
   870       void nextInc(UEdge &, bool &) const {}
   634       void nextInc(UEdge &, bool &) const {}
   871 
   635 
   872       /// \brief Base node of the iterator
   636       /// \brief Base node of the iterator
   873       ///
   637       ///
   874       /// Returns the base node (the source in this case) of the iterator
   638       /// Returns the base node (the source in this case) of the iterator
   920 	}
   684 	}
   921       };
   685       };
   922 
   686 
   923     };
   687     };
   924 
   688 
   925     /// \brief An empty non-static undirected graph class.
       
   926     ///    
       
   927     /// This class provides everything that \ref UGraph does.
       
   928     /// Additionally it enables building graphs from scratch.
       
   929     class ExtendableUGraph : public UGraph {
       
   930     public:
       
   931       
       
   932       /// \brief Add a new node to the graph.
       
   933       ///
       
   934       /// Add a new node to the graph.
       
   935       /// \return the new node.
       
   936       Node addNode();
       
   937 
       
   938       /// \brief Add a new undirected edge to the graph.
       
   939       ///
       
   940       /// Add a new undirected edge to the graph.
       
   941       /// \return the new edge.
       
   942       UEdge addEdge(const Node& from, const Node& to);
       
   943 
       
   944       /// \brief Resets the graph.
       
   945       ///
       
   946       /// This function deletes all undirected edges and nodes of the graph.
       
   947       /// It also frees the memory allocated to store them.
       
   948       void clear() { }
       
   949 
       
   950       template <typename Graph>
       
   951       struct Constraints {
       
   952 	void constraints() {
       
   953 	  checkConcept<BaseIterableUGraphConcept, Graph>();
       
   954 	  checkConcept<IterableUGraphConcept, Graph>();
       
   955 	  checkConcept<MappableUGraphConcept, Graph>();
       
   956 
       
   957 	  checkConcept<UGraph, Graph>();
       
   958 	  checkConcept<ExtendableUGraphConcept, Graph>();
       
   959 	  checkConcept<ClearableGraphComponent, Graph>();
       
   960 	}
       
   961       };
       
   962 
       
   963     };
       
   964 
       
   965     /// \brief An empty erasable undirected graph class.
       
   966     ///
       
   967     /// This class is an extension of \ref ExtendableUGraph. It makes it
       
   968     /// possible to erase undirected edges or nodes.
       
   969     class ErasableUGraph : public ExtendableUGraph {
       
   970     public:
       
   971 
       
   972       /// \brief Deletes a node.
       
   973       ///
       
   974       /// Deletes a node.
       
   975       ///
       
   976       void erase(Node) { }
       
   977       /// \brief Deletes an undirected edge.
       
   978       ///
       
   979       /// Deletes an undirected edge.
       
   980       ///
       
   981       void erase(UEdge) { }
       
   982 
       
   983       template <typename Graph>
       
   984       struct Constraints {
       
   985 	void constraints() {
       
   986 	  checkConcept<ExtendableUGraph, Graph>();
       
   987 	  checkConcept<ErasableUGraphConcept, Graph>();
       
   988 	}
       
   989       };
       
   990 
       
   991     };
       
   992 
       
   993     /// @}
   689     /// @}
   994 
   690 
   995   }
   691   }
   996 
   692 
   997 }
   693 }