
/*!
\ingroup PkgCircularKernel2GeometricConcepts
\cgalConcept

\cgalRefines{Kernel}

\cgalHasModelsBegin
\cgalHasModels{CGAL::Circular_kernel_2<Kernel,AlgebraicKernelForCircles>}
\cgalHasModels{CGAL::Exact_circular_kernel_2}
\cgalHasModelsEnd

\sa `Kernel`

*/

class CircularKernel {
public:

/// \name Types
/// A model of `CircularKernel` is supposed to provide some basic
/// types and to define the following geometric objects Moreover, a
/// model of `CircularKernel` must provide predicates, constructions
/// and other functionalities.
/// @{

/*!
Model of `LinearKernel`.
*/
typedef unspecified_type Linear_kernel;

/*!
Model of `AlgebraicKernelForCircles`.
*/
typedef unspecified_type Algebraic_kernel;

/*!
Model of `RingNumberType`.
*/
typedef unspecified_type RT;

/*!
Model of `FieldNumberType`.
*/
typedef unspecified_type FT;

/*!
Model of `RootOf_2`.
*/
typedef unspecified_type Root_of_2;

/*!
Model of `AlgebraicKernelForCircles::RootForCircles_2_2`.
*/
typedef unspecified_type Root_for_circles_2_2;

/*!
Model of `AlgebraicKernelForCircles::Polynomial_1_2`.
*/
typedef unspecified_type Polynomial_1_2;

/*!
Model of `AlgebraicKernelForCircles::PolynomialForCircles_2_2`.
*/
typedef unspecified_type Polynomial_for_circles_2_2;

/*!
Model of `Kernel::Point_2`.
*/
typedef unspecified_type Point_2;

/*!
Model of `Kernel::Line_2`.
*/
typedef unspecified_type Line_2;

/*!
Model of `Kernel::Circle_2`.
*/
typedef unspecified_type Circle_2;

/*!
Model of `CircularKernel::LineArc_2`.
*/
typedef unspecified_type Line_arc_2;

/*!
Model of `CircularKernel::CircularArc_2`.
*/
typedef unspecified_type Circular_arc_2;

/*!
Model of `CircularKernel::CircularArcPoint_2`.
*/
typedef unspecified_type Circular_arc_point_2;

/// @}

/// \name Predicates
/// @{

/*!
Model of `CircularKernel::CompareX_2`.
*/
typedef unspecified_type Compare_x_2;

/*!
Model of `CircularKernel::CompareY_2`.
*/
typedef unspecified_type Compare_y_2;

/*!
Model of `CircularKernel::CompareXY_2`.
*/
typedef unspecified_type Compare_xy_2;

/*!
Model of `CircularKernel::Equal_2`.
*/
typedef unspecified_type Equal_2;

/*!
Model of `CircularKernel::CompareYatX_2`.
*/
typedef unspecified_type Compare_y_at_x_2;

/*!
Model of `CircularKernel::CompareYtoRight_2`.
*/
typedef unspecified_type Compare_y_to_right_2;

/*!
Model of `CircularKernel::HasOn_2`.
*/
typedef unspecified_type Has_on_2;

/*!
Model of `CircularKernel::DoOverlap_2`.
*/
typedef unspecified_type Do_overlap_2;

/*!
Model of `CircularKernel::DoIntersect_2`.
*/
typedef unspecified_type Do_intersect_2;

/*!
Model of `CircularKernel::BoundedSide_2`.
*/
typedef unspecified_type Bounded_side_2;

/*!
Model of `CircularKernel::HasOnBoundedSide_2`.
*/
typedef unspecified_type Has_on_bounded_side_2;

/*!
Model of `CircularKernel::HasOnUnboundedSide_2`.
*/
typedef unspecified_type Has_on_unbounded_side_2;

/*!
Model of `CircularKernel::InXRange_2`.
*/
typedef unspecified_type In_x_range_2;

/*!
Model of `CircularKernel::IsVertical_2`.
*/
typedef unspecified_type Is_vertical_2;

/*!
Model of `CircularKernel::IsXMonotone_2`.
*/
typedef unspecified_type Is_x_monotone_2;

/*!
Model of `CircularKernel::IsYMonotone_2`.
*/
typedef unspecified_type Is_y_monotone_2;

/// @}

/// \name Constructions
/// @{

/*!
Model of `CircularKernel::ConstructLine_2`.
*/
typedef unspecified_type Construct_line_2;

/*!
Model of `CircularKernel::ConstructCircle_2`.
*/
typedef unspecified_type Construct_circle_2;

/*!
Model of `CircularKernel::ConstructBbox_2`.
*/
typedef unspecified_type Construct_bbox_2;

/*!
Model of `CircularKernel::ConstructCircularArcPoint_2`.
*/
typedef unspecified_type Construct_circular_arc_point_2;

/*!
Model of `CircularKernel::ConstructLineArc_2`.
*/
typedef unspecified_type Construct_line_arc_2;

/*!
Model of `CircularKernel::ConstructCircularArc_2`.
*/
typedef unspecified_type Construct_circular_arc_2;

/*!
Model of `CircularKernel::ComputeCircularX_2`
*/
typedef unspecified_type Compute_circular_x_2;

/*!
Model of `CircularKernel::ComputeCircularY_2`
*/
typedef unspecified_type Compute_circular_y_2;

/*!
Model of `CircularKernel::ConstructCircularMinVertex_2`.
*/
typedef unspecified_type Construct_circular_min_vertex_2;

/*!
Model of `CircularKernel::ConstructCircularMaxVertex_2`.
*/
typedef unspecified_type Construct_circular_max_vertex_2;

/*!
Model of `CircularKernel::ConstructCircularSourceVertex_2`.
*/
typedef unspecified_type Construct_circular_source_vertex_2;

/*!
Model of `CircularKernel::ConstructCircularTargetVertex_2`.
*/
typedef unspecified_type Construct_circular_target_vertex_2;

/*!
Model of `CircularKernel::Intersect_2`.
*/
typedef unspecified_type Intersect_2;

/*!
Model of `CircularKernel::Split_2`.
*/
typedef unspecified_type Split_2;

/*!
Model of `CircularKernel::MakeXMonotone_2`.
*/
typedef unspecified_type Make_x_monotone_2;

/*!
Model of `CircularKernel::MakeXYMonotone_2`.
*/
typedef unspecified_type Make_xy_monotone_2;

/// @}

/// \name Link with the algebraic kernel
/// @{

/*!
Model of `CircularKernel::GetEquation`.
*/
typedef unspecified_type Get_equation;

/// @}

/// \name Operations
/// As in the `Kernel` concept, for each of the function objects
/// above, there must exist a member function that requires no
/// arguments and returns an instance of that function object. The
/// name of the member function is the uncapitalized name of the type
/// returned with the suffix `_object` appended. For example, for the
/// function object `CircularKernel::Construct_circular_arc_2` the
/// following member function must exist:
/// @{

/*!

*/
Construct_circular_arc_2 construct_circular_arc_2_object() const;

/// @}

}; /* end CircularKernel */

