src/lemon/path.h
changeset 1086 caa13d291528
parent 959 c80ef5912903
child 1151 b217fc69f913
equal deleted inserted replaced
1:f91605bee4ca 2:6959494c52e4
   109 
   109 
   110     /// \brief Starting point of the path.
   110     /// \brief Starting point of the path.
   111     ///
   111     ///
   112     /// Starting point of the path.
   112     /// Starting point of the path.
   113     /// Returns INVALID if the path is empty.
   113     /// Returns INVALID if the path is empty.
   114     GraphNode tail() const {
   114     GraphNode source() const {
   115       return empty() ? INVALID : gr->tail(edges[0]);
   115       return empty() ? INVALID : gr->source(edges[0]);
   116     }
   116     }
   117     /// \brief End point of the path.
   117     /// \brief End point of the path.
   118     ///
   118     ///
   119     /// End point of the path.
   119     /// End point of the path.
   120     /// Returns INVALID if the path is empty.
   120     /// Returns INVALID if the path is empty.
   121     GraphNode head() const {
   121     GraphNode target() const {
   122       return empty() ? INVALID : gr->head(edges[length()-1]);
   122       return empty() ? INVALID : gr->target(edges[length()-1]);
   123     }
   123     }
   124 
   124 
   125     /// \brief Initializes node or edge iterator to point to the first
   125     /// \brief Initializes node or edge iterator to point to the first
   126     /// node or edge.
   126     /// node or edge.
   127     ///
   127     ///
   137     /// \brief Initializes edge iterator to point to the edge of a given index.
   137     /// \brief Initializes edge iterator to point to the edge of a given index.
   138     EdgeIt& nth(EdgeIt &i, int n) const {
   138     EdgeIt& nth(EdgeIt &i, int n) const {
   139       return i=EdgeIt(*this, n);
   139       return i=EdgeIt(*this, n);
   140     }
   140     }
   141 
   141 
   142     /// \brief Returns node iterator pointing to the head node of the
   142     /// \brief Returns node iterator pointing to the target node of the
   143     /// given edge iterator.
   143     /// given edge iterator.
   144     NodeIt head(const EdgeIt& e) const {
   144     NodeIt target(const EdgeIt& e) const {
   145       return NodeIt(*this, e.idx+1);
   145       return NodeIt(*this, e.idx+1);
   146     }
   146     }
   147 
   147 
   148     /// \brief Returns node iterator pointing to the tail node of the
   148     /// \brief Returns node iterator pointing to the source node of the
   149     /// given edge iterator.
   149     /// given edge iterator.
   150     NodeIt tail(const EdgeIt& e) const {
   150     NodeIt source(const EdgeIt& e) const {
   151       return NodeIt(*this, e.idx);
   151       return NodeIt(*this, e.idx);
   152     }
   152     }
   153 
   153 
   154 
   154 
   155     /* Iterator classes */
   155     /* Iterator classes */
   228       bool valid() const { return idx!=-1; }
   228       bool valid() const { return idx!=-1; }
   229 
   229 
   230       ///Conversion to Graph::Node
   230       ///Conversion to Graph::Node
   231       operator const GraphNode& () const {
   231       operator const GraphNode& () const {
   232 	if(idx >= p->length())
   232 	if(idx >= p->length())
   233 	  return p->head();
   233 	  return p->target();
   234 	else if(idx >= 0)
   234 	else if(idx >= 0)
   235 	  return p->gr->tail(p->edges[idx]);
   235 	  return p->gr->source(p->edges[idx]);
   236 	else
   236 	else
   237 	  return INVALID;
   237 	  return INVALID;
   238       }
   238       }
   239       /// Next node
   239       /// Next node
   240       NodeIt& operator++() { ++idx; validate(); return *this; }
   240       NodeIt& operator++() { ++idx; validate(); return *this; }
   333     private:
   333     private:
   334       bool empty() {
   334       bool empty() {
   335 	return front.empty() && back.empty() && P.empty();
   335 	return front.empty() && back.empty() && P.empty();
   336       }
   336       }
   337 
   337 
   338       GraphNode tail() const {
   338       GraphNode source() const {
   339 	if( ! front.empty() )
   339 	if( ! front.empty() )
   340 	  return P.gr->tail(front[front.size()-1]);
   340 	  return P.gr->source(front[front.size()-1]);
   341 	else if( ! P.empty() )
   341 	else if( ! P.empty() )
   342 	  return P.gr->tail(P.edges[0]);
   342 	  return P.gr->source(P.edges[0]);
   343 	else if( ! back.empty() )
   343 	else if( ! back.empty() )
   344 	  return P.gr->tail(back[0]);
   344 	  return P.gr->source(back[0]);
   345 	else
   345 	else
   346 	  return INVALID;
   346 	  return INVALID;
   347       }
   347       }
   348       GraphNode head() const {
   348       GraphNode target() const {
   349 	if( ! back.empty() )
   349 	if( ! back.empty() )
   350 	  return P.gr->head(back[back.size()-1]);
   350 	  return P.gr->target(back[back.size()-1]);
   351 	else if( ! P.empty() )
   351 	else if( ! P.empty() )
   352 	  return P.gr->head(P.edges[P.length()-1]);
   352 	  return P.gr->target(P.edges[P.length()-1]);
   353 	else if( ! front.empty() )
   353 	else if( ! front.empty() )
   354 	  return P.gr->head(front[0]);
   354 	  return P.gr->target(front[0]);
   355 	else
   355 	else
   356 	  return INVALID;
   356 	  return INVALID;
   357       }
   357       }
   358 
   358 
   359     };
   359     };
   435 
   435 
   436     /// \brief Starting point of the path.
   436     /// \brief Starting point of the path.
   437     ///
   437     ///
   438     /// Starting point of the path.
   438     /// Starting point of the path.
   439     /// Returns INVALID if the path is empty.
   439     /// Returns INVALID if the path is empty.
   440     GraphNode tail() const {
   440     GraphNode source() const {
   441       return empty() ? INVALID : gr->tail(edges[0]);
   441       return empty() ? INVALID : gr->source(edges[0]);
   442     }
   442     }
   443     /// \brief End point of the path.
   443     /// \brief End point of the path.
   444     ///
   444     ///
   445     /// End point of the path.
   445     /// End point of the path.
   446     /// Returns INVALID if the path is empty.
   446     /// Returns INVALID if the path is empty.
   447     GraphNode head() const {
   447     GraphNode target() const {
   448       return empty() ? INVALID : gr->head(edges[length()-1]);
   448       return empty() ? INVALID : gr->target(edges[length()-1]);
   449     }
   449     }
   450 
   450 
   451     /// \brief Initializes node or edge iterator to point to the first
   451     /// \brief Initializes node or edge iterator to point to the first
   452     /// node or edge.
   452     /// node or edge.
   453     ///
   453     ///
   475     static
   475     static
   476     It& next(It &e) {
   476     It& next(It &e) {
   477       return ++e;
   477       return ++e;
   478     }
   478     }
   479 
   479 
   480     /// \brief Returns node iterator pointing to the head node of the
   480     /// \brief Returns node iterator pointing to the target node of the
   481     /// given edge iterator.
   481     /// given edge iterator.
   482     NodeIt head(const EdgeIt& e) const {
   482     NodeIt target(const EdgeIt& e) const {
   483       return NodeIt(*this, e.idx+1);
   483       return NodeIt(*this, e.idx+1);
   484     }
   484     }
   485 
   485 
   486     /// \brief Returns node iterator pointing to the tail node of the
   486     /// \brief Returns node iterator pointing to the source node of the
   487     /// given edge iterator.
   487     /// given edge iterator.
   488     NodeIt tail(const EdgeIt& e) const {
   488     NodeIt source(const EdgeIt& e) const {
   489       return NodeIt(*this, e.idx);
   489       return NodeIt(*this, e.idx);
   490     }
   490     }
   491 
   491 
   492 
   492 
   493 
   493 
   568       bool valid() const { return idx!=-1; }
   568       bool valid() const { return idx!=-1; }
   569 
   569 
   570       ///Conversion to Graph::Node
   570       ///Conversion to Graph::Node
   571       operator const GraphNode& () const {
   571       operator const GraphNode& () const {
   572 	if(idx >= p->length())
   572 	if(idx >= p->length())
   573 	  return p->head();
   573 	  return p->target();
   574 	else if(idx >= 0)
   574 	else if(idx >= 0)
   575 	  return p->gr->tail(p->edges[idx]);
   575 	  return p->gr->source(p->edges[idx]);
   576 	else
   576 	else
   577 	  return INVALID;
   577 	  return INVALID;
   578       }
   578       }
   579       /// Next node
   579       /// Next node
   580       NodeIt& operator++() { ++idx; validate(); return *this; }
   580       NodeIt& operator++() { ++idx; validate(); return *this; }
   674     private:
   674     private:
   675       bool empty() {
   675       bool empty() {
   676 	return front.empty() && back.empty() && P.empty();
   676 	return front.empty() && back.empty() && P.empty();
   677       }
   677       }
   678 
   678 
   679       GraphNode tail() const {
   679       GraphNode source() const {
   680 	if( ! front.empty() )
   680 	if( ! front.empty() )
   681 	  return P.gr->tail(front[front.size()-1]);
   681 	  return P.gr->source(front[front.size()-1]);
   682 	else if( ! P.empty() )
   682 	else if( ! P.empty() )
   683 	  return P.gr->tail(P.edges[0]);
   683 	  return P.gr->source(P.edges[0]);
   684 	else if( ! back.empty() )
   684 	else if( ! back.empty() )
   685 	  return P.gr->tail(back[0]);
   685 	  return P.gr->source(back[0]);
   686 	else
   686 	else
   687 	  return INVALID;
   687 	  return INVALID;
   688       }
   688       }
   689       GraphNode head() const {
   689       GraphNode target() const {
   690 	if( ! back.empty() )
   690 	if( ! back.empty() )
   691 	  return P.gr->head(back[back.size()-1]);
   691 	  return P.gr->target(back[back.size()-1]);
   692 	else if( ! P.empty() )
   692 	else if( ! P.empty() )
   693 	  return P.gr->head(P.edges[P.length()-1]);
   693 	  return P.gr->target(P.edges[P.length()-1]);
   694 	else if( ! front.empty() )
   694 	else if( ! front.empty() )
   695 	  return P.gr->head(front[0]);
   695 	  return P.gr->target(front[0]);
   696 	else
   696 	else
   697 	  return INVALID;
   697 	  return INVALID;
   698       }
   698       }
   699 
   699 
   700     };
   700     };