namespace CGAL {

/*! \ingroup PkgArrangementOnSurface2TraitsClasses
 *
 * The traits class `Arr_rational_function_traits_2` is a model of the
 * `AosTraits_2` concept. It handles bounded and unbounded arcs of
 * rational functions, referred to as <i>rational arcs</i> (in particular, such
 * an arc may correspond to the entire graph of a rational function). It
 * supports bounded and unbounded arcs. Thus, it is also a model of the concept
 * `AosOpenBoundaryTraits_2`. The traits class enables the construction
 * and maintenance of arrangements of such arcs.
 *
 * A rational function \f$y = \frac{P(x)}{Q(x)}\f$ is defined by two polynomials
 * \f$P\f$ and \f$Q\f$ of arbitrary degrees.  If \f$Q(x) = 1\f$ then the
 * function is a simple polynomial function.  Usually the domain is
 * \f$\mathbb{R}\f$ but the function may also be restricted to a bounded
 * interval \f$[x_{\rm min}, x_{\rm max}]\f$ or defined over a ray
 * \f$(-\infty,x_{\rm max}]\f$ or over \f$[x_{\rm min}, \infty)\f$.  Rational
 * functions are represented by the nested type `Curve_2`.  Note that a rational
 * function may be not continuous since roots of \f$Q\f$ induce vertical asymptotes,
 * which would contradict the notion of an \f$x\f$-monotone curve as it is introduced
 * by the `AosTraits_2` concept.  Thus, continuous portions of rational functions are
 * represented by the nested type `X_monotone_curve_2`, which is different from
 * `Curve_2`.  Constructors for both classes are provided by the traits.  A `Curve_2`
 * may be split up into several `X_monotone_curve_2` using `Make_x_monotone_2`.
 *
 * The template parameter of the traits must be a model of the concept
 * `AlgebraicKernel_d_1`.  A rational function is then represented by two
 * polynomials \f$P\f$ and \f$Q\f$ of type
 * `AlgebraicKernel_d_1::Polynomial_1`.  A point is represented by a rational
 * function and its \f$x\f$-coordinate, which is of type
 * `AlgebraicKernel_d_1::Algebraic_real_1`.  Note that an explicit
 * representation of the \f$y\f$-coordinate is only computed upon request,
 * which can be a rather costly operation.
 *
 * The constructed rational functions are cached by the traits class.  The cache
 * is local to each traits class object.  It is therefore necessary to construct
 * the curves using the constructor objects provided by member functions of the
 * traits class.  Moreover, a curve must only be used with its own traits.  The
 * cache is automatically cleaned up from time to time.  The amortized clean up
 * costs are constant. However, there is also a separate member function that
 * cleans up the cache on demand.
 *
 * While `Arr_rational_function_traits_2` models the concept
 * `AosDirectionalXMonotoneTraits_2`, the implementation of the
 * `Are_mergeable_2` operation does not enforce the input curves to have the
 * same direction as a precondition. Moreover, `Arr_rational_function_traits_2`
 * supports the merging of curves of opposite directions.
 *
 * \cgalModels{AosTraits_2,AosDirectionalXMonotoneTraits_2,AosOpenBoundaryTraits_2}
 */
template <typename AlgebraicKernel_d_1>
class Arr_rational_function_traits_2 {
public:
  /// \name Types
  /// @{

  ///
  typedef AlgebraicKernel_d_1 Algebraic_kernel_d_1;

  ///
  typedef AlgebraicKernel_d_1::Coefficient Coefficient;

  ///
  typedef AlgebraicKernel_d_1::Polynomial_1 Polynomial_1;

  ///
  typedef AlgebraicKernel_d_1::Algebraic_real_1 Algebraic_real_1;

  ///
  typedef AlgebraicKernel_d_1::Bound Bound;

  /// @}

  /// \name Creation
  /// @{

  /*! constructs an empty traits that uses the kernel pointed by `kernel`
   * for performing algebraic operations.
   */
  Arr_rational_function_traits_2<AlgebraicKernel_d_1>(const Algebraic_kernel_d_1* kernel);

  /// @}

  /// \name Operations
  /// @{

  /*! returns an instance of `Construct_curve_2`.
   */
  Construct_curve_2 construct_curve_2_object() const;

  /*! returns an instance of `Construct_x_monotone_curve_2`.
   */
  Construct_x_monotone_curve_2 construct_x_monotone_curve_2_object() const;

