... | ... |
@@ -49,57 +49,57 @@ |
49 | 49 |
/// |
50 | 50 |
/// This implementation is a back and front insertable and erasable |
51 | 51 |
/// path type. It can be indexed in O(1) time. The front and back |
52 | 52 |
/// insertion and erase is done in O(1) (amortized) time. The |
53 | 53 |
/// implementation uses two vectors for storing the front and back |
54 | 54 |
/// insertions. |
55 | 55 |
template <typename _Digraph> |
56 | 56 |
class Path { |
57 | 57 |
public: |
58 | 58 |
|
59 | 59 |
typedef _Digraph Digraph; |
60 | 60 |
typedef typename Digraph::Arc Arc; |
61 | 61 |
|
62 | 62 |
/// \brief Default constructor |
63 | 63 |
/// |
64 | 64 |
/// Default constructor |
65 | 65 |
Path() {} |
66 | 66 |
|
67 | 67 |
/// \brief Template copy constructor |
68 | 68 |
/// |
69 | 69 |
/// This constuctor initializes the path from any other path type. |
70 | 70 |
/// It simply makes a copy of the given path. |
71 | 71 |
template <typename CPath> |
72 | 72 |
Path(const CPath& cpath) { |
73 |
|
|
73 |
pathCopy(cpath, *this); |
|
74 | 74 |
} |
75 | 75 |
|
76 | 76 |
/// \brief Template copy assignment |
77 | 77 |
/// |
78 | 78 |
/// This operator makes a copy of a path of any other type. |
79 | 79 |
template <typename CPath> |
80 | 80 |
Path& operator=(const CPath& cpath) { |
81 |
|
|
81 |
pathCopy(cpath, *this); |
|
82 | 82 |
return *this; |
83 | 83 |
} |
84 | 84 |
|
85 | 85 |
/// \brief LEMON style iterator for path arcs |
86 | 86 |
/// |
87 | 87 |
/// This class is used to iterate on the arcs of the paths. |
88 | 88 |
class ArcIt { |
89 | 89 |
friend class Path; |
90 | 90 |
public: |
91 | 91 |
/// \brief Default constructor |
92 | 92 |
ArcIt() {} |
93 | 93 |
/// \brief Invalid constructor |
94 | 94 |
ArcIt(Invalid) : path(0), idx(-1) {} |
95 | 95 |
/// \brief Initializate the iterator to the first arc of path |
96 | 96 |
ArcIt(const Path &_path) |
97 | 97 |
: path(&_path), idx(_path.empty() ? -1 : 0) {} |
98 | 98 |
|
99 | 99 |
private: |
100 | 100 |
|
101 | 101 |
ArcIt(const Path &_path, int _idx) |
102 | 102 |
: path(&_path), idx(_idx) {} |
103 | 103 |
|
104 | 104 |
public: |
105 | 105 |
|
... | ... |
@@ -237,58 +237,58 @@ |
237 | 237 |
/// |
238 | 238 |
/// This implementation is a just back insertable and erasable path |
239 | 239 |
/// type. It can be indexed in O(1) time. The back insertion and |
240 | 240 |
/// erasure is amortized O(1) time. This implementation is faster |
241 | 241 |
/// then the \c Path type because it use just one vector for the |
242 | 242 |
/// arcs. |
243 | 243 |
template <typename _Digraph> |
244 | 244 |
class SimplePath { |
245 | 245 |
public: |
246 | 246 |
|
247 | 247 |
typedef _Digraph Digraph; |
248 | 248 |
typedef typename Digraph::Arc Arc; |
249 | 249 |
|
250 | 250 |
/// \brief Default constructor |
251 | 251 |
/// |
252 | 252 |
/// Default constructor |
253 | 253 |
SimplePath() {} |
254 | 254 |
|
255 | 255 |
/// \brief Template copy constructor |
256 | 256 |
/// |
257 | 257 |
/// This path can be initialized with any other path type. It just |
258 | 258 |
/// makes a copy of the given path. |
259 | 259 |
template <typename CPath> |
260 | 260 |
SimplePath(const CPath& cpath) { |
261 |
|
|
261 |
pathCopy(cpath, *this); |
|
262 | 262 |
} |
263 | 263 |
|
264 | 264 |
/// \brief Template copy assignment |
265 | 265 |
/// |
266 | 266 |
/// This path can be initialized with any other path type. It just |
267 | 267 |
/// makes a copy of the given path. |
268 | 268 |
template <typename CPath> |
269 | 269 |
SimplePath& operator=(const CPath& cpath) { |
270 |
|
|
270 |
pathCopy(cpath, *this); |
|
271 | 271 |
return *this; |
272 | 272 |
} |
273 | 273 |
|
274 | 274 |
/// \brief Iterator class to iterate on the arcs of the paths |
275 | 275 |
/// |
276 | 276 |
/// This class is used to iterate on the arcs of the paths |
277 | 277 |
/// |
278 | 278 |
/// Of course it converts to Digraph::Arc |
279 | 279 |
class ArcIt { |
280 | 280 |
friend class SimplePath; |
281 | 281 |
public: |
282 | 282 |
/// Default constructor |
283 | 283 |
ArcIt() {} |
284 | 284 |
/// Invalid constructor |
285 | 285 |
ArcIt(Invalid) : path(0), idx(-1) {} |
286 | 286 |
/// \brief Initializate the constructor to the first arc of path |
287 | 287 |
ArcIt(const SimplePath &_path) |
288 | 288 |
: path(&_path), idx(_path.empty() ? -1 : 0) {} |
289 | 289 |
|
290 | 290 |
private: |
291 | 291 |
|
292 | 292 |
/// Constructor with starting point |
293 | 293 |
ArcIt(const SimplePath &_path, int _idx) |
294 | 294 |
: idx(_idx), path(&_path) {} |
... | ... |
@@ -416,65 +416,65 @@ |
416 | 416 |
// the std::list<> is incompatible |
417 | 417 |
// hard to create invalid iterator |
418 | 418 |
struct Node { |
419 | 419 |
Arc arc; |
420 | 420 |
Node *next, *prev; |
421 | 421 |
}; |
422 | 422 |
|
423 | 423 |
Node *first, *last; |
424 | 424 |
|
425 | 425 |
std::allocator<Node> alloc; |
426 | 426 |
|
427 | 427 |
public: |
428 | 428 |
|
429 | 429 |
/// \brief Default constructor |
430 | 430 |
/// |
431 | 431 |
/// Default constructor |
432 | 432 |
ListPath() : first(0), last(0) {} |
433 | 433 |
|
434 | 434 |
/// \brief Template copy constructor |
435 | 435 |
/// |
436 | 436 |
/// This path can be initialized with any other path type. It just |
437 | 437 |
/// makes a copy of the given path. |
438 | 438 |
template <typename CPath> |
439 | 439 |
ListPath(const CPath& cpath) : first(0), last(0) { |
440 |
|
|
440 |
pathCopy(cpath, *this); |
|
441 | 441 |
} |
442 | 442 |
|
443 | 443 |
/// \brief Destructor of the path |
444 | 444 |
/// |
445 | 445 |
/// Destructor of the path |
446 | 446 |
~ListPath() { |
447 | 447 |
clear(); |
448 | 448 |
} |
449 | 449 |
|
450 | 450 |
/// \brief Template copy assignment |
451 | 451 |
/// |
452 | 452 |
/// This path can be initialized with any other path type. It just |
453 | 453 |
/// makes a copy of the given path. |
454 | 454 |
template <typename CPath> |
455 | 455 |
ListPath& operator=(const CPath& cpath) { |
456 |
|
|
456 |
pathCopy(cpath, *this); |
|
457 | 457 |
return *this; |
458 | 458 |
} |
459 | 459 |
|
460 | 460 |
/// \brief Iterator class to iterate on the arcs of the paths |
461 | 461 |
/// |
462 | 462 |
/// This class is used to iterate on the arcs of the paths |
463 | 463 |
/// |
464 | 464 |
/// Of course it converts to Digraph::Arc |
465 | 465 |
class ArcIt { |
466 | 466 |
friend class ListPath; |
467 | 467 |
public: |
468 | 468 |
/// Default constructor |
469 | 469 |
ArcIt() {} |
470 | 470 |
/// Invalid constructor |
471 | 471 |
ArcIt(Invalid) : path(0), node(0) {} |
472 | 472 |
/// \brief Initializate the constructor to the first arc of path |
473 | 473 |
ArcIt(const ListPath &_path) |
474 | 474 |
: path(&_path), node(_path.first) {} |
475 | 475 |
|
476 | 476 |
protected: |
477 | 477 |
|
478 | 478 |
ArcIt(const ListPath &_path, Node *_node) |
479 | 479 |
: path(&_path), node(_node) {} |
480 | 480 |
|
... | ... |
@@ -742,65 +742,65 @@ |
742 | 742 |
/// This implementation is completly static, i.e. it can be copy constucted |
743 | 743 |
/// or copy assigned from another path, but otherwise it cannot be |
744 | 744 |
/// modified. |
745 | 745 |
/// |
746 | 746 |
/// Being the the most memory efficient path type in LEMON, |
747 | 747 |
/// it is intented to be |
748 | 748 |
/// used when you want to store a large number of paths. |
749 | 749 |
template <typename _Digraph> |
750 | 750 |
class StaticPath { |
751 | 751 |
public: |
752 | 752 |
|
753 | 753 |
typedef _Digraph Digraph; |
754 | 754 |
typedef typename Digraph::Arc Arc; |
755 | 755 |
|
756 | 756 |
/// \brief Default constructor |
757 | 757 |
/// |
758 | 758 |
/// Default constructor |
759 | 759 |
StaticPath() : len(0), arcs(0) {} |
760 | 760 |
|
761 | 761 |
/// \brief Template copy constructor |
762 | 762 |
/// |
763 | 763 |
/// This path can be initialized from any other path type. |
764 | 764 |
template <typename CPath> |
765 | 765 |
StaticPath(const CPath& cpath) : arcs(0) { |
766 |
|
|
766 |
pathCopy(cpath, *this); |
|
767 | 767 |
} |
768 | 768 |
|
769 | 769 |
/// \brief Destructor of the path |
770 | 770 |
/// |
771 | 771 |
/// Destructor of the path |
772 | 772 |
~StaticPath() { |
773 | 773 |
if (arcs) delete[] arcs; |
774 | 774 |
} |
775 | 775 |
|
776 | 776 |
/// \brief Template copy assignment |
777 | 777 |
/// |
778 | 778 |
/// This path can be made equal to any other path type. It simply |
779 | 779 |
/// makes a copy of the given path. |
780 | 780 |
template <typename CPath> |
781 | 781 |
StaticPath& operator=(const CPath& cpath) { |
782 |
|
|
782 |
pathCopy(cpath, *this); |
|
783 | 783 |
return *this; |
784 | 784 |
} |
785 | 785 |
|
786 | 786 |
/// \brief Iterator class to iterate on the arcs of the paths |
787 | 787 |
/// |
788 | 788 |
/// This class is used to iterate on the arcs of the paths |
789 | 789 |
/// |
790 | 790 |
/// Of course it converts to Digraph::Arc |
791 | 791 |
class ArcIt { |
792 | 792 |
friend class StaticPath; |
793 | 793 |
public: |
794 | 794 |
/// Default constructor |
795 | 795 |
ArcIt() {} |
796 | 796 |
/// Invalid constructor |
797 | 797 |
ArcIt(Invalid) : path(0), idx(-1) {} |
798 | 798 |
/// Initializate the constructor to the first arc of path |
799 | 799 |
ArcIt(const StaticPath &_path) |
800 | 800 |
: path(&_path), idx(_path.empty() ? -1 : 0) {} |
801 | 801 |
|
802 | 802 |
private: |
803 | 803 |
|
804 | 804 |
/// Constructor with starting point |
805 | 805 |
ArcIt(const StaticPath &_path, int _idx) |
806 | 806 |
: idx(_idx), path(&_path) {} |
... | ... |
@@ -907,112 +907,120 @@ |
907 | 907 |
static const bool value = false; |
908 | 908 |
}; |
909 | 909 |
|
910 | 910 |
template <typename Path> |
911 | 911 |
struct RevPathTagIndicator< |
912 | 912 |
Path, |
913 | 913 |
typename enable_if<typename Path::RevPathTag, void>::type |
914 | 914 |
> { |
915 | 915 |
static const bool value = true; |
916 | 916 |
}; |
917 | 917 |
|
918 | 918 |
template <typename Path, typename Enable = void> |
919 | 919 |
struct BuildTagIndicator { |
920 | 920 |
static const bool value = false; |
921 | 921 |
}; |
922 | 922 |
|
923 | 923 |
template <typename Path> |
924 | 924 |
struct BuildTagIndicator< |
925 | 925 |
Path, |
926 | 926 |
typename enable_if<typename Path::BuildTag, void>::type |
927 | 927 |
> { |
928 | 928 |
static const bool value = true; |
929 | 929 |
}; |
930 | 930 |
|
931 |
template <typename Target, typename Source, |
|
932 |
bool buildEnable = BuildTagIndicator<Target>::value> |
|
931 |
template <typename From, typename To, |
|
932 |
bool buildEnable = BuildTagIndicator<To>::value> |
|
933 | 933 |
struct PathCopySelectorForward { |
934 |
static void copy(Target& target, const Source& source) { |
|
935 |
target.clear(); |
|
936 |
for (typename Source::ArcIt it(source); it != INVALID; ++it) { |
|
937 |
target.addBack(it); |
|
934 |
static void copy(const From& from, To& to) { |
|
935 |
to.clear(); |
|
936 |
for (typename From::ArcIt it(from); it != INVALID; ++it) { |
|
937 |
to.addBack(it); |
|
938 | 938 |
} |
939 | 939 |
} |
940 | 940 |
}; |
941 | 941 |
|
942 |
template <typename Target, typename Source> |
|
943 |
struct PathCopySelectorForward<Target, Source, true> { |
|
944 |
static void copy(Target& target, const Source& source) { |
|
945 |
target.clear(); |
|
946 |
|
|
942 |
template <typename From, typename To> |
|
943 |
struct PathCopySelectorForward<From, To, true> { |
|
944 |
static void copy(const From& from, To& to) { |
|
945 |
to.clear(); |
|
946 |
to.build(from); |
|
947 | 947 |
} |
948 | 948 |
}; |
949 | 949 |
|
950 |
template <typename Target, typename Source, |
|
951 |
bool buildEnable = BuildTagIndicator<Target>::value> |
|
950 |
template <typename From, typename To, |
|
951 |
bool buildEnable = BuildTagIndicator<To>::value> |
|
952 | 952 |
struct PathCopySelectorBackward { |
953 |
static void copy(Target& target, const Source& source) { |
|
954 |
target.clear(); |
|
955 |
for (typename Source::RevArcIt it(source); it != INVALID; ++it) { |
|
956 |
target.addFront(it); |
|
953 |
static void copy(const From& from, To& to) { |
|
954 |
to.clear(); |
|
955 |
for (typename From::RevArcIt it(from); it != INVALID; ++it) { |
|
956 |
to.addFront(it); |
|
957 | 957 |
} |
958 | 958 |
} |
959 | 959 |
}; |
960 | 960 |
|
961 |
template <typename Target, typename Source> |
|
962 |
struct PathCopySelectorBackward<Target, Source, true> { |
|
963 |
static void copy(Target& target, const Source& source) { |
|
964 |
target.clear(); |
|
965 |
|
|
961 |
template <typename From, typename To> |
|
962 |
struct PathCopySelectorBackward<From, To, true> { |
|
963 |
static void copy(const From& from, To& to) { |
|
964 |
to.clear(); |
|
965 |
to.buildRev(from); |
|
966 | 966 |
} |
967 | 967 |
}; |
968 | 968 |
|
969 | 969 |
|
970 |
template <typename Target, typename Source, |
|
971 |
bool revEnable = RevPathTagIndicator<Source>::value> |
|
970 |
template <typename From, typename To, |
|
971 |
bool revEnable = RevPathTagIndicator<From>::value> |
|
972 | 972 |
struct PathCopySelector { |
973 |
static void copy(Target& target, const Source& source) { |
|
974 |
PathCopySelectorForward<Target, Source>::copy(target, source); |
|
973 |
static void copy(const From& from, To& to) { |
|
974 |
PathCopySelectorForward<From, To>::copy(from, to); |
|
975 | 975 |
} |
976 | 976 |
}; |
977 | 977 |
|
978 |
template <typename Target, typename Source> |
|
979 |
struct PathCopySelector<Target, Source, true> { |
|
980 |
static void copy(Target& target, const Source& source) { |
|
981 |
PathCopySelectorBackward<Target, Source>::copy(target, source); |
|
978 |
template <typename From, typename To> |
|
979 |
struct PathCopySelector<From, To, true> { |
|
980 |
static void copy(const From& from, To& to) { |
|
981 |
PathCopySelectorBackward<From, To>::copy(from, to); |
|
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 |
template <typename Target, typename Source> |
|
992 |
void copyPath(Target& target, const Source& source) { |
|
993 |
checkConcept<concepts::PathDumper<typename Source::Digraph>, Source>(); |
|
994 |
_path_bits::PathCopySelector<Target, Source>::copy(target, source); |
|
991 |
template <typename From, typename To> |
|
992 |
void pathCopy(const From& from, To& to) { |
|
993 |
checkConcept<concepts::PathDumper<typename From::Digraph>, From>(); |
|
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 | 1005 |
/// \brief Check the consistency of a path. |
998 | 1006 |
/// |
999 | 1007 |
/// This function checks that the target of each arc is the same |
1000 | 1008 |
/// as the source of the next one. |
1001 | 1009 |
/// |
1002 | 1010 |
template <typename Digraph, typename Path> |
1003 | 1011 |
bool checkPath(const Digraph& digraph, const Path& path) { |
1004 | 1012 |
typename Path::ArcIt it(path); |
1005 | 1013 |
if (it == INVALID) return true; |
1006 | 1014 |
typename Digraph::Node node = digraph.target(it); |
1007 | 1015 |
++it; |
1008 | 1016 |
while (it != INVALID) { |
1009 | 1017 |
if (digraph.source(it) != node) return false; |
1010 | 1018 |
node = digraph.target(it); |
1011 | 1019 |
++it; |
1012 | 1020 |
} |
1013 | 1021 |
return true; |
1014 | 1022 |
} |
1015 | 1023 |
|
1016 | 1024 |
/// \brief The source of a path |
1017 | 1025 |
/// |
1018 | 1026 |
/// This function returns the source node of the given path. |
0 comments (0 inline)