68 /// |
68 /// |
69 /// This constuctor initializes the path from any other path type. |
69 /// This constuctor initializes the path from any other path type. |
70 /// It simply makes a copy of the given path. |
70 /// It simply makes a copy of the given path. |
71 template <typename CPath> |
71 template <typename CPath> |
72 Path(const CPath& cpath) { |
72 Path(const CPath& cpath) { |
73 copyPath(*this, cpath); |
73 pathCopy(cpath, *this); |
74 } |
74 } |
75 |
75 |
76 /// \brief Template copy assignment |
76 /// \brief Template copy assignment |
77 /// |
77 /// |
78 /// This operator makes a copy of a path of any other type. |
78 /// This operator makes a copy of a path of any other type. |
79 template <typename CPath> |
79 template <typename CPath> |
80 Path& operator=(const CPath& cpath) { |
80 Path& operator=(const CPath& cpath) { |
81 copyPath(*this, cpath); |
81 pathCopy(cpath, *this); |
82 return *this; |
82 return *this; |
83 } |
83 } |
84 |
84 |
85 /// \brief LEMON style iterator for path arcs |
85 /// \brief LEMON style iterator for path arcs |
86 /// |
86 /// |
256 /// |
256 /// |
257 /// This path can be initialized with any other path type. It just |
257 /// This path can be initialized with any other path type. It just |
258 /// makes a copy of the given path. |
258 /// makes a copy of the given path. |
259 template <typename CPath> |
259 template <typename CPath> |
260 SimplePath(const CPath& cpath) { |
260 SimplePath(const CPath& cpath) { |
261 copyPath(*this, cpath); |
261 pathCopy(cpath, *this); |
262 } |
262 } |
263 |
263 |
264 /// \brief Template copy assignment |
264 /// \brief Template copy assignment |
265 /// |
265 /// |
266 /// This path can be initialized with any other path type. It just |
266 /// This path can be initialized with any other path type. It just |
267 /// makes a copy of the given path. |
267 /// makes a copy of the given path. |
268 template <typename CPath> |
268 template <typename CPath> |
269 SimplePath& operator=(const CPath& cpath) { |
269 SimplePath& operator=(const CPath& cpath) { |
270 copyPath(*this, cpath); |
270 pathCopy(cpath, *this); |
271 return *this; |
271 return *this; |
272 } |
272 } |
273 |
273 |
274 /// \brief Iterator class to iterate on the arcs of the paths |
274 /// \brief Iterator class to iterate on the arcs of the paths |
275 /// |
275 /// |
926 typename enable_if<typename Path::BuildTag, void>::type |
926 typename enable_if<typename Path::BuildTag, void>::type |
927 > { |
927 > { |
928 static const bool value = true; |
928 static const bool value = true; |
929 }; |
929 }; |
930 |
930 |
931 template <typename Target, typename Source, |
931 template <typename From, typename To, |
932 bool buildEnable = BuildTagIndicator<Target>::value> |
932 bool buildEnable = BuildTagIndicator<To>::value> |
933 struct PathCopySelectorForward { |
933 struct PathCopySelectorForward { |
934 static void copy(Target& target, const Source& source) { |
934 static void copy(const From& from, To& to) { |
935 target.clear(); |
935 to.clear(); |
936 for (typename Source::ArcIt it(source); it != INVALID; ++it) { |
936 for (typename From::ArcIt it(from); it != INVALID; ++it) { |
937 target.addBack(it); |
937 to.addBack(it); |
938 } |
938 } |
939 } |
939 } |
940 }; |
940 }; |
941 |
941 |
942 template <typename Target, typename Source> |
942 template <typename From, typename To> |
943 struct PathCopySelectorForward<Target, Source, true> { |
943 struct PathCopySelectorForward<From, To, true> { |
944 static void copy(Target& target, const Source& source) { |
944 static void copy(const From& from, To& to) { |
945 target.clear(); |
945 to.clear(); |
946 target.build(source); |
946 to.build(from); |
947 } |
947 } |
948 }; |
948 }; |
949 |
949 |
950 template <typename Target, typename Source, |
950 template <typename From, typename To, |
951 bool buildEnable = BuildTagIndicator<Target>::value> |
951 bool buildEnable = BuildTagIndicator<To>::value> |
952 struct PathCopySelectorBackward { |
952 struct PathCopySelectorBackward { |
953 static void copy(Target& target, const Source& source) { |
953 static void copy(const From& from, To& to) { |
954 target.clear(); |
954 to.clear(); |
955 for (typename Source::RevArcIt it(source); it != INVALID; ++it) { |
955 for (typename From::RevArcIt it(from); it != INVALID; ++it) { |
956 target.addFront(it); |
956 to.addFront(it); |
957 } |
957 } |
958 } |
958 } |
959 }; |
959 }; |
960 |
960 |
961 template <typename Target, typename Source> |
961 template <typename From, typename To> |
962 struct PathCopySelectorBackward<Target, Source, true> { |
962 struct PathCopySelectorBackward<From, To, true> { |
963 static void copy(Target& target, const Source& source) { |
963 static void copy(const From& from, To& to) { |
964 target.clear(); |
964 to.clear(); |
965 target.buildRev(source); |
965 to.buildRev(from); |
966 } |
966 } |
967 }; |
967 }; |
968 |
968 |
969 |
969 |
970 template <typename Target, typename Source, |
970 template <typename From, typename To, |
971 bool revEnable = RevPathTagIndicator<Source>::value> |
971 bool revEnable = RevPathTagIndicator<From>::value> |
972 struct PathCopySelector { |
972 struct PathCopySelector { |
973 static void copy(Target& target, const Source& source) { |
973 static void copy(const From& from, To& to) { |
974 PathCopySelectorForward<Target, Source>::copy(target, source); |
974 PathCopySelectorForward<From, To>::copy(from, to); |
975 } |
975 } |
976 }; |
976 }; |
977 |
977 |
978 template <typename Target, typename Source> |
978 template <typename From, typename To> |
979 struct PathCopySelector<Target, Source, true> { |
979 struct PathCopySelector<From, To, true> { |
980 static void copy(Target& target, const Source& source) { |
980 static void copy(const From& from, To& to) { |
981 PathCopySelectorBackward<Target, Source>::copy(target, source); |
981 PathCopySelectorBackward<From, To>::copy(from, to); |
982 } |
982 } |
983 }; |
983 }; |
984 |
984 |
985 } |
985 } |
986 |
986 |
987 |
987 |
988 /// \brief Make a copy of a path. |
988 /// \brief Make a copy of a path. |
989 /// |
989 /// |
990 /// This function makes a copy of a path. |
990 /// This function makes a copy of a path. |
991 template <typename Target, typename Source> |
991 template <typename From, typename To> |
992 void copyPath(Target& target, const Source& source) { |
992 void pathCopy(const From& from, To& to) { |
993 checkConcept<concepts::PathDumper<typename Source::Digraph>, Source>(); |
993 checkConcept<concepts::PathDumper<typename From::Digraph>, From>(); |
994 _path_bits::PathCopySelector<Target, Source>::copy(target, source); |
994 _path_bits::PathCopySelector<From, To>::copy(from, to); |
|
995 } |
|
996 |
|
997 /// \brief Deprecated version of \ref pathCopy(). |
|
998 /// |
|
999 /// Deprecated version of \ref pathCopy() (only for reverse compatibility). |
|
1000 template <typename To, typename From> |
|
1001 void copyPath(To& to, const From& from) { |
|
1002 pathCopy(from, to); |
995 } |
1003 } |
996 |
1004 |
997 /// \brief Check the consistency of a path. |
1005 /// \brief Check the consistency of a path. |
998 /// |
1006 /// |
999 /// This function checks that the target of each arc is the same |
1007 /// This function checks that the target of each arc is the same |