3 * This file is a part of LEMON, a generic C++ optimization library
5 * Copyright (C) 2003-2006
6 * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
7 * (Egervary Research Group on Combinatorial Optimization, EGRES).
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.
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
21 ///\brief Classes for representing paths in graphs.
23 ///\todo Iterators have obsolete style
25 #ifndef LEMON_CONCEPT_PATH_H
26 #define LEMON_CONCEPT_PATH_H
28 #include <lemon/bits/invalid.h>
29 #include <lemon/bits/utility.h>
30 #include <lemon/concept_check.h>
35 /// \addtogroup concept
38 /// \brief A skeleton structure for representing directed paths in
41 /// A skeleton structure for representing directed paths in a
43 /// \param _Graph The graph type in which the path is.
45 /// In a sense, the path can be treated as a list of edges. The
46 /// lemon path type stores just this list. As a consequence it
47 /// cannot enumerate the nodes in the path and the zero length
48 /// paths cannot store the source.
50 template <typename _Graph>
54 /// Type of the underlying graph.
56 /// Edge type of the underlying graph.
57 typedef typename Graph::Edge Edge;
61 /// \brief Default constructor
64 /// \brief Template constructor
65 template <typename CPath>
66 Path(const CPath& cpath) {}
68 /// \brief Template assigment
69 template <typename CPath>
70 Path& operator=(const CPath& cpath) {}
72 /// Length of the path ie. the number of edges in the path.
73 int length() const { return 0;}
75 /// Returns whether the path is empty.
76 bool empty() const { return true;}
78 /// Resets the path to an empty path.
81 /// \brief Lemon style iterator for path edges
83 /// This class is used to iterate on the edges of the paths.
86 /// Default constructor
88 /// Invalid constructor
90 /// Constructor for first edge
91 EdgeIt(const Path &) {}
93 /// Conversion to Edge
94 operator Edge() const { return INVALID; }
97 EdgeIt& operator++() {return *this;}
99 /// Comparison operator
100 bool operator==(const EdgeIt&) const {return true;}
101 /// Comparison operator
102 bool operator!=(const EdgeIt&) const {return true;}
103 /// Comparison operator
104 bool operator<(const EdgeIt&) const {return false;}
108 template <typename _Path>
119 typename _Path::EdgeIt id, ii(INVALID), i(p);
122 typename Graph::Edge ed = i;
128 ignore_unused_variable_warning(l);
129 ignore_unused_variable_warning(pp);
130 ignore_unused_variable_warning(e);
131 ignore_unused_variable_warning(id);
132 ignore_unused_variable_warning(ii);
133 ignore_unused_variable_warning(ed);
139 namespace _path_bits {
141 template <typename _Graph, typename _Path, typename RevPathTag = void>
142 struct PathDumperConstraints {
147 typename _Path::EdgeIt id, ii(INVALID), i(p);
150 typename _Graph::Edge ed = i;
156 ignore_unused_variable_warning(l);
157 ignore_unused_variable_warning(e);
158 ignore_unused_variable_warning(id);
159 ignore_unused_variable_warning(ii);
160 ignore_unused_variable_warning(ed);
165 template <typename _Graph, typename _Path>
166 struct PathDumperConstraints<
168 typename enable_if<typename _Path::RevPathTag, void>::type
174 typename _Path::RevEdgeIt id, ii(INVALID), i(p);
177 typename _Graph::Edge ed = i;
183 ignore_unused_variable_warning(l);
184 ignore_unused_variable_warning(e);
185 ignore_unused_variable_warning(id);
186 ignore_unused_variable_warning(ii);
187 ignore_unused_variable_warning(ed);
195 /// \brief A skeleton structure for path dumpers.
197 /// A skeleton structure for path dumpers. The path dumpers are
198 /// the generalization of the paths. The path dumpers can
199 /// enumerate the edges of the path wheter in forward or in
200 /// backward order. In most time these classes are not used
201 /// directly rather it used to assign a dumped class to a real
204 /// The main purpose of this concept is that the shortest path
205 /// algorithms can enumerate easily the edges in reverse order.
206 /// If we would like to give back a real path from these
207 /// algorithms then we should create a temporarly path object. In
208 /// Lemon such algorithms gives back a path dumper what can
209 /// assigned to a real path and the dumpers can be implemented as
210 /// an adaptor class to the predecessor map.
212 /// \param _Graph The graph type in which the path is.
214 /// The paths can be constructed from any path type by a
215 /// template constructor or a template assignment operator.
217 template <typename _Graph>
221 /// Type of the underlying graph.
222 typedef _Graph Graph;
223 /// Edge type of the underlying graph.
224 typedef typename Graph::Edge Edge;
226 /// Length of the path ie. the number of edges in the path.
227 int length() const { return 0;}
229 /// Returns whether the path is empty.
230 bool empty() const { return true;}
232 /// \brief Forward or reverse dumping
234 /// If the RevPathTag is defined and true then reverse dumping
235 /// is provided in the path dumper. In this case instead of the
236 /// EdgeIt the RevEdgeIt iterator should be implemented in the
238 typedef False RevPathTag;
240 /// \brief Lemon style iterator for path edges
242 /// This class is used to iterate on the edges of the paths.
245 /// Default constructor
247 /// Invalid constructor
249 /// Constructor for first edge
250 EdgeIt(const PathDumper&) {}
252 /// Conversion to Edge
253 operator Edge() const { return INVALID; }
256 EdgeIt& operator++() {return *this;}
258 /// Comparison operator
259 bool operator==(const EdgeIt&) const {return true;}
260 /// Comparison operator
261 bool operator!=(const EdgeIt&) const {return true;}
262 /// Comparison operator
263 bool operator<(const EdgeIt&) const {return false;}
267 /// \brief Lemon style iterator for path edges
269 /// This class is used to iterate on the edges of the paths in
270 /// reverse direction.
273 /// Default constructor
275 /// Invalid constructor
276 RevEdgeIt(Invalid) {}
277 /// Constructor for first edge
278 RevEdgeIt(const PathDumper &) {}
280 /// Conversion to Edge
281 operator Edge() const { return INVALID; }
284 RevEdgeIt& operator++() {return *this;}
286 /// Comparison operator
287 bool operator==(const RevEdgeIt&) const {return true;}
288 /// Comparison operator
289 bool operator!=(const RevEdgeIt&) const {return true;}
290 /// Comparison operator
291 bool operator<(const RevEdgeIt&) const {return false;}
295 template <typename _Path>
298 function_requires<_path_bits::
299 PathDumperConstraints<Graph, _Path> >();
311 #endif // LEMON_CONCEPT_PATH_H