
 // -*- C++ -*-


 namespace Hurricane {

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



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


 /*! \function     Horizontal* Horizontal::create(Component* source, Component* target, const Layer* layer,const DbU::Unit& y, const DbU::Unit& width = 0,const DbU::Unit& dxSource = 0, const DbU::Unit& dxTarget = 0);
  *                No description.
  */

 /*! \function     Horizontal* Horizontal::create(Net* net, const Layer* layer, const DbU::Unit& y, const DbU::Unit& width = 0,const DbU::Unit& dxSource = 0, const DbU::Unit& dxTarget = 0);
  *                creates and returns an absolute horizontal segment with layer 
  *                \c \<layer\>, located at ordinate \c \<y\> and of width 
  *                \c \<width\>. The differents extremities abscissas are given 
  *                by \c \<dxSource\> and \c \<dxTarget\>. 
  *
  *  \caution      Throws an exception if any of the net or layer pointers is 
  *                null. 
  */


 /*! \function     const DbU::Unit& Horizontal::getDxSource() const;
  *  \Return       the relative source abscissa 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 
  *                getSourceY() defined at the Segment level. 
  */

 /*! \function     const DbU::Unit& Horizontal::getDxTarget() const;
  *  \Return       the relative target abscissa 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 
  *                getTargetY() defined at the Segment level. 
  */


 /*! \function     void Horizontal::setY(const DbU::Unit& x);
  *                sets the ordinate of the segment. 
  */

 /*! \function     void Horizontal::translate(const DbU::Unit& dy);
  *                translate verticaly the horizontal segment of the quantity 
  *                \c \<dy\>. 
  */


 //! \name         Horizontal Collection
 //  \{

 /*! \typedef      Horizontals
  *                Generic collection representing a set of horizontal segments. 
  */

 /*! \typedef      HorizontalLocator
  *                Generic locator for traversing a collection of horizontal 
  *                segments. 
  */

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

 /*! \def          for_each_horizontal(horizontal, horizontals)
  *                Macro for visiting all the horizontals of a collection of 
  *                horizontal segments. 
  */

 //  \}


 }
