1 /* -*- mode: C++; indent-tabs-mode: nil; -*-
3 * This file is a part of LEMON, a generic C++ optimization library.
5 * Copyright (C) 2003-2009
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 The concept of paths
24 #ifndef LEMON_CONCEPTS_PATH_H
25 #define LEMON_CONCEPTS_PATH_H
27 #include <lemon/core.h>
28 #include <lemon/concept_check.h>
33 /// \addtogroup concept
36 /// \brief A skeleton structure for representing directed paths in
39 /// A skeleton structure for representing directed paths in a
41 /// In a sense, a path can be treated as a list of arcs.
42 /// LEMON path types just store this list. As a consequence, they cannot
43 /// enumerate the nodes on the path directly and a zero length path
44 /// cannot store its source node.
46 /// The arcs of a path should be stored in the order of their directions,
47 /// i.e. the target node of each arc should be the same as the source
48 /// node of the next arc. This consistency could be checked using
50 /// The source and target nodes of a (consistent) path can be obtained
51 /// using \ref pathSource() and \ref pathTarget().
53 /// A path can be constructed from another path of any type using the
54 /// copy constructor or the assignment operator.
56 /// \tparam GR The digraph type in which the path is.
57 template <typename GR>
61 /// Type of the underlying digraph.
63 /// Arc type of the underlying digraph.
64 typedef typename Digraph::Arc Arc;
68 /// \brief Default constructor
71 /// \brief Template copy constructor
72 template <typename CPath>
73 Path(const CPath& cpath) {}
75 /// \brief Template assigment operator
76 template <typename CPath>
77 Path& operator=(const CPath& cpath) {
78 ::lemon::ignore_unused_variable_warning(cpath);
82 /// Length of the path, i.e. the number of arcs on the path.
83 int length() const { return 0;}
85 /// Returns whether the path is empty.
86 bool empty() const { return true;}
88 /// Resets the path to an empty path.
91 /// \brief LEMON style iterator for enumerating the arcs of a path.
93 /// LEMON style iterator class for enumerating the arcs of a path.
96 /// Default constructor
98 /// Invalid constructor
100 /// Sets the iterator to the first arc of the given path
101 ArcIt(const Path &) {}
103 /// Conversion to \c Arc
104 operator Arc() const { return INVALID; }
107 ArcIt& operator++() {return *this;}
109 /// Comparison operator
110 bool operator==(const ArcIt&) const {return true;}
111 /// Comparison operator
112 bool operator!=(const ArcIt&) const {return true;}
113 /// Comparison operator
114 bool operator<(const ArcIt&) const {return false;}
118 template <typename _Path>
129 typename _Path::ArcIt id, ii(INVALID), i(p);
132 typename Digraph::Arc ed = i;
138 ::lemon::ignore_unused_variable_warning(l);
139 ::lemon::ignore_unused_variable_warning(pp);
140 ::lemon::ignore_unused_variable_warning(e);
141 ::lemon::ignore_unused_variable_warning(id);
142 ::lemon::ignore_unused_variable_warning(ii);
143 ::lemon::ignore_unused_variable_warning(ed);
149 namespace _path_bits {
151 template <typename _Digraph, typename _Path, typename RevPathTag = void>
152 struct PathDumperConstraints {
157 typename _Path::ArcIt id, i(p);
160 typename _Digraph::Arc ed = i;
165 ::lemon::ignore_unused_variable_warning(l);
166 ::lemon::ignore_unused_variable_warning(e);
167 ::lemon::ignore_unused_variable_warning(id);
168 ::lemon::ignore_unused_variable_warning(ed);
171 PathDumperConstraints() {}
174 template <typename _Digraph, typename _Path>
175 struct PathDumperConstraints<
177 typename enable_if<typename _Path::RevPathTag, void>::type
183 typename _Path::RevArcIt id, i(p);
186 typename _Digraph::Arc ed = i;
191 ::lemon::ignore_unused_variable_warning(l);
192 ::lemon::ignore_unused_variable_warning(e);
193 ::lemon::ignore_unused_variable_warning(id);
194 ::lemon::ignore_unused_variable_warning(ed);
197 PathDumperConstraints() {}
203 /// \brief A skeleton structure for path dumpers.
205 /// A skeleton structure for path dumpers. The path dumpers are
206 /// the generalization of the paths, they can enumerate the arcs
207 /// of the path either in forward or in backward order.
208 /// These classes are typically not used directly, they are rather
209 /// used to be assigned to a real path type.
211 /// The main purpose of this concept is that the shortest path
212 /// algorithms can enumerate the arcs easily in reverse order.
213 /// In LEMON, such algorithms give back a (reverse) path dumper that
214 /// can be assigned to a real path. The dumpers can be implemented as
215 /// an adaptor class to the predecessor map.
217 /// \tparam GR The digraph type in which the path is.
218 template <typename GR>
222 /// Type of the underlying digraph.
224 /// Arc type of the underlying digraph.
225 typedef typename Digraph::Arc Arc;
227 /// Length of the path, i.e. the number of arcs on the path.
228 int length() const { return 0;}
230 /// Returns whether the path is empty.
231 bool empty() const { return true;}
233 /// \brief Forward or reverse dumping
235 /// If this tag is defined to be \c True, then reverse dumping
236 /// is provided in the path dumper. In this case, \c RevArcIt
237 /// iterator should be implemented instead of \c ArcIt iterator.
238 typedef False RevPathTag;
240 /// \brief LEMON style iterator for enumerating the arcs of a path.
242 /// LEMON style iterator class for enumerating the arcs of a path.
245 /// Default constructor
247 /// Invalid constructor
249 /// Sets the iterator to the first arc of the given path
250 ArcIt(const PathDumper&) {}
252 /// Conversion to \c Arc
253 operator Arc() const { return INVALID; }
256 ArcIt& operator++() {return *this;}
258 /// Comparison operator
259 bool operator==(const ArcIt&) const {return true;}
260 /// Comparison operator
261 bool operator!=(const ArcIt&) const {return true;}
262 /// Comparison operator
263 bool operator<(const ArcIt&) const {return false;}
267 /// \brief LEMON style iterator for enumerating the arcs of a path
268 /// in reverse direction.
270 /// LEMON style iterator class for enumerating the arcs of a path
271 /// in reverse direction.
274 /// Default constructor
276 /// Invalid constructor
278 /// Sets the iterator to the last arc of the given path
279 RevArcIt(const PathDumper &) {}
281 /// Conversion to \c Arc
282 operator Arc() const { return INVALID; }
285 RevArcIt& operator++() {return *this;}
287 /// Comparison operator
288 bool operator==(const RevArcIt&) const {return true;}
289 /// Comparison operator
290 bool operator!=(const RevArcIt&) const {return true;}
291 /// Comparison operator
292 bool operator<(const RevArcIt&) const {return false;}
296 template <typename _Path>
299 function_requires<_path_bits::
300 PathDumperConstraints<Digraph, _Path> >();