Changeset 831:b6ae3446098a in lemon-0.x for src/hugo
- Timestamp:
- 09/12/04 23:46:26 (20 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@1129
- Location:
- src/hugo
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/hugo/path.h
r819 r831 30 30 #include <hugo/invalid.h> 31 31 #include <hugo/error.h> 32 #include <hugo/debug.h>32 //#include <hugo/debug.h> 33 33 34 34 namespace hugo { … … 49 49 //! 50 50 //! \todo Thoroughfully check all the range and consistency tests. 51 template<typename Graph , typename DM = DefaultDebugMode>51 template<typename Graph> 52 52 class DirPath { 53 53 public: … … 75 75 /// \warning It is an error if the two edges are not in order! 76 76 DirPath(const DirPath &P, const NodeIt &a, const NodeIt &b) { 77 if( DM::range_check && (!a.valid() || !b.valid)) {77 if(!a.valid() || !b.valid) { 78 78 // FIXME: this check should be more elaborate... 79 79 fault("DirPath, subpath ctor: invalid bounding nodes"); … … 88 88 /// \warning It is an error if the two edges are not in order! 89 89 DirPath(const DirPath &P, const EdgeIt &a, const EdgeIt &b) { 90 if ( DM::range_check && (!a.valid() || !b.valid)) {90 if (!a.valid() || !b.valid) { 91 91 // FIXME: this check should be more elaborate... 92 92 fault("DirPath, subpath ctor: invalid bounding nodes"); … … 108 108 /// Starting point of the path. 109 109 /// Returns INVALID if the path is empty. 110 GraphNode from() const {110 GraphNode tail() const { 111 111 return empty() ? INVALID : gr->tail(edges[0]); 112 112 } … … 115 115 /// End point of the path. 116 116 /// Returns INVALID if the path is empty. 117 GraphNode to() const {117 GraphNode head() const { 118 118 return empty() ? INVALID : gr->head(edges[length()-1]); 119 119 } … … 128 128 /// \brief Initializes node iterator to point to the node of a given index. 129 129 NodeIt& nth(NodeIt &i, int n) const { 130 if( DM::range_check && (n<0 || n>int(length())) )130 if(n<0 || n>int(length())) 131 131 fault("DirPath::nth: index out of range"); 132 132 return i=NodeIt(*this, n); … … 135 135 /// \brief Initializes edge iterator to point to the edge of a given index. 136 136 EdgeIt& nth(EdgeIt &i, int n) const { 137 if( DM::range_check && (n<0 || n>=int(length())) )137 if(n<0 || n>=int(length())) 138 138 fault("DirPath::nth: index out of range"); 139 139 return i=EdgeIt(*this, n); … … 149 149 static 150 150 It& next(It &e) { 151 if( DM::range_check &&!e.valid() )151 if( !e.valid() ) 152 152 fault("DirPath::next() on invalid iterator"); 153 153 return ++e; … … 157 157 /// given edge iterator. 158 158 NodeIt head(const EdgeIt& e) const { 159 if( DM::range_check &&!e.valid() )159 if( !e.valid() ) 160 160 fault("DirPath::head() on invalid iterator"); 161 161 return NodeIt(*this, e.idx+1); … … 165 165 /// given edge iterator. 166 166 NodeIt tail(const EdgeIt& e) const { 167 if( DM::range_check &&!e.valid() )167 if( !e.valid() ) 168 168 fault("DirPath::tail() on invalid iterator"); 169 169 return NodeIt(*this, e.idx); … … 253 253 operator const GraphNode& () const { 254 254 if(idx >= p->length()) 255 return p-> to();255 return p->head(); 256 256 else if(idx >= 0) 257 257 return p->gr->tail(p->edges[idx]); … … 313 313 ///\sa setStartNode 314 314 void pushFront(const GraphEdge& e) { 315 if( DM::consistensy_check && !empty() && P.gr->head(e)!=from() ) {315 if( !empty() && P.gr->head(e)!=tail() ) { 316 316 fault("DirPath::Builder::pushFront: nonincident edge"); 317 317 } … … 324 324 ///\sa setStartNode 325 325 void pushBack(const GraphEdge& e) { 326 if( DM::consistensy_check && !empty() && P.gr->tail(e)!=to() ) {326 if( !empty() && P.gr->tail(e)!=head() ) { 327 327 fault("DirPath::Builder::pushBack: nonincident edge"); 328 328 } … … 356 356 } 357 357 358 void reserveFront(size_t r) {} 359 void reserveBack(size_t r) {} 360 358 361 private: 359 362 bool empty() { … … 361 364 } 362 365 363 GraphNode from() const {366 GraphNode tail() const { 364 367 if( ! front.empty() ) 365 368 return P.gr->tail(front[front.size()-1]); … … 371 374 return INVALID; 372 375 } 373 GraphNode to() const {376 GraphNode head() const { 374 377 if( ! back.empty() ) 375 378 return P.gr->head(back[back.size()-1]); … … 412 415 //! 413 416 //! \todo Thoroughfully check all the range and consistency tests. 414 template<typename Graph , typename DM = DefaultDebugMode>417 template<typename Graph> 415 418 class UndirPath { 416 419 public: … … 438 441 /// \warning It is an error if the two edges are not in order! 439 442 UndirPath(const UndirPath &P, const NodeIt &a, const NodeIt &b) { 440 if( DM::range_check && (!a.valid() || !b.valid)) {443 if(!a.valid() || !b.valid) { 441 444 // FIXME: this check should be more elaborate... 442 445 fault("UndirPath, subpath ctor: invalid bounding nodes"); … … 451 454 /// \warning It is an error if the two edges are not in order! 452 455 UndirPath(const UndirPath &P, const EdgeIt &a, const EdgeIt &b) { 453 if( DM::range_check && (!a.valid() || !b.valid)) {456 if(!a.valid() || !b.valid) { 454 457 // FIXME: this check should be more elaborate... 455 458 fault("UndirPath, subpath ctor: invalid bounding nodes"); … … 471 474 /// Starting point of the path. 472 475 /// Returns INVALID if the path is empty. 473 GraphNode from() const {476 GraphNode tail() const { 474 477 return empty() ? INVALID : gr->tail(edges[0]); 475 478 } … … 478 481 /// End point of the path. 479 482 /// Returns INVALID if the path is empty. 480 GraphNode to() const {483 GraphNode head() const { 481 484 return empty() ? INVALID : gr->head(edges[length()-1]); 482 485 } … … 491 494 /// \brief Initializes node iterator to point to the node of a given index. 492 495 NodeIt& nth(NodeIt &i, int n) const { 493 if( DM::range_check && (n<0 || n>int(length())))496 if(n<0 || n>int(length())) 494 497 fault("UndirPath::nth: index out of range"); 495 498 return i=NodeIt(*this, n); … … 498 501 /// \brief Initializes edge iterator to point to the edge of a given index. 499 502 EdgeIt& nth(EdgeIt &i, int n) const { 500 if( DM::range_check && (n<0 || n>=int(length())))503 if(n<0 || n>=int(length())) 501 504 fault("UndirPath::nth: index out of range"); 502 505 return i=EdgeIt(*this, n); … … 512 515 static 513 516 It& next(It &e) { 514 if( DM::range_check &&!e.valid() )517 if( !e.valid() ) 515 518 fault("UndirPath::next() on invalid iterator"); 516 519 return ++e; … … 520 523 /// given edge iterator. 521 524 NodeIt head(const EdgeIt& e) const { 522 if( DM::range_check &&!e.valid() )525 if( !e.valid() ) 523 526 fault("UndirPath::head() on invalid iterator"); 524 527 return NodeIt(*this, e.idx+1); … … 528 531 /// given edge iterator. 529 532 NodeIt tail(const EdgeIt& e) const { 530 if( DM::range_check &&!e.valid() )533 if( !e.valid() ) 531 534 fault("UndirPath::tail() on invalid iterator"); 532 535 return NodeIt(*this, e.idx); … … 614 617 operator const GraphNode& () const { 615 618 if(idx >= p->length()) 616 return p-> to();619 return p->head(); 617 620 else if(idx >= 0) 618 621 return p->gr->tail(p->edges[idx]); … … 674 677 ///\sa setStartNode 675 678 void pushFront(const GraphEdge& e) { 676 if( DM::consistensy_check && !empty() && P.gr->head(e)!=from() ) {679 if( !empty() && P.gr->head(e)!=tail() ) { 677 680 fault("UndirPath::Builder::pushFront: nonincident edge"); 678 681 } … … 685 688 ///\sa setStartNode 686 689 void pushBack(const GraphEdge& e) { 687 if( DM::consistensy_check && !empty() && P.gr->tail(e)!=to() ) {690 if( !empty() && P.gr->tail(e)!=head() ) { 688 691 fault("UndirPath::Builder::pushBack: nonincident edge"); 689 692 } … … 717 720 } 718 721 722 void reserveFront(size_t r) {} 723 void reserveBack(size_t r) {} 724 719 725 private: 720 726 bool empty() { … … 722 728 } 723 729 724 GraphNode from() const {730 GraphNode tail() const { 725 731 if( ! front.empty() ) 726 732 return P.gr->tail(front[front.size()-1]); … … 732 738 return INVALID; 733 739 } 734 GraphNode to() const {740 GraphNode head() const { 735 741 if( ! back.empty() ) 736 742 return P.gr->head(back[back.size()-1]); … … 792 798 793 799 size_t length() const { return edges.size(); } 794 GraphNode from() const { return _first; }795 GraphNode to() const { return _last; }800 GraphNode tail() const { return _first; } 801 GraphNode head() const { return _last; } 796 802 797 803 NodeIt& first(NodeIt &n) const { return nth(n, 0); } -
src/hugo/skeletons/path.h
r823 r831 1 #define SKELETON2 1 // -*- c++ -*- // 3 2 … … 6 5 ///\brief Classes for representing paths in graphs. 7 6 8 #ifndef HUGO_ PATH_H9 #define HUGO_ PATH_H7 #ifndef HUGO_SKELETON_PATH_H 8 #define HUGO_SKELETON_PATH_H 10 9 11 10 #include <hugo/invalid.h> … … 15 14 /// \addtogroup skeletons 16 15 /// @{ 17 18 16 17 19 18 //! \brief A skeletom structure for representing directed paths in a graph. 20 19 //! 21 20 //! A skeleton structure for representing directed paths in a graph. 22 21 //! \param GR The graph type in which the path is. 23 //! 22 //! 24 23 //! In a sense, the path can be treated as a graph, for is has \c NodeIt 25 24 //! and \c EdgeIt with the same usage. These types converts to the \c Node … … 28 27 class Path { 29 28 public: 30 29 31 30 /// Type of the underlying graph. 32 31 typedef /*typename*/ GR Graph; 33 32 /// Edge type of the underlying graph. 34 typedef typename Graph::Edge GraphEdge; 33 typedef typename Graph::Edge GraphEdge; 35 34 /// Node type of the underlying graph. 36 35 typedef typename Graph::Node GraphNode; 37 36 class NodeIt; 38 37 class EdgeIt; 39 38 40 39 /// \param _G The graph in which the path is. 41 40 /// 42 41 Path(const Graph &_G) {} 43 42 44 43 /// Length of the path. 45 44 size_t length() const {return 0;} 46 45 /// Returns whether the path is empty. 47 bool empty() const { }48 46 bool empty() const { return true;} 47 49 48 /// Resets the path to an empty path. 50 49 void clear() {} … … 72 71 /// Returns node iterator pointing to the head node of the 73 72 /// given edge iterator. 74 NodeIt head(const EdgeIt& e) const { }73 NodeIt head(const EdgeIt& e) const {return INVALID;} 75 74 76 75 /// \brief The tail of an edge. … … 78 77 /// Returns node iterator pointing to the tail node of the 79 78 /// given edge iterator. 80 NodeIt tail(const EdgeIt& e) const { }79 NodeIt tail(const EdgeIt& e) const {return INVALID;} 81 80 82 81 … … 85 84 /** 86 85 * \brief Iterator class to iterate on the edges of the paths 87 * 86 * 88 87 * \ingroup skeletons 89 88 * This class is used to iterate on the edges of the paths 90 89 * 91 90 * Of course it converts to Graph::Edge 92 * 91 * 93 92 */ 94 93 class EdgeIt { … … 104 103 105 104 /// Next edge 106 EdgeIt& operator++() { }105 EdgeIt& operator++() {return *this;} 107 106 108 107 /// Comparison operator … … 118 117 /** 119 118 * \brief Iterator class to iterate on the nodes of the paths 120 * 119 * 121 120 * \ingroup skeletons 122 121 * This class is used to iterate on the nodes of the paths 123 122 * 124 123 * Of course it converts to Graph::Node. 125 * 124 * 126 125 */ 127 126 class NodeIt { … … 137 136 operator const GraphNode& () const {} 138 137 /// Next node 139 NodeIt& operator++() { }140 141 /// Comparison operator 142 bool operator==(const NodeIt& e) const { }143 /// Comparison operator 144 bool operator!=(const NodeIt& e) const { }138 NodeIt& operator++() {return *this;} 139 140 /// Comparison operator 141 bool operator==(const NodeIt& e) const {return true;} 142 /// Comparison operator 143 bool operator!=(const NodeIt& e) const {return true;} 145 144 // /// Comparison operator 146 145 // /// \todo It is not clear what is the "natural" ordering. … … 149 148 }; 150 149 151 friend class Builder; 150 friend class Builder; 152 151 153 152 /** 154 153 * \brief Class to build paths 155 * 154 * 156 155 * \ingroup skeletons 157 156 * This class is used to fill a path with edges. … … 175 174 176 175 /// Sets the starting node of the path. 177 176 178 177 /// Sets the starting node of the path. Edge added to the path 179 178 /// afterwards have to be incident to this node. … … 218 217 ///@} 219 218 } 220 219 221 220 } // namespace hugo 222 221 223 #endif // HUGO_ PATH_H222 #endif // HUGO_SKELETON_PATH_H
Note: See TracChangeset
for help on using the changeset viewer.