gravatar
alpar (Alpar Juttner)
alpar@cs.elte.hu
Merge bugfix in #250
0 1 0
merge 1.0
0 files changed with 6 insertions and 4 deletions:
↑ Collapse diff ↑
Show white space 96 line context
... ...
@@ -970,108 +970,110 @@
970 970
    template <typename Target, typename Source,
971 971
              bool revEnable = RevPathTagIndicator<Source>::value>
972 972
    struct PathCopySelector {
973 973
      static void copy(Target& target, const Source& source) {
974 974
        PathCopySelectorForward<Target, Source>::copy(target, source);
975 975
      }      
976 976
    };
977 977

	
978 978
    template <typename Target, typename Source>
979 979
    struct PathCopySelector<Target, Source, true> {
980 980
      static void copy(Target& target, const Source& source) {
981 981
        PathCopySelectorBackward<Target, Source>::copy(target, source);
982 982
      }      
983 983
    };
984 984

	
985 985
  }
986 986

	
987 987

	
988 988
  /// \brief Make a copy of a path.
989 989
  ///
990 990
  ///  This function makes a copy of a path.
991 991
  template <typename Target, typename Source>
992 992
  void copyPath(Target& target, const Source& source) {
993 993
    checkConcept<concepts::PathDumper<typename Source::Digraph>, Source>();
994 994
    _path_bits::PathCopySelector<Target, Source>::copy(target, source);
995 995
  }
996 996

	
997 997
  /// \brief Check the consistency of a path.
998 998
  ///
999 999
  /// This function checks that the target of each arc is the same
1000 1000
  /// as the source of the next one.
1001 1001
  ///
1002 1002
  template <typename Digraph, typename Path>
1003 1003
  bool checkPath(const Digraph& digraph, const Path& path) {
1004 1004
    typename Path::ArcIt it(path);
1005 1005
    if (it == INVALID) return true;
1006 1006
    typename Digraph::Node node = digraph.target(it);
1007 1007
    ++it;
1008 1008
    while (it != INVALID) {
1009 1009
      if (digraph.source(it) != node) return false;
1010 1010
      node = digraph.target(it);
1011 1011
      ++it;
1012 1012
    }
1013 1013
    return true;
1014 1014
  }
1015 1015

	
1016 1016
  /// \brief The source of a path
1017 1017
  ///
1018
  /// This function returns the source of the given path.
1018
  /// This function returns the source node of the given path.
1019
  /// If the path is empty, then it returns \c INVALID.
1019 1020
  template <typename Digraph, typename Path>
1020 1021
  typename Digraph::Node pathSource(const Digraph& digraph, const Path& path) {
1021
    return digraph.source(path.front());
1022
    return path.empty() ? INVALID : digraph.source(path.front());
1022 1023
  }
1023 1024

	
1024 1025
  /// \brief The target of a path
1025 1026
  ///
1026
  /// This function returns the target of the given path.
1027
  /// This function returns the target node of the given path.
1028
  /// If the path is empty, then it returns \c INVALID.
1027 1029
  template <typename Digraph, typename Path>
1028 1030
  typename Digraph::Node pathTarget(const Digraph& digraph, const Path& path) {
1029
    return digraph.target(path.back());
1031
    return path.empty() ? INVALID : digraph.target(path.back());
1030 1032
  }
1031 1033

	
1032 1034
  /// \brief Class which helps to iterate through the nodes of a path
1033 1035
  ///
1034 1036
  /// In a sense, the path can be treated as a list of arcs. The
1035 1037
  /// lemon path type stores only this list. As a consequence, it
1036 1038
  /// cannot enumerate the nodes in the path and the zero length paths
1037 1039
  /// cannot have a source node.
1038 1040
  ///
1039 1041
  /// This class implements the node iterator of a path structure. To
1040 1042
  /// provide this feature, the underlying digraph should be passed to
1041 1043
  /// the constructor of the iterator.
1042 1044
  template <typename Path>
1043 1045
  class PathNodeIt {
1044 1046
  private:
1045 1047
    const typename Path::Digraph *_digraph;
1046 1048
    typename Path::ArcIt _it;
1047 1049
    typename Path::Digraph::Node _nd;
1048 1050

	
1049 1051
  public:
1050 1052

	
1051 1053
    typedef typename Path::Digraph Digraph;
1052 1054
    typedef typename Digraph::Node Node;
1053 1055

	
1054 1056
    /// Default constructor
1055 1057
    PathNodeIt() {}
1056 1058
    /// Invalid constructor
1057 1059
    PathNodeIt(Invalid)
1058 1060
      : _digraph(0), _it(INVALID), _nd(INVALID) {}
1059 1061
    /// Constructor
1060 1062
    PathNodeIt(const Digraph& digraph, const Path& path)
1061 1063
      : _digraph(&digraph), _it(path) {
1062 1064
      _nd = (_it != INVALID ? _digraph->source(_it) : INVALID);
1063 1065
    }
1064 1066
    /// Constructor
1065 1067
    PathNodeIt(const Digraph& digraph, const Path& path, const Node& src)
1066 1068
      : _digraph(&digraph), _it(path), _nd(src) {}
1067 1069

	
1068 1070
    ///Conversion to Digraph::Node
1069 1071
    operator Node() const {
1070 1072
      return _nd;
1071 1073
    }
1072 1074

	
1073 1075
    /// Next node
1074 1076
    PathNodeIt& operator++() {
1075 1077
      if (_it == INVALID) _nd = INVALID;
1076 1078
      else {
1077 1079
        _nd = _digraph->target(_it);
0 comments (0 inline)