# HG changeset patch # User klao # Date 1079888956 0 # Node ID 616bc397c83a147ea87d7789b62fd4ce210880b8 # Parent b72b36a25170528aa2babce4ef5bfae522fbd90a Reszutas konstruktorok diff -r b72b36a25170 -r 616bc397c83a src/work/klao/path.h --- a/src/work/klao/path.h Sun Mar 21 16:16:08 2004 +0000 +++ b/src/work/klao/path.h Sun Mar 21 17:09:16 2004 +0000 @@ -10,6 +10,7 @@ #define HUGO_PATH_H #include +#include #include @@ -39,10 +40,13 @@ Path(Graph &_G) : G(_G), _first(INVALID), _last(INVALID) {} - /// Subpath defined by two nodes - Path(Path const& P, NodeIt a, NodeIt b) { FIXME; } - /// Subpath defined by tow edges. Contains edges in [a,b) - Path(Path const& P, EdgeIt a, EdgeIt b) { FIXME; } + /// Subpath defined by two nodes. + /// Nodes may be in reversed order, then + /// we contstruct the reversed path. + Path(const Path &P, const NodeIt &a, const NodeIt &b); + /// Subpath defined by two edges. Contains edges in [a,b) + /// It is an error if the two edges are not in order! + Path(const Path &P, const EdgeIt &a, const EdgeIt &b); size_t length() const { return edges.size(); } GraphNode from() const { return _first; } @@ -71,6 +75,11 @@ bool isForward(const EdgeIt &e) const { return e.forw; } + /// index of a node on the path. Returns length+2 for the invalid NodeIt + int index(const NodeIt &n) const { return n.idx; } + /// index of an edge on the path. Returns length+1 for the invalid EdgeIt + int index(const EdgeIt &e) const { return e.it - edges.begin(); } + EdgeIt& next(EdgeIt &e) const; NodeIt& next(NodeIt &n) const; template @@ -122,7 +131,7 @@ friend class Path; friend class EdgeIt; - int idx; + size_t idx; bool tail; // Is this node the tail of the edge with same idx? public: @@ -301,6 +310,7 @@ n.idx = e.it-edges.begin(); n.tail = e.forw; + return n; } template @@ -377,6 +387,43 @@ return n; } + // Reszut konstruktorok: + + + template + Path::Path(const Path &P, const EdgeIt &a, const EdgeIt &b) : + G(P.G), edges(a.it, b.it) // WARNING: if b.it < a.it this will blow up! + { + if( G.valid(P._first) && a.it < P.edges.end() ) { + _first = ( a.forw ? G.tail(*a.it) : G.head(*a.it) ); + if( b.it < P.edges.end() ) { + _last = ( b.forw ? G.tail(*b.it) : G.head(*b.it) ); + } + else { + _last = P._last; + } + } + } + + + template + Path::Path(const Path &P, const NodeIt &a, const NodeIt &b) : + G(P.G) + { + if( !P.valid(a) || !P.valid(b) ) + return; + + int ai = a.idx, bi = b.idx; + if( bi(1), P.nth(3)); + + cout << "P2.length() == " << P2.length() << endl; + check(P2.length() == 2); + + cout << "P2.from()==v1 ? " << (P2.from()==v1) << endl; + check(P2.from() == v1); + cout << "P2.to()==v3 ? " << (P2.to()==v3) << endl; + check(P2.to() == v3); + } + { + cout << "Reszut letrehozasa: [1. el, 6. el)..." << endl; + LPath P2(P, P.nth(0), P.nth(5)); + + cout << "P2.length() == " << P2.length() << endl; + check(P2.length() == 5); + + cout << "P2.from()==s ? " << (P2.from()==s) << endl; + check(P2.from() == s); + cout << "P2.to()==t ? " << (P2.to()==t) << endl; + check(P2.to() == t); + } + + { + cout << "Ket pont altal megadott reszut letrehozasa: [2. pont, 4. pont]..." + << endl; + LPath P2(P, P.nth(1), P.nth(3)); + + cout << "P2.length() == " << P2.length() << endl; + check(P2.length() == 2); + + cout << "P2.from()==v1 ? " << (P2.from()==v1) << endl; + check(P2.from() == v1); + cout << "P2.to()==v3 ? " << (P2.to()==v3) << endl; + check(P2.to() == v3); + } + { + cout << "Egy pontu reszut letrehozasa: [4. pont, 4. pont]..." + << endl; + LPath P2(P, P.nth(3), P.nth(3)); + + cout << "P2.length() == " << P2.length() << endl; + check(P2.length() == 0); + + cout << "P2.from()==v3 ? " << (P2.from()==v3) << endl; + check(P2.from() == v3); + cout << "P2.to()==v3 ? " << (P2.to()==v3) << endl; + check(P2.to() == v3); + } + { + cout << "Forditott ut letrehozasa: [6. pont, 1. pont]..." + << endl; + LPath P2(P, P.nth(5), P.nth(0)); + + cout << "P2.length() == " << P2.length() << endl; + check(P2.length() == 5); + + cout << "P2.from()==t ? " << (P2.from()==t) << endl; + check(P2.from() == t); + cout << "P2.to()==s ? " << (P2.to()==s) << endl; + check(P2.to() == s); + } cout << (passed ? "All tests passed." : "Some of the tests failed!!!")