  /*! deletes all curves from the cache that exist only there.
   */
  void cleanup_cache() const;

  /*! returns a pointer to the used algebraic kernel object.
   */
  const Algebraic_kernel_d_1* algebraic_kernel_d_1() const;

  /// @}

  /*! Functor to construct a `Curve_2`. To enable caching the class is not
   * default constructible and must be obtained via the function
   * `construct_curve_2_object()`, which is a member of the traits.
   *
   * \cgalModels{Assignable,CopyConstructible,AdaptableBinaryFunction,AdaptableUnaryFunction}
   */
  class Construct_curve_2 {
  public:
    /// \name Types
    /// @{

    ///
    typedef AlgebraicKernel_d_1::Polynomial_1 Polynomial_1;

    ///
    typedef AlgebraicKernel_d_1::Algebraic_real_1 Algebraic_real_1;

    ///
    typedef Arr_rational_function_traits_2<AlgebraicKernel_d_1>::Curve_2 result_type;

    ///
    typedef Polynomial_1 argument_type;

    ///
    typedef Polynomial_1 first_argument_type;

    ///
    typedef Polynomial_1 second_argument_type;

    /// @}

    /// \name Operations
    /// @{

    /*! constructs a curve representing the polynomial function \f$y = P(x)\f$.
     */
    Curve_2 operator()(Polynomial_1 P) const;

    /*! constructs a curve representing the polynomial function \f$y = P(x)\f$.
     * The function is defined over the interval \f$[x,+\infty)\f$ if \f$right\f$
     * is true and \f$(-\infty,x]\f$ otherwise.
     */
    Curve_2 operator()(Polynomial_1 P, const Algebraic_real_1& x,
                       bool right) const;

    /*! constructs a curve representing the polynomial function \f$y = P(x)\f$.
     * The function is defined over the interval \f$[lower,upper]\f$.
     */
    Curve_2 operator()(Polynomial_1 P, const Algebraic_real_1& lower,
                       const Algebraic_real_1& upper) const;

    /*! constructs a curve representing the rational function \f$y = P(x)/Q(x)\f$.
     */
    Curve_2 operator()(Polynomial_1 P, Polynomial_1 Q) const;

    /*! constructs a curve representing the rational function \f$y = P(x)/Q(x)\f$.
     * The function is defined over the interval
     * \f$I=[x,+\infty)\f$ if \f$right\f$ is true and
     * \f$I=(-\infty,x]\f$ otherwise.
     */
    Curve_2 operator()(Polynomial_1 P, Polynomial_1 Q,
                       const Algebraic_real_1& x, bool right) const;

    /*! constructs a curve representing the rational function \f$y = P(x)/Q(x)\f$.
     * The function is defined over the interval \f$I=[lower,upper]\f$.
     */
    Curve_2 operator()(Polynomial_1 P, Polynomial_1 Q,
                       const Algebraic_real_1& lower,
                       const Algebraic_real_1& upper) const;

    /*! constructs a curve representing the polynomial function \f$y = P(x)\f$,
     * where the coefficients of \f$P\f$ are given in the range `[begin,end)`.
     */
    template <typename InputIterator>
    Curve_2 operator()(InputIterator begin, InputIterator end) const;

    /*! constructs a curve representing the polynomial function \f$y = P(x)\f$,
     * where the coefficients of \f$P\f$ are given in the range `[begin,end)`.
     * The function is defined over the interval
     * \f$[x,+\infty)\f$ if \f$right\f$ is true and \f$(-\infty,x]\f$ otherwise.
     */
    template <typename InputIterator>
    Curve_2 operator()(InputIterator begin, InputIterator end,
                       const Algebraic_real_1& x, bool right) const;

    /*! constructs a curve representing the polynomial function \f$y = P(x)\f$,
     * where the coefficients of \f$P\f$ are given in the range `[begin,end)`.
     * The function is defined over the interval \f$[lower,upper]\f$.
     */
    template <typename InputIterator>
    Curve_2 operator()(InputIterator begin, InputIterator end,
                       const Algebraic_real_1& lower,
                       const Algebraic_real_1& upper) const;

    /*! constructs a curve representing the rational function \f$y = P(x)/Q(x)\f$,
     * where the coefficients of \f$P\f$ and \f$Q\f$ are given in the ranges
     * `[begin_numer,end_numer)` and `[begin_denom,end_denom)`, respectively.
     */
    template <typename InputIterator>
    Curve_2 operator()(InputIterator begin_numer, InputIterator end_numer,
                       InputIterator begin_denom, InputIterator end_denom) const;

