[Lemon-commits] Alpar Juttner: Merge path_utils.h into path.h
Lemon HG
hg at lemon.cs.elte.hu
Thu Mar 20 13:13:47 CET 2008
details: http://lemon.cs.elte.hu/hg/lemon/rev/c4582fc14f58
changeset: 98:c4582fc14f58
user: Alpar Juttner <alpar [at] cs.elte.hu>
date: Thu Jan 24 17:36:45 2008 +0000
description:
Merge path_utils.h into path.h
diffstat:
3 files changed, 176 insertions(+), 207 deletions(-)
lemon/Makefile.am | 1
lemon/path.h | 177 ++++++++++++++++++++++++++++++++++++++++++++
lemon/path_utils.h | 205 ----------------------------------------------------
diffs (truncated from 414 to 300 lines):
diff -r ee1324c91288 -r c4582fc14f58 lemon/Makefile.am
--- a/lemon/Makefile.am Thu Jan 24 16:49:10 2008 +0000
+++ b/lemon/Makefile.am Thu Jan 24 17:36:45 2008 +0000
@@ -18,7 +18,6 @@ lemon_HEADERS += \
lemon/dim2.h \
lemon/maps.h \
lemon/path.h \
- lemon/path_utils.h \
lemon/random.h \
lemon/list_graph.h \
lemon/tolerance.h
diff -r ee1324c91288 -r c4582fc14f58 lemon/path.h
--- a/lemon/path.h Thu Jan 24 16:49:10 2008 +0000
+++ b/lemon/path.h Thu Jan 24 17:36:45 2008 +0000
@@ -27,7 +27,6 @@
#include <vector>
#include <algorithm>
-#include <lemon/path_utils.h>
#include <lemon/error.h>
#include <lemon/bits/invalid.h>
@@ -896,6 +895,182 @@ namespace lemon {
Arc* arcs;
};
+ ///////////////////////////////////////////////////////////////////////
+ // Additional utilities
+ ///////////////////////////////////////////////////////////////////////
+
+ namespace _path_bits {
+
+ template <typename Path, typename Enable = void>
+ struct RevTagIndicator {
+ static const bool value = false;
+ };
+
+ template <typename Digraph>
+ struct RevTagIndicator<
+ Digraph,
+ typename enable_if<typename Digraph::RevTag, void>::type
+ > {
+ static const bool value = true;
+ };
+
+ template <typename Target, typename Source,
+ typename BuildEnable = void, typename RevEnable = void>
+ struct PathCopySelector {
+ static void copy(Target& target, const Source& source) {
+ target.clear();
+ for (typename Source::ArcIt it(source); it != INVALID; ++it) {
+ target.addBack(it);
+ }
+ }
+ };
+
+ template <typename Target, typename Source, typename BuildEnable>
+ struct PathCopySelector<
+ Target, Source, BuildEnable,
+ typename enable_if<typename Source::RevPathTag, void>::type> {
+ static void copy(Target& target, const Source& source) {
+ target.clear();
+ for (typename Source::RevArcIt it(source); it != INVALID; ++it) {
+ target.addFront(it);
+ }
+ }
+ };
+
+ template <typename Target, typename Source, typename RevEnable>
+ struct PathCopySelector<
+ Target, Source,
+ typename enable_if<typename Target::BuildTag, void>::type, RevEnable> {
+ static void copy(Target& target, const Source& source) {
+ target.clear();
+ target.build(source);
+ }
+ };
+
+ template <typename Target, typename Source>
+ struct PathCopySelector<
+ Target, Source,
+ typename enable_if<typename Target::BuildTag, void>::type,
+ typename enable_if<typename Source::RevPathTag, void>::type> {
+ static void copy(Target& target, const Source& source) {
+ target.clear();
+ target.buildRev(source);
+ }
+ };
+
+ }
+
+
+ /// \brief Make a copy of a path.
+ ///
+ /// This function makes a copy of a path.
+ template <typename Target, typename Source>
+ void copyPath(Target& target, const Source& source) {
+ checkConcept<concepts::PathDumper<typename Source::Digraph>, Source>();
+ _path_bits::PathCopySelector<Target, Source>::copy(target, source);
+ }
+
+ /// \brief Check the consistency of a path.
+ ///
+ /// This function checks that the target of each arc is the same
+ /// as the source of the next one.
+ ///
+ template <typename Digraph, typename Path>
+ bool checkPath(const Digraph& digraph, const Path& path) {
+ typename Path::ArcIt it(path);
+ if (it == INVALID) return true;
+ typename Digraph::Node node = digraph.target(it);
+ ++it;
+ while (it != INVALID) {
+ if (digraph.source(it) != node) return false;
+ node = digraph.target(it);
+ ++it;
+ }
+ return true;
+ }
+
+ /// \brief The source of a path
+ ///
+ /// This function returns the source of the given path.
+ template <typename Digraph, typename Path>
+ typename Digraph::Node pathSource(const Digraph& digraph, const Path& path) {
+ return digraph.source(path.front());
+ }
+
+ /// \brief The target of a path
+ ///
+ /// This function returns the target of the given path.
+ template <typename Digraph, typename Path>
+ typename Digraph::Node pathTarget(const Digraph& digraph, const Path& path) {
+ return digraph.target(path.back());
+ }
+
+ /// \brief Class which helps to iterate through the nodes of a path
+ ///
+ /// In a sense, the path can be treated as a list of arcs. The
+ /// lemon path type stores only this list. As a consequence, it
+ /// cannot enumerate the nodes in the path and the zero length paths
+ /// cannot have a source node.
+ ///
+ /// This class implements the node iterator of a path structure. To
+ /// provide this feature, the underlying digraph should be passed to
+ /// the constructor of the iterator.
+ template <typename Path>
+ class PathNodeIt {
+ private:
+ const typename Path::Digraph *_digraph;
+ typename Path::ArcIt _it;
+ typename Path::Digraph::Node _nd;
+
+ public:
+
+ typedef typename Path::Digraph Digraph;
+ typedef typename Digraph::Node Node;
+
+ /// Default constructor
+ PathNodeIt() {}
+ /// Invalid constructor
+ PathNodeIt(Invalid)
+ : _digraph(0), _it(INVALID), _nd(INVALID) {}
+ /// Constructor
+ PathNodeIt(const Digraph& digraph, const Path& path)
+ : _digraph(&digraph), _it(path) {
+ _nd = (_it != INVALID ? _digraph->source(_it) : INVALID);
+ }
+ /// Constructor
+ PathNodeIt(const Digraph& digraph, const Path& path, const Node& src)
+ : _digraph(&digraph), _it(path), _nd(src) {}
+
+ ///Conversion to Digraph::Node
+ operator Node() const {
+ return _nd;
+ }
+
+ /// Next node
+ PathNodeIt& operator++() {
+ if (_it == INVALID) _nd = INVALID;
+ else {
+ _nd = _digraph->target(_it);
+ ++_it;
+ }
+ return *this;
+ }
+
+ /// Comparison operator
+ bool operator==(const PathNodeIt& n) const {
+ return _it == n._it && _nd == n._nd;
+ }
+ /// Comparison operator
+ bool operator!=(const PathNodeIt& n) const {
+ return _it != n._it || _nd != n._nd;
+ }
+ /// Comparison operator
+ bool operator<(const PathNodeIt& n) const {
+ return (_it < n._it && _nd != INVALID);
+ }
+
+ };
+
///@}
} // namespace lemon
diff -r ee1324c91288 -r c4582fc14f58 lemon/path_utils.h
--- a/lemon/path_utils.h Thu Jan 24 16:49:10 2008 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,205 +0,0 @@
-/* -*- C++ -*-
- *
- * This file is a part of LEMON, a generic C++ optimization library
- *
- * Copyright (C) 2003-2008
- * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
- * (Egervary Research Group on Combinatorial Optimization, EGRES).
- *
- * Permission to use, modify and distribute this software is granted
- * provided that this copyright notice appears in all copies. For
- * precise terms see the accompanying LICENSE file.
- *
- * This software is provided "AS IS" with no warranty of any kind,
- * express or implied, and with no claim as to its suitability for any
- * purpose.
- *
- */
-
-///\ingroup paths
-///\file
-///\brief Classes for representing paths in digraphs.
-///
-
-#ifndef LEMON_PATH_UTILS_H
-#define LEMON_PATH_UTILS_H
-
-#include <lemon/concepts/path.h>
-
-namespace lemon {
-
- namespace _path_bits {
-
- template <typename Path, typename Enable = void>
- struct RevTagIndicator {
- static const bool value = false;
- };
-
- template <typename Digraph>
- struct RevTagIndicator<
- Digraph,
- typename enable_if<typename Digraph::RevTag, void>::type
- > {
- static const bool value = true;
- };
-
- template <typename Target, typename Source,
- typename BuildEnable = void, typename RevEnable = void>
- struct PathCopySelector {
- static void copy(Target& target, const Source& source) {
- target.clear();
- for (typename Source::ArcIt it(source); it != INVALID; ++it) {
- target.addBack(it);
- }
- }
- };
-
- template <typename Target, typename Source, typename BuildEnable>
- struct PathCopySelector<
- Target, Source, BuildEnable,
- typename enable_if<typename Source::RevPathTag, void>::type> {
- static void copy(Target& target, const Source& source) {
- target.clear();
- for (typename Source::RevArcIt it(source); it != INVALID; ++it) {
- target.addFront(it);
- }
- }
- };
-
- template <typename Target, typename Source, typename RevEnable>
- struct PathCopySelector<
- Target, Source,
- typename enable_if<typename Target::BuildTag, void>::type, RevEnable> {
- static void copy(Target& target, const Source& source) {
- target.clear();
- target.build(source);
- }
- };
-
- template <typename Target, typename Source>
- struct PathCopySelector<
- Target, Source,
- typename enable_if<typename Target::BuildTag, void>::type,
- typename enable_if<typename Source::RevPathTag, void>::type> {
- static void copy(Target& target, const Source& source) {
- target.clear();
- target.buildRev(source);
- }
- };
-
- }
-
More information about the Lemon-commits
mailing list