/*! \ingroup PkgArrangementOnSurface2ConceptsTraits
 * \cgalConcept
 *
 * The concept `AosBasicTraits_2` defines the minimal set of geometric
 * predicates needed for the construction and maintenance of objects of the
 * class `Arrangement_2`, as well as performing simple queries (such as
 * point-location queries) on such arrangements.
 *
 * A model of this concept must define nested `Point_2` and `X_monotone_curve_2`
 * types, which represent planar points and continuous \f$x\f$-monotone curves
 * (a vertical segment is also considered to be <I>weakly</I> \f$
 * x\f$-monotone), respectively. The \f$x\f$-monotone curves are assumed to be
 * pairwise disjoint in their interiors, so they do not intersect except at
 * their endpoints.
 *
 * The `X_monotone_curve_2` curves of an arrangement are confined to an
 * iso-rectangular area called the parameter space. The iso-rectangule can be
 * unbounded, open, or closed. The set of predicates provided by a model the
 * concept `AosBasicTraits_2` is sufficient for constructing
 * arrangements of \f$x\f$-monotone curves that do not reach or approach the
 * boundary of the parameter space. The nature of the input curves, whether they
 * are expected to reach or approach the left, right, bottom, or top side of the
 * boundary of the parameter space, are conveyed through the definition of four
 * additional nested types, namely `Left_side_category`, `Right_side_category`,
 * `Bottom_side_category`, and `Top_side_category`. Each such type must be
 * convertible to the type `CGAL::Arr_oblivious_side_tag`.
 *
 * \cgalRefines{CopyConstructible,Assignable,DefaultConstructible}
 *
 * \cgalHasModelsBegin
 * \cgalHasModels{CGAL::Arr_segment_traits_2<Kernel>}
 * \cgalHasModels{CGAL::Arr_non_caching_segment_basic_traits_2<Kernel>}
 * \cgalHasModels{CGAL::Arr_non_caching_segment_traits_2<Kernel>}
 * \cgalHasModels{CGAL::Arr_linear_traits_2<Kernel>}
 * \cgalHasModels{CGAL::Arr_polyline_traits_2<SegmentTraits>}
 * \cgalHasModels{CGAL::Arr_circle_segment_traits_2<Kernel>}
 * \cgalHasModels{CGAL::Arr_line_arc_traits_2<CircularKernel>}
 * \cgalHasModels{CGAL::Arr_circular_arc_traits_2<CircularKernel>}
 * \cgalHasModels{CGAL::Arr_circular_line_arc_traits_2<CircularKernel>}
 * \cgalHasModels{CGAL::Arr_conic_traits_2<RatKernel,AlgKernel,NtTraits>}
 * \cgalHasModels{CGAL::Arr_rational_function_traits_2<AlgebraicKernel_d_1>}
 * \cgalHasModels{CGAL::Arr_Bezier_curve_traits_2<RatKernel,AlgKernel,NtTraits>}
 * \cgalHasModels{CGAL::Arr_algebraic_segment_traits_2<Coefficient>}
 * \cgalHasModels{CGAL::Arr_curve_data_traits_2<Tr,XData,Mrg,CData,Cnv>}
 * \cgalHasModels{CGAL::Arr_consolidated_curve_data_traits_2<Traits,Data>}
 * \cgalHasModelsEnd
 */
class AosBasicTraits_2 {
public:
  /// \name Types
  /// @{

  /// models the concept `AosTraits::Point_2`.
  typedef unspecified_type Point_2;

  /// models the concept `AosTraits::XMonotoneCurve_2`.
  typedef unspecified_type X_monotone_curve_2;

  /// @}

  /// \name Categories
  /// @{

  /// indicates whether the nested functor `Compare_at_x_left_2` is provided.
  typedef unspecified_type Has_left_category;

  /// Must be convertible to `CGAL::Arr_oblivious_side_tag`.
  typedef unspecified_type Left_side_category;

  /// Must be convertible to `CGAL::Arr_oblivious_side_tag`.
  typedef unspecified_type Bottom_side_category;

  /// Must be convertible to `CGAL::Arr_oblivious_side_tag`.
  typedef unspecified_type Top_side_category;

  /// Must be convertible to `CGAL::Arr_oblivious_side_tag`.
  typedef unspecified_type Right_side_category;

  /// @}

  /// \name Functor Types
  /// @{

  /// models the concept `AosTraits::CompareX_2`.
  typedef unspecified_type Compare_x_2;

  /// models the concept `AosTraits::CompareXy_2`.
  typedef unspecified_type Compare_xy_2;

  /// models the concept `AosTraits::ConstructMinVertex_2`.
  typedef unspecified_type Construct_min_vertex_2;

  /// models the concept `AosTraits::ConstructMaxVertex_2`.
  typedef unspecified_type Construct_max_vertex_2;

  /*! models the concept `AosTraits::IsVertical_2`.
   */
  typedef unspecified_type Is_vertical_2;

  /*! models the concept `AosTraits::CompareYAtX_2`.
   */
  typedef unspecified_type Compare_y_at_x_2;

  /*! models the concept `AosTraits::CompareYAtXLeft_2`.  Required only if the
   * `Has_left_category` category is convertible to `Tag_true`.
   */
  typedef unspecified_type Compare_y_at_x_left_2;

  /// models the concept `AosTraits::CompareYAtXRight_2`.
  typedef unspecified_type Compare_y_at_x_right_2;

  /// models the concept `AosTraits::Equal_2`.
  typedef unspecified_type Equal_2;

  /// @}

  /// \name Accessing Functor Objects
  /// @{

  ///
  Compare_x_2 compare_x_2_object() const;

  ///
  Compare_xy_2 compare_xy_2_object() const;

  ///
  Construct_min_vertex_2 construct_min_vertex_2_object() const;

  ///
  Construct_max_vertex_2 construct_max_vertex_2_object() const;

  ///
  Is_vertical_2 is_vertical_2_object() const;

  ///
  Compare_y_at_x_2 compare_y_at_x_2_object() const;

  ///
  Compare_y_at_x_left_2 compare_y_at_x_left_2_object() const;

  ///
  Compare_y_at_x_right_2 compare_y_at_x_right_2_object() const;

  ///
  Equal_2 equal_2_object() const;

  /// @}
}; /* end AosBasicTraits_2 */