    /*! constructs a curve representing the rational function \f$y = P(x)/Q(x)\f$,
     * where the coefficients of \f$P\f$ and \f$Q\f$ are given in the ranges
     * `[begin_numer,end_numer)` and `[begin_denom,end_denom)`, respectively.
     * The function is defined over the interval \f$I=[x,+\infty)\f$
     * if \f$right\f$ is true and \f$I=(-\infty,x]\f$ otherwise.
     */
    template <typename InputIterator>
    Curve_2 operator()(InputIterator begin_numer, InputIterator end_numer,
                       InputIterator begin_denom, InputIterator end_denom,
                       const Algebraic_real_1& x, bool right) const;

    /*! constructs a curve representing the rational function \f$y = P(x)/Q(x)\f$,
     * where the coefficients of \f$P\f$ and \f$Q\f$ are given in the ranges
     * `[begin_numer,end_numer)` and `[begin_denom,end_denom)`, respectively.
     * The function is defined over the interval \f$I=[lower,upper]\f$.
     */
    template <typename InputIterator>
    Curve_2 operator()(InputIterator begin_numer, InputIterator end_numer,
                       InputIterator begin_denom, InputIterator end_denom,
                       const Algebraic_real_1& lower,
                       const Algebraic_real_1& upper) const;

    /// @}
  }; /* end Arr_rational_function_traits_2::Construct_curve_2 */

  /*! Functor to construct a `X_monotone_curve_2`. To enable caching the class is
   * not default constructible and must be obtained via the function
   * `construct_x_monotone_curve_2_object()`, which is a member of the traits.
   *
   * \cgalModels{Assignable,CopyConstructible,AdaptableBinaryFunction,AdaptableUnaryFunction}
   */
  class Construct_x_monotone_curve_2 {
  public:
    /// \name Types
    /// @{

    ///
    typedef AlgebraicKernel_d_1::Polynomial_1 Polynomial_1;

    ///
    typedef AlgebraicKernel_d_1::Algebraic_real_1 Algebraic_real_1;

    ///
    typedef Arr_rational_function_traits_2<AlgebraicKernel_d_1>::X_monotone_curve_2 result_type;

    ///
    typedef Polynomial_1 argument_type;

    ///
    typedef Polynomial_1 first_argument_type;

    ///
    typedef Polynomial_1 second_argument_type;

    /// @}

    /// \name Operations
    /// @{

    /*! constructs an \f$x\f$-monotone curve supported by the polynomial function
     * \f$y = P(x)\f$.
     */
    X_monotone_curve_2 operator()(Polynomial_1 P) const;

    /*! constructs an \f$x\f$-monotone curve supported by the polynomial function
     * \f$y = P(x)\f$. The function is defined over the interval
     * \f$[x,+\infty)\f$ if \f$right\f$ is true and \f$(-\infty,x]\f$
     * otherwise.
     */
    X_monotone_curve_2 operator()(Polynomial_1 P,
                                  const Algebraic_real_1& x,
                                  bool right) const;

    /*! constructs an \f$x\f$-monotone curve supported by the polynomial function
     * \f$y = P(x)\f$. The function is defined over the interval
     * \f$[lower,upper]\f$.
     */
    X_monotone_curve_2 operator()(Polynomial_1 P,
                                  const Algebraic_real_1& lower,
                                  const Algebraic_real_1& upper) const;

    /*! constructs an \f$x\f$-monotone curve supported by the rational function
     * \f$y = P(x)/Q(x)\f$.
     *
     * \pre \f$Q\f$ has no real roots.
     */
    X_monotone_curve_2 operator()(Polynomial_1 P, Polynomial_1 Q) const;

    /*! constructs an \f$x\f$-monotone curve supported by the rational function
     * \f$y = P(x)/Q(x)\f$. The function is defined over the interval
     * \f$I=[x,+\infty)\f$ if \f$right\f$ is true and \f$I=(-\infty,x]\f$
     * otherwise.
     *
     * \pre \f$Q\f$ has no real roots in the interior of \f$I\f$.
     */
    X_monotone_curve_2 operator()(Polynomial_1 P, Polynomial_1 Q,
                                  const Algebraic_real_1& x,
                                  bool right) const;

    /*! constructs an \f$x\f$-monotone curve supported by the rational function
     * \f$y = P(x)/Q(x)\f$. The function is defined over the interval
     * \f$I=[lower,upper]\f$.
     * \pre \f$Q\f$ has no real roots in the interior of \f$I\f$.
     */
    X_monotone_curve_2 operator()(Polynomial_1 P, Polynomial_1 Q,
                                  const Algebraic_real_1& lower,
                                  const Algebraic_real_1& upper) const;

    /*! constructs an \f$x\f$-monotone curve supported by the polynomial function
     * \f$y = P(x)\f$, where the coefficients of \f$P\f$ are given in the range
     * `[begin,end)`.
     */
    template <typename InputIterator>
    X_monotone_curve_2 operator()(InputIterator begin, InputIterator end) const;

    /*! constructs an \f$x\f$-monotone curve supported by the polynomial function
     * \f$y = P(x)\f$, where the coefficients of \f$P\f$ are given in the range
     * `[begin,end)`. The function is defined over the interval \f$[x,+\infty)\f$
     * if \f$right\f$ is true and \f$(-\infty,x]\f$ otherwise.
     */
    template <typename InputIterator>
    X_monotone_curve_2 operator()(InputIterator begin, InputIterator end,
                                  const Algebraic_real_1& x, bool right) const;

    /*! constructs an \f$x\f$-monotone curve supported by the polynomial function
     * \f$y = P(x)\f$, where the coefficients of \f$P\f$ are given in the range
     * `[begin,end)`. The function is defined over the interval
     * \f$[lower,upper]\f$.
     */
    template <typename InputIterator>
    X_monotone_curve_2 operator()(InputIterator begin, InputIterator end
                                  const Algebraic_real_1& lower,
                                  const Algebraic_real_1& upper) const;

    /*! constructs an \f$x\f$-monotone curve supported by the rational function
     * \f$y = P(x)/Q(x)\f$, where the coefficients of \f$P\f$ and \f$Q\f$ are
     * given in the ranges `[begin_numer,end_numer)` and
     * `[begin_denom,end_denom)`, respectively.
     * \pre \f$Q\f$ has no real roots.
     */
    template <typename InputIterator>
    X_monotone_curve_2 operator()(InputIterator begin_numer,
                                  InputIterator end_numer,
                                  InputIterator begin_denom,
                                  InputIterator end_denom) const;

    /*! constructs an \f$x\f$-monotone curve supported by the rational function
     * \f$y = P(x)/Q(x)\f$, where the coefficients of \f$P\f$ and \f$Q\f$ are
     * given in the ranges `[begin_numer,end_numer)` and
     * `[begin_denom,end_denom)`, respectively. The function is defined over the
     * interval \f$I=[x,+\infty)\f$ if \f$right\f$ is true and
     * \f$I=(-\infty,x]\f$ otherwise.
     *
     * \pre \f$Q\f$ has no real roots in the interior of \f$I\f$.
     */
    template <typename InputIterator>
    X_monotone_curve_2 operator()(InputIterator begin_numer,
                                  InputIterator end_numer,
                                  InputIterator begin_denom,
                                  InputIterator end_denom,
                                  const Algebraic_real_1& x, bool right) const;

    /*! constructs an \f$x\f$-monotone curve supported by the rational function
     * \f$y = P(x)/Q(x)\f$, where the coefficients of \f$P\f$ and \f$Q\f$ are
     * given in the ranges `[begin_numer,end_numer)` and
     * `[begin_denom,end_denom)`, respectively. The function is defined over the
     * interval \f$I=[lower,upper]\f$.
     * \pre \f$Q\f$ has no real roots in the interior of \f$I\f$.
     */
    template <typename InputIterator>
    X_monotone_curve_2 operator()(InputIterator begin_numer,
                                  InputIterator end_numer,
                                  InputIterator begin_denom,
                                  InputIterator end_denom,
                                  const Algebraic_real_1& lower,
                                  const Algebraic_real_1& upper) const;

    /// @}
  }; /* end Arr_rational_function_traits_2::Construct_x_monotone_curve_2 */

  /*! The `Curve_2` class nested within the traits is used to represent rational
   * functions which may be restricted to a certain \f$x\f$-range.
   *
   * \cgalModels{ArrTraits::Curve_2}
   */
  class Curve_2 {
  public:
    /// \name Types
    /// @{

    ///
    typedef AlgebraicKernel_d_1::Polynomial_1 Polynomial_1;

    ///
    typedef AlgebraicKernel_d_1::Algebraic_real_1 Algebraic_real_1;

    /// @}

    /// \name Operations
    /// @{

    /*! returns the numerator of the supporting rational function.
     */
    const Polynomial_1& numerator() const;

    /*! returns the denominator of the supporting rational function.
     */
    const Polynomial_1& denominator() const;

    /*! returns whether &ccedil;urve is continuous, namely whether it does not
     * contains any vertical asymptotes in its interior.
     */
    bool is_continuous() const;

    /*! returns whether the \f$x\f$-coordinate of &ccedil;urve's left end is
     * finite or whether it is \f$\pm\infty\f$.
     */
    Arr_parameter_space left_parameter_space_in_x() const;

    /*! returns whether the \f$x\f$-coordinate of &ccedil;urve's right end is
     * finite or whether it is \f$\pm\infty\f$.
     */
    Arr_parameter_space right_parameter_space_in_x() const;

    /*! returns the \f$x\f$-coordinate of the left end.
     *
     * \pre `left_boundary_in_x()` == `ARR_INTERIOR`
     */
    Algebraic_real_1 left_x() const;

    /*! returns the \f$x\f$-coordinate of the right end.
     *
     * \pre `right_boundary_in_x()` == `ARR_INTERIOR`
     */
    Algebraic_real_1 right_x() const;

    /// @}

  }; /* end Arr_rational_function_traits_2::Curve_2 */

  /*! \cgalModels{ArrTraits::Point_2}
   */
  class Point_2 {
  public:

    /// \name Types
    /// @{

    ///
    typedef AlgebraicKernel_d_1::Polynomial_1 Polynomial_1;

    ///
    typedef AlgebraicKernel_d_1::Algebraic_real_1 Algebraic_real_1;

    ///
    typedef AlgebraicKernel_d_1::Bound Bound;

    /// @}

    /// \name Operations
    /// @{

    /*! returns the numerator of the supporting rational function.
     */
    Polynomial_1 numerator() const;

    /*! returns the denominator of the supporting rational function.
     */
    Polynomial_1 denominator() const;

    /*! returns double-approximations of the x- and y-coordinates.
     */
    std::pair<double,double> to_double() const;

    /*! returns the \f$x\f$-coordinate of the point.
     */
    Algebraic_real_1 x() const;

    /*! obtains the \f$y\f$-coordinates of the point. <B>Attention:</B> As
     * described above, points are not stored by their \f$y\f$-coordinate in
     * `Algebraic_real_1` representation. In fact, this representation must be
     * computed on demand, and might become quite costly for points defined by
     * high-degree polynomials.  Therefore, it is recommended to avoid calls to
     * this function as much as possible.
     */
    Algebraic_real_1 y() const;

    /*! Computes a pair \f$p\f$ approximating the \f$x\f$-coordinate with
     * respect to the given absolute precision \f$a\f$.
     *
     * \post \f$p.first \leq x \leq p.second\f$
     * \post \f$p.second - p.first \leq 2^{-a}\f$
     */
    std::pair<Bound,Bound> approximate_absolute_x(int a) const;

    /*! Computes a pair \f$p\f$ approximating the \f$y\f$-coordinate with
     * respect to the given absolute precision \f$a\f$.
     *
     * \post \f$p.first \leq y \leq p.second\f$
     * \post \f$p.second - p.first \leq 2^{-a}\f$
     */
    std::pair<Bound,Bound> approximate_absolute_y(int a) const;

    /*! Computes a pair \f$p\f$ approximating the \f$x\f$-coordinate with
     * respect to the given relative precision \f$r\f$.
     *
     * \post \f$p.first \leq x \leq p.second\f$
     * \post \f$p.second - p.first \leq2^{-r}|x|\f$
     */
    std::pair<Bound,Bound> approximate_relative_x(int r) const;

    /*! computes a pair \f$p\f$ approximating the \f$y\f$-coordinate with
     * respect to the given relative precision \f$r\f$.
     *
     * \post \f$p.first \leq y \leq p.second\f$
     * \post \f$p.second - p.first \leq2^{-r}|y|\f$
     */
    std::pair<Bound,Bound> approximate_relative_y(int r) const;

    /// @}

  }; /* end Arr_rational_function_traits_2::Point_2 */

  /*! The `X_monotone_curve_2` class nested within the traits is used to represent
   * \f$x\f$-monotone parts of rational functions. In particular, such as
   * \f$x\f$-monotone curve may not contain a vertical asymptote in its interior
   * \f$x\f$-range.
   *
   * \cgalModels{ArrTraits::XMonotoneCurve_2}
   */
  class X_monotone_curve_2 {
  public:
    /// \name Types
    /// @{

    ///
    typedef AlgebraicKernel_d_1::Polynomial_1 Polynomial_1;

    ///
    typedef AlgebraicKernel_d_1::Algebraic_real_1 Algebraic_real_1;

    ///
    typedef Arr_rational_function_traits_2<AlgebraicKernel_d_1>::Point_2 Point_2;

    /// @}

    /// \name Operations
    /// @{

    /*! returns the numerator of the supporting rational function.
     */
    const Polynomial_1& numerator() const;

    /*! returns the denominator of the supporting rational function.
     */
    const Polynomial_1& denominator() const;

    /*! returns whether the \f$x\f$-coordinate of the source is finite or
     * whether it is \f$\pm\infty\f$.
     */
    Arr_parameter_space source_parameter_space_in_x() const;

    /*! returns whether the \f$y\f$-coordinate of the source is finite or
     * whether it is \f$\pm\infty\f$.
     */
    Arr_parameter_space source_parameter_space_in_y() const;

    /*! returns the source point of the arc.
     * \pre Both the \f$x\f$- and \f$y\f$-coordinates of the source point is
     * finite.
     */
    const Point_2& source() const;

    /*! returns the \f$x\f$-coordinate of the source point.
     *
     * \pre The \f$x\f$-coordinate of the source point is finite.
     */
    Algebraic_real_1 source_x() const;

    /*! returns whether the \f$x\f$-coordinate of the target is finite or
     * whether it is \f$\pm\infty\f$.
     */
    Arr_parameter_space target_parameter_space_in_x() const;

    /*! returns whether the \f$y\f$-coordinate of the target is finite or
     * whether it is \f$\pm\infty\f$.
     */
    Arr_parameter_space target_parameter_space_in_y() const;

    /*! returns the target point of the arc.
     * \pre Both the \f$x\f$- and \f$y\f$-coordinates of the target point is
     * finite.
     */
    const Point_2& target() const;

    /*! returns the \f$x\f$-coordinate of the target point.
     *
     * \pre The \f$x\f$-coordinate of the target point is finite.
     */
    Algebraic_real_1 target_x() const;

    /*! returns whether the \f$x\f$-coordinate of the left curve end is finite or
     * whether it is \f$\pm\infty\f$.
     */
    Arr_parameter_space left_parameter_space_in_x() const;

    /*! returns whether the \f$y\f$-coordinate of the left curve end is finite or
     * whether it is \f$\pm\infty\f$.
     */
    Arr_parameter_space left_parameter_space_in_y() const;

    /*! returns the left point of the arc.
     *
     * \pre Both the \f$x\f$- and \f$y\f$-coordinates of the left point is finite.
     */
    const Point_2& left() const;

    /*! returns the \f$x\f$-coordinate of the left point.
     *
     * \pre The \f$x\f$-coordinate of the left point is finite.
     */
    Algebraic_real_1 left_x() const;

    /*! returns whether the \f$x\f$-coordinate of the right curve end is finite or
     * whether it is \f$\pm\infty\f$.
     */
    Arr_parameter_space right_parameter_space_in_x () const;

    /*! returns whether the \f$y\f$-coordinate of the right curve end is finite or
     * whether it is \f$\pm\infty\f$.
     */
    Arr_parameter_space right_parameter_space_in_y () const;

    /*! returns the right point of the arc.
     * \pre Both the \f$x\f$- and \f$y\f$-coordinates of The right point is
     * finite.
     */
    const Point_2& right() const;

    /*! returns the \f$x\f$-coordinate of the right point.
     *
     * \pre The \f$x\f$-coordinate of the right point is finite.
     */
    Algebraic_real_1 right_x() const;

    /*! returns whether the curve is oriented from left to right.
     */
    bool is_left_to_right() const;

    /// @}

  }; /* end Arr_rational_function_traits_2::X_monotone_curve_2 */
}; /* end Arr_rational_function_traits_2 */

} /* end namespace CGAL */
