
 // -*- C++ -*-


 namespace Hurricane {

 /*! \class        Vertical
  *  \brief        Vertical description (\b API)
  *
  *  \section      secVerticalIntro  Introduction
  *
  *                A vertical has, in addition to inherited attributes, a 
  *                specific one : its abscissa. The vertical extend of the 
  *                segment is defined by the "source" and "target" components on 
  *                which it is anchored. 
  *
  *                This abscissa allows, among other things, to anchor a 
  *                vertical segment extremity on a component (i.e. a contact) 
  *                with a small horizontal offset without the need to 
  *                materialize it, because it is implicitely equal to the 
  *                difference between the vertical abscissa and the component 
  *                abscissa. It allows also, and it not the least interesting 
  *                feature, to anchor an extremity of a vertical directly on a 
  *                horizontal segment (and conversely) without the need to 
  *                create an intermediate contact (unless they are on different 
  *                layers!). The abscissa of the implicit contact point is the 
  *                one of the vertical and the ordinate the one of the 
  *                horizontal). 
  */



 /*! \typedef      Vertical::Inherit
  *                Useful for calling upon methods of the base class without 
  *                knowing it. 
  */

 /*! \name         Constructors
  */
 //  \{

 /*! \function     Vertical* Vertical::create(Component* source, Component* target, const Layer* layer,const DbU::Unit& x,const DbU::Unit& width = 0,const DbU::Unit& dySource = 0, const DbU::Unit& dyTarget = 0);
  *                creates and returns a vertical segment whose origin lies 
  *                (through an offset equal to \c \<dySource\>) on 
  *                \c \<source\>, whose extremity lies (through an offset equal 
  *                to \c \<dyTarget\>) on \c \<target\>, with layer 
  *                \c \<layer\>, located at abscissa \c \<x\> and of width 
  *                \c \<width\>. 
  *
  *  \caution      Throws an exception if any of the source, target or layer 
  *                pointers is null or if the two component don't belong to the 
  *                same net. 
  */

 /*! \function     Vertical* Vertical::create(Net* net, const Layer* layer, const DbU::Unit& x, const DbU::Unit& width = 0,const DbU::Unit& dySource = 0, const DbU::Unit& dyTarget = 0);
  *                creates and returns an absolute vertical segment with layer 
  *                \c \<layer\>, located at abscissa \c \<x\> and of width 
  *                \c \<width\>. The differents extremities ordinates are given 
  *                by \c \<dySource\> and \c \<dyTarget\>. 
  *
  *  \caution      Throws an exception if any of the net or layer pointers is 
  *                null. 
  */

 //  \}


 /*! \name         Accessors
  */
 //  \{

 /*! \function     const DbU::Unit& Vertical::getDySource() const;
  *  \Return       the relative source ordinate of the segment (may be absolute 
  *                if the source extremity isn't anchored). 
  *
  *  \remark       If you want to get the absolute one use the member function 
  *                getSourceX() defined at the Segment level. 
  */

 /*! \function     const DbU::Unit& Vertical::getDyTarget() const;
  *  \Return       the relative target ordinate of the segment (may be absolute 
  *                if the target extremity isn't anchored). 
  *
  *  \remark       If you want to get the absolute one use the member function 
  *                getTargetX() defined at the Segment level. 
  */

 //  \}


 /*! \name         Modifiers
  */
 //  \{

 /*! \function     void Vertical::setX(const DbU::Unit& x);
  *                sets the abscissa of the segment. 
  */

 /*! \function     void Vertical::translate(const DbU::Unit& dx);
  *                translate horizontaly the vertical segment of the quantity 
  *                \c \<dx\>. 
  */

 //  \}


 /*! \name         Vertical Collection
  */
 //  \{

 /*! \typedef      Verticals
  *                Generic collection representing a set of vertical segments. 
  */

 /*! \typedef      VerticalLocator
  *                Generic locator for traversing a collection of vertical 
  *                segments. 
  */

 /*! \typedef      VerticalFilter
  *                Generic filter allowing to select a subset of verticals 
  *                matching some criteria. 
  */

 /*! \def          for_each_vertical(vertical, verticals)
  *                Macro for visiting all the verticals of a collection of 
  *                vertical segments. 
  */

 //  \}


 }
