COIN-OR::LEMON - Graph Library

source: lemon-1.2/lemon/concepts/path.h @ 902:79fab87ee483

Last change on this file since 902:79fab87ee483 was 785:9ae88e7c04a7, checked in by Peter Kovacs <kpeter@…>, 10 years ago

Doc improvements for Path and PathDumper? concepts (#331)

File size: 8.9 KB
RevLine 
[209]1/* -*- mode: C++; indent-tabs-mode: nil; -*-
[96]2 *
[209]3 * This file is a part of LEMON, a generic C++ optimization library.
[96]4 *
[440]5 * Copyright (C) 2003-2009
[96]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///\ingroup concept
20///\file
[785]21///\brief The concept of paths
[96]22///
23
[529]24#ifndef LEMON_CONCEPTS_PATH_H
25#define LEMON_CONCEPTS_PATH_H
[96]26
[220]27#include <lemon/core.h>
[96]28#include <lemon/concept_check.h>
29
30namespace lemon {
31  namespace concepts {
32
33    /// \addtogroup concept
34    /// @{
35
36    /// \brief A skeleton structure for representing directed paths in
37    /// a digraph.
38    ///
39    /// A skeleton structure for representing directed paths in a
[209]40    /// digraph.
[785]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.
45    ///
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
49    /// \ref checkPath().
50    /// The source and target nodes of a (consistent) path can be obtained
51    /// using \ref pathSource() and \ref pathTarget().
52    ///
53    /// A path can be constructed from another path of any type using the
54    /// copy constructor or the assignment operator.
55    ///
[559]56    /// \tparam GR The digraph type in which the path is.
57    template <typename GR>
[96]58    class Path {
59    public:
60
61      /// Type of the underlying digraph.
[559]62      typedef GR Digraph;
[96]63      /// Arc type of the underlying digraph.
64      typedef typename Digraph::Arc Arc;
65
66      class ArcIt;
67
68      /// \brief Default constructor
69      Path() {}
70
[785]71      /// \brief Template copy constructor
[96]72      template <typename CPath>
73      Path(const CPath& cpath) {}
74
[785]75      /// \brief Template assigment operator
[96]76      template <typename CPath>
[278]77      Path& operator=(const CPath& cpath) {
78        ignore_unused_variable_warning(cpath);
79        return *this;
80      }
[96]81
[785]82      /// Length of the path, i.e. the number of arcs on the path.
[96]83      int length() const { return 0;}
84
85      /// Returns whether the path is empty.
86      bool empty() const { return true;}
87
88      /// Resets the path to an empty path.
89      void clear() {}
90
[785]91      /// \brief LEMON style iterator for enumerating the arcs of a path.
[96]92      ///
[785]93      /// LEMON style iterator class for enumerating the arcs of a path.
[96]94      class ArcIt {
95      public:
[209]96        /// Default constructor
97        ArcIt() {}
98        /// Invalid constructor
99        ArcIt(Invalid) {}
[785]100        /// Sets the iterator to the first arc of the given path
[209]101        ArcIt(const Path &) {}
[96]102
[785]103        /// Conversion to \c Arc
[209]104        operator Arc() const { return INVALID; }
[96]105
[209]106        /// Next arc
107        ArcIt& operator++() {return *this;}
[96]108
[209]109        /// Comparison operator
110        bool operator==(const ArcIt&) const {return true;}
111        /// Comparison operator
112        bool operator!=(const ArcIt&) const {return true;}
[212]113        /// Comparison operator
114        bool operator<(const ArcIt&) const {return false;}
[96]115
116      };
117
118      template <typename _Path>
119      struct Constraints {
120        void constraints() {
121          Path<Digraph> pc;
122          _Path p, pp(pc);
123          int l = p.length();
124          int e = p.empty();
125          p.clear();
126
127          p = pc;
128
129          typename _Path::ArcIt id, ii(INVALID), i(p);
130
131          ++i;
132          typename Digraph::Arc ed = i;
133
134          e = (i == ii);
135          e = (i != ii);
136          e = (i < ii);
137
138          ignore_unused_variable_warning(l);
139          ignore_unused_variable_warning(pp);
140          ignore_unused_variable_warning(e);
141          ignore_unused_variable_warning(id);
142          ignore_unused_variable_warning(ii);
143          ignore_unused_variable_warning(ed);
144        }
145      };
146
147    };
148
149    namespace _path_bits {
[209]150
[96]151      template <typename _Digraph, typename _Path, typename RevPathTag = void>
152      struct PathDumperConstraints {
153        void constraints() {
154          int l = p.length();
155          int e = p.empty();
156
157          typename _Path::ArcIt id, i(p);
158
159          ++i;
160          typename _Digraph::Arc ed = i;
161
162          e = (i == INVALID);
163          e = (i != INVALID);
164
165          ignore_unused_variable_warning(l);
166          ignore_unused_variable_warning(e);
167          ignore_unused_variable_warning(id);
168          ignore_unused_variable_warning(ed);
169        }
170        _Path& p;
171      };
172
173      template <typename _Digraph, typename _Path>
174      struct PathDumperConstraints<
[209]175        _Digraph, _Path,
[96]176        typename enable_if<typename _Path::RevPathTag, void>::type
177      > {
178        void constraints() {
179          int l = p.length();
180          int e = p.empty();
181
182          typename _Path::RevArcIt id, i(p);
183
184          ++i;
185          typename _Digraph::Arc ed = i;
186
187          e = (i == INVALID);
188          e = (i != INVALID);
189
190          ignore_unused_variable_warning(l);
191          ignore_unused_variable_warning(e);
192          ignore_unused_variable_warning(id);
193          ignore_unused_variable_warning(ed);
194        }
195        _Path& p;
196      };
[209]197
[96]198    }
199
200
201    /// \brief A skeleton structure for path dumpers.
202    ///
203    /// A skeleton structure for path dumpers. The path dumpers are
[785]204    /// the generalization of the paths, they can enumerate the arcs
205    /// of the path either in forward or in backward order.
206    /// These classes are typically not used directly, they are rather
207    /// used to be assigned to a real path type.
[96]208    ///
209    /// The main purpose of this concept is that the shortest path
[785]210    /// algorithms can enumerate the arcs easily in reverse order.
211    /// In LEMON, such algorithms give back a (reverse) path dumper that
212    /// can be assigned to a real path. The dumpers can be implemented as
[96]213    /// an adaptor class to the predecessor map.
[559]214    ///
215    /// \tparam GR The digraph type in which the path is.
216    template <typename GR>
[96]217    class PathDumper {
218    public:
219
220      /// Type of the underlying digraph.
[559]221      typedef GR Digraph;
[96]222      /// Arc type of the underlying digraph.
223      typedef typename Digraph::Arc Arc;
224
[785]225      /// Length of the path, i.e. the number of arcs on the path.
[96]226      int length() const { return 0;}
227
228      /// Returns whether the path is empty.
229      bool empty() const { return true;}
230
231      /// \brief Forward or reverse dumping
232      ///
[785]233      /// If this tag is defined to be \c True, then reverse dumping
234      /// is provided in the path dumper. In this case, \c RevArcIt
235      /// iterator should be implemented instead of \c ArcIt iterator.
[96]236      typedef False RevPathTag;
237
[785]238      /// \brief LEMON style iterator for enumerating the arcs of a path.
[96]239      ///
[785]240      /// LEMON style iterator class for enumerating the arcs of a path.
[96]241      class ArcIt {
242      public:
[209]243        /// Default constructor
244        ArcIt() {}
245        /// Invalid constructor
246        ArcIt(Invalid) {}
[785]247        /// Sets the iterator to the first arc of the given path
[209]248        ArcIt(const PathDumper&) {}
[96]249
[785]250        /// Conversion to \c Arc
[209]251        operator Arc() const { return INVALID; }
[96]252
[209]253        /// Next arc
254        ArcIt& operator++() {return *this;}
[96]255
[209]256        /// Comparison operator
257        bool operator==(const ArcIt&) const {return true;}
258        /// Comparison operator
259        bool operator!=(const ArcIt&) const {return true;}
[212]260        /// Comparison operator
261        bool operator<(const ArcIt&) const {return false;}
[96]262
263      };
264
[785]265      /// \brief LEMON style iterator for enumerating the arcs of a path
266      /// in reverse direction.
[96]267      ///
[785]268      /// LEMON style iterator class for enumerating the arcs of a path
269      /// in reverse direction.
[96]270      class RevArcIt {
271      public:
[209]272        /// Default constructor
273        RevArcIt() {}
274        /// Invalid constructor
275        RevArcIt(Invalid) {}
[785]276        /// Sets the iterator to the last arc of the given path
[209]277        RevArcIt(const PathDumper &) {}
[96]278
[785]279        /// Conversion to \c Arc
[209]280        operator Arc() const { return INVALID; }
[96]281
[209]282        /// Next arc
283        RevArcIt& operator++() {return *this;}
[96]284
[209]285        /// Comparison operator
286        bool operator==(const RevArcIt&) const {return true;}
287        /// Comparison operator
288        bool operator!=(const RevArcIt&) const {return true;}
[212]289        /// Comparison operator
290        bool operator<(const RevArcIt&) const {return false;}
[96]291
292      };
293
294      template <typename _Path>
295      struct Constraints {
296        void constraints() {
297          function_requires<_path_bits::
298            PathDumperConstraints<Digraph, _Path> >();
299        }
300      };
301
302    };
303
304
305    ///@}
306  }
307
308} // namespace lemon
309
[529]310#endif
Note: See TracBrowser for help on using the repository browser.