From 329c14dd0e410d8420f95a7165ebdb94de17a512 Mon Sep 17 00:00:00 2001 From: Pavel Emeliyanenko Date: Wed, 25 Jun 2008 16:55:02 +0000 Subject: [PATCH] code refactoring --- ...aces_intersecting_dupin_cyclide_traits_2.h | 156 ++++--- .../CGAL/Curved_kernel_via_analysis_2.h | 181 ++------ .../CGAL/Curved_kernel_via_analysis_2/Arc_2.h | 140 +++--- .../Curve_interval_arcno_cache.h | 19 +- .../Curved_kernel_via_analysis_2_functors.h | 189 ++++---- .../Curved_kernel_via_analysis_2/Point_2.h | 20 +- .../CGAL/Curved_kernel_via_analysis_2l.h | 167 +++---- .../Curved_kernel_via_analysis_2l_functors.h | 4 +- .../Filtered_curved_kernel_via_analysis_2.h | 410 +++++++----------- .../CGAL/Quadrical_kernel_via_analysis_2.h | 351 ++++++++------- 10 files changed, 720 insertions(+), 917 deletions(-) diff --git a/Curved_kernel_via_analysis_2/include/CGAL/Arr_surfaces_intersecting_dupin_cyclide_traits_2.h b/Curved_kernel_via_analysis_2/include/CGAL/Arr_surfaces_intersecting_dupin_cyclide_traits_2.h index a8f1a5ceec5..b9bacc91932 100644 --- a/Curved_kernel_via_analysis_2/include/CGAL/Arr_surfaces_intersecting_dupin_cyclide_traits_2.h +++ b/Curved_kernel_via_analysis_2/include/CGAL/Arr_surfaces_intersecting_dupin_cyclide_traits_2.h @@ -199,14 +199,15 @@ public: */ template < class CurvedKernelViaAnalysis_2 > class Is_bounded_2 : - public CurvedKernelViaAnalysis_2::Base::Is_bounded_2 { + public CurvedKernelViaAnalysis_2::Functor_base::Is_bounded_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2 Curved_kernel_via_analysis_2; //! the bae type - typedef typename Curved_kernel_via_analysis_2::Base::Is_bounded_2 Base; + typedef typename Curved_kernel_via_analysis_2::Functor_base::Is_bounded_2 + Base; CGAL_DC_CKvA_2_GRAB_BASE_FUNCTOR_TYPES; @@ -236,14 +237,14 @@ public: */ template < class CurvedKernelViaAnalysis_2 > class Equal_2 : - public CurvedKernelViaAnalysis_2::Base::Equal_2 { + public CurvedKernelViaAnalysis_2::Functor_base::Equal_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2 Curved_kernel_via_analysis_2; //! the bae type - typedef typename Curved_kernel_via_analysis_2::Base::Equal_2 Base; + typedef typename Curved_kernel_via_analysis_2::Functor_base::Equal_2 Base; CGAL_DC_CKvA_2_GRAB_BASE_FUNCTOR_TYPES; @@ -332,7 +333,8 @@ protected: */ template < class CurvedKernelViaAnalysis_2 > class Compare_y_at_x_right_2 : - public CurvedKernelViaAnalysis_2::Base::Compare_y_at_x_right_2 { + public CurvedKernelViaAnalysis_2::Functor_base::Compare_y_at_x_right_2 +{ public: //! this instance' first template parameter @@ -340,7 +342,7 @@ public: //! the base type typedef typename - Curved_kernel_via_analysis_2::Base::Compare_y_at_x_right_2 Base; + Curved_kernel_via_analysis_2::Functor_base::Compare_y_at_x_right_2 Base; CGAL_DC_CKvA_2_GRAB_BASE_FUNCTOR_TYPES; @@ -445,7 +447,7 @@ public: */ template < class CurvedKernelViaAnalysis_2 > class Compare_y_at_x_left_2 : - public CurvedKernelViaAnalysis_2::Base::Compare_y_at_x_left_2 { + public CurvedKernelViaAnalysis_2::Functor_base::Compare_y_at_x_left_2 { public: //! this instance' first template parameter @@ -453,7 +455,7 @@ public: //! the base type typedef typename - Curved_kernel_via_analysis_2::Base::Compare_y_at_x_left_2 Base; + Curved_kernel_via_analysis_2::Functor_base::Compare_y_at_x_left_2 Base; CGAL_DC_CKvA_2_GRAB_BASE_FUNCTOR_TYPES; @@ -558,14 +560,15 @@ public: */ template < class CurvedKernelViaAnalysis_2 > class Intersect_2 : - public CurvedKernelViaAnalysis_2::Base::Intersect_2 { + public CurvedKernelViaAnalysis_2::Functor_base::Intersect_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2 Curved_kernel_via_analysis_2; //! the bae type - typedef typename Curved_kernel_via_analysis_2::Base::Intersect_2 Base; + typedef typename Curved_kernel_via_analysis_2::Functor_base::Intersect_2 + Base; CGAL_DC_CKvA_2_GRAB_BASE_FUNCTOR_TYPES; @@ -655,7 +658,7 @@ protected: template < class CurvedKernelViaAnalysis_2 > class Make_x_monotone_2 : - public CurvedKernelViaAnalysis_2::Base::Make_x_monotone_2 { + public CurvedKernelViaAnalysis_2::Functor_base::Make_x_monotone_2 { public: //! this instance' first template parameter @@ -663,7 +666,7 @@ public: //! the base type typedef typename - Curved_kernel_via_analysis_2::Base::Make_x_monotone_2 Base; + Curved_kernel_via_analysis_2::Functor_base::Make_x_monotone_2 Base; CGAL_DC_CKvA_2_GRAB_BASE_FUNCTOR_TYPES; @@ -838,23 +841,77 @@ public: } // namespace Dupin_cyclide_via_analysis_2_Functors +template +struct Dupin_cyclide_functor_base : + public BaseCKvA::template rebind< ASiDC_traits_2 >::Functor_base { + + typedef ASiDC_traits_2 Self; + + typedef typename BaseCKvA::template rebind< Self >::Functor_base + Functor_base; + +#if 0 + // TODO add special construct_point_2 and construct_arc_2 functors + // -> points/curves on identifications + CGAL_CKvA_2_functor_cons(Construct_point_2, + construct_point_2_object); + + CGAL_CKvA_2_functor_cons(Construct_arc_2, + construct_arc_2_object); +#endif + +// declares curved kernel functors, for each functor defines a member function +// returning an instance of this functor +#define CGAL_DC_CKvA_2_functor_pred(Y, Z) \ + typedef Dupin_cyclide_via_analysis_2_Functors::Y< Self > Y; \ + Y Z() const { \ + return Y(&Self::instance()); \ + } + +#define CGAL_DC_CKvA_2_functor_cons(Y, Z) \ + CGAL_DC_CKvA_2_functor_pred(Y, Z) + + CGAL_DC_CKvA_2_functor_pred(Compare_x_on_identification_2, + compare_x_on_identification_2_object); + + CGAL_DC_CKvA_2_functor_pred(Compare_y_on_identification_2, + compare_y_on_identification_2_object); + + CGAL_DC_CKvA_2_functor_pred(Equal_2, equal_2_object); + + CGAL_DC_CKvA_2_functor_pred(Intersect_2, intersect_2_object); + + CGAL_DC_CKvA_2_functor_pred(Compare_y_at_x_right_2, + compare_y_at_x_right_2_object); + + CGAL_DC_CKvA_2_functor_pred(Compare_y_at_x_left_2, + compare_y_at_x_left_2_object); + + CGAL_DC_CKvA_2_functor_cons(Make_x_monotone_2, + make_x_monotone_2_object); + +#undef CGAL_DC_CKvA_2_functor_pred +#undef CGAL_DC_CKvA_2_functor_cons + +}; + } // namespace CGALi /*!\brief * Derived ArrangmentTraits class for points and segments embedded on * a given Dupin cyclide. */ -template < class CurvedKernelViaAnalysis_2 > +template < class BaseCKvA_2 > class Arr_surfaces_intersecting_dupin_cyclide_traits_2 : - public CurvedKernelViaAnalysis_2::template -rebind< -Arr_surfaces_intersecting_dupin_cyclide_traits_2 < - CurvedKernelViaAnalysis_2 > >::Other + public CGALi::Curved_kernel_via_analysis_2_base< + Arr_surfaces_intersecting_dupin_cyclide_traits_2< BaseCKvA_2 >, + BaseCKvA_2, typename BaseCKvA_2::Curve_kernel_2, + CGALi::Dupin_cyclide_functor_base > { public: //! this instance's template parameter - typedef CurvedKernelViaAnalysis_2 Curved_kernel_via_analysis_2; + typedef BaseCKvA_2 Curved_kernel_via_analysis_2; //! the class itself typedef Arr_surfaces_intersecting_dupin_cyclide_traits_2 @@ -889,12 +946,17 @@ public: //! type of x-monotone curve typedef Arc_2 X_monotone_curve_2; - //! type of Base - typedef typename Curved_kernel_via_analysis_2::template - rebind< Self >::Other Base; - - //! Tag to tell that the boundary functors are implemented + //! Tag to tell that the boundary functors are implemented typedef CGAL::Arr_bounded_boundary_tag Boundary_category; + + +protected: + + //! base kernel type + typedef CGALi::Curved_kernel_via_analysis_2_base< + Self, Curved_kernel_via_analysis_2, Curve_kernel_2, + CGALi::Dupin_cyclide_functor_base > + Base_kernel; public: //!\name Constructors @@ -931,54 +993,6 @@ public: //!@} - //!\name Predicates and Constructions - //!@{ - -#if 0 - // TODO add special construct_point_2 and construct_arc_2 functors - // -> points/curves on identifications - CGAL_CKvA_2_functor_cons(Construct_point_2, - construct_point_2_object); - - CGAL_CKvA_2_functor_cons(Construct_arc_2, - construct_arc_2_object); -#endif - -// declares curved kernel functors, for each functor defines a member function -// returning an instance of this functor -#define CGAL_DC_CKvA_2_functor_pred(Y, Z) \ - typedef CGAL::CGALi::Dupin_cyclide_via_analysis_2_Functors::Y< Self > Y; \ - Y Z() const { \ - return Y(&Self::instance()); \ - } \ - -#define CGAL_DC_CKvA_2_functor_cons(Y, Z) \ - CGAL_DC_CKvA_2_functor_pred(Y, Z) - - CGAL_DC_CKvA_2_functor_pred(Compare_x_on_identification_2, - compare_x_on_identification_2_object); - - CGAL_DC_CKvA_2_functor_pred(Compare_y_on_identification_2, - compare_y_on_identification_2_object); - - CGAL_DC_CKvA_2_functor_pred(Equal_2, equal_2_object); - - CGAL_DC_CKvA_2_functor_pred(Intersect_2, intersect_2_object); - - CGAL_DC_CKvA_2_functor_pred(Compare_y_at_x_right_2, - compare_y_at_x_right_2_object); - - CGAL_DC_CKvA_2_functor_pred(Compare_y_at_x_left_2, - compare_y_at_x_left_2_object); - - CGAL_DC_CKvA_2_functor_cons(Make_x_monotone_2, - make_x_monotone_2_object); - -#undef CGAL_DC_CKvA_2_functor_pred -#undef CGAL_DC_CKvA_2_functor_cons - - //!@} - protected: //! the stored base Dupin cyclide mutable Dupin_cyclide_3 _m_base; diff --git a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2.h b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2.h index 0cddc7f3447..f626d7d4029 100755 --- a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2.h +++ b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2.h @@ -23,9 +23,6 @@ #include -#include -#include - #include #include #include @@ -40,41 +37,42 @@ CGAL_BEGIN_NAMESPACE namespace CGALi { -// todo mode to another file /*!\brief * Provides basic types for Curved_kernel_via_analysis_2 */ -template < class CurvedKernelViaAnalysis_2, class CurveKernel_2 > +template < class NewCKvA, class BaseCKvA, class CurveKernel_2, + template class FunctorBase = + Curved_kernel_via_analysis_2_functors > class Curved_kernel_via_analysis_2_base - : public Curved_kernel_via_analysis_2_functors < - CurvedKernelViaAnalysis_2 > -{ + : public FunctorBase< NewCKvA, BaseCKvA > { + public: - //!\name Global types //!@{ - //! the Curved_kernel_via_analysis_2 - typedef CurvedKernelViaAnalysis_2 Curved_kernel_via_analysis_2; - //! type of curve kernel typedef CurveKernel_2 Curve_kernel_2; + //! rebinds functor base to a new CKvA + template + struct rebind { + + typedef FunctorBase Functor_base; + }; + //!\name Embedded types to fulfill \c ArrangementTraits_2 concept //! type of curve that can be analyzed typedef typename Curve_kernel_2::Curve_analysis_2 Curve_2; //! type of non x-monotone arc on a curve that can be analyzed - typedef CGALi::Non_x_monotone_arc_2 + typedef CGALi::Non_x_monotone_arc_2 Non_x_monotone_arc_2; //! this instance itself - typedef - Curved_kernel_via_analysis_2_base< - Curved_kernel_via_analysis_2, CurveKernel_2 - > - Self; + typedef Curved_kernel_via_analysis_2_base< NewCKvA, BaseCKvA, + CurveKernel_2, FunctorBase > Self; //! the multiplicity type typedef unsigned int Multiplicity; @@ -106,8 +104,8 @@ public: //!@{ //! type of inverval arcno cache - typedef CGALi::Curve_interval_arcno_cache< Self > - Curve_interval_arcno_cache; + typedef CGALi::Curve_interval_arcno_cache< Curve_kernel_2 > + Curve_interval_arcno_cache; //!@} @@ -117,12 +115,12 @@ public: //! default constructor Curved_kernel_via_analysis_2_base() : - _m_kernel(Curve_kernel_2()), _m_interval_arcno_cache(this) { + _m_kernel(Curve_kernel_2()) { } //! construct using specific Curve_kernel_2 instance \c kernel Curved_kernel_via_analysis_2_base(const Curve_kernel_2& kernel) : - _m_kernel(kernel), _m_interval_arcno_cache(this) { + _m_kernel(kernel) { } //!@} @@ -134,7 +132,7 @@ public: * access to static Curve_interval_arcno_cache */ const Curve_interval_arcno_cache& interval_arcno_cache() const { - return this->_m_interval_arcno_cache; + return _m_interval_arcno_cache; } /*!\brief @@ -169,7 +167,7 @@ public: * * \return static instance of \c Curved_kernel_via_analysis_2 */ - static Curved_kernel_via_analysis_2& instance() { + static NewCKvA& instance() { return set_instance(_set_instance()); } @@ -179,11 +177,11 @@ public: * \param ckva The instance that should be stored * \return the stored instance */ - static Curved_kernel_via_analysis_2& set_instance( - const Curved_kernel_via_analysis_2& ckva + static NewCKvA& set_instance( + const NewCKvA& ckva ) { - static Curved_kernel_via_analysis_2 instance; - static Curved_kernel_via_analysis_2 binstance; + static NewCKvA instance; + static NewCKvA binstance; if (&ckva == &_reset_instance()) { instance = binstance; @@ -201,39 +199,13 @@ public: static void reset_instance() { set_instance(_reset_instance()); } - - //!\name Additional functors - //!@{ - -// declares curved kernel functors, for each functor defines a member function -// returning an instance of this functor -#define CGAL_CKvA_2_functor_pred(Y, Z) \ - typedef CGALi::Curved_kernel_via_analysis_2_Functors::Y< \ - Curved_kernel_via_analysis_2 > Y; \ - Y Z() const { return Y(&Curved_kernel_via_analysis_2::instance()); } - -#define CGAL_CKvA_2_functor_cons(Y, Z) CGAL_CKvA_2_functor_pred(Y, Z) - -public: - - CGAL_CKvA_2_functor_cons(Construct_point_2, - construct_point_2_object); - - CGAL_CKvA_2_functor_cons(Construct_point_on_arc_2, - construct_point_on_arc_2_object); - - CGAL_CKvA_2_functor_cons(Construct_arc_2, - construct_arc_2_object); - -#undef CGAL_CKvA_2_functor_pred -#undef CGAL_CKvA_2_functor_cons private: /*!\brief * sets instance to default for internal purposes */ - static Curved_kernel_via_analysis_2& _set_instance() { - static Curved_kernel_via_analysis_2 instance; + static NewCKvA& _set_instance() { + static NewCKvA instance; return instance; } @@ -241,8 +213,8 @@ private: /*!\brief * sets instance to default for internal purposes */ - static Curved_kernel_via_analysis_2& _reset_instance() { - static Curved_kernel_via_analysis_2 instance; + static NewCKvA& _reset_instance() { + static NewCKvA instance; return instance; } @@ -251,94 +223,27 @@ private: } // namespace CGALi -/*!\brief - * Kernel for curves in a two-dimensional space, and points and arcs of them. - * - * It expects a CurveKernel_2 type that fulfills the CurveKernel_2 concept. - * The other template parameters can be left default. They are used during - * rebind to exchange certain point and arc type. - * - * Is a model of CGAL's ArrangementTraits_2 concept. - */ -template < class CurveKernel_2, class CKvA_ = void> -class Curved_kernel_via_analysis_2 : - public CGALi::Curved_kernel_via_analysis_2_base < - CKvA_, CurveKernel_2 > -{ - -public: - //! type of curve kernel - typedef CurveKernel_2 Curve_kernel_2; - - //! this instance itself - typedef Curved_kernel_via_analysis_2< Curve_kernel_2, CKvA_> Self; - - //! allows to rebind CKvA_2 wrt to NewCKvA - template < class NewCKvA_2 > - struct rebind { - //! the rebound type - typedef Curved_kernel_via_analysis_2< Curve_kernel_2, NewCKvA_2 > - Other; - }; - -protected: - //!\name Protected base types - //!@{ - - //! class collecting basic types - typedef CGALi::Curved_kernel_via_analysis_2_base < CKvA_, Curve_kernel_2 > - Base_kernel; - - //!@} - -public: - //! \name Constructors - //!@{ - - /*!\brief - * default constructor - */ - Curved_kernel_via_analysis_2() : - Base_kernel() { - } - - /*!\brief - * construct from \c kernel - * - * \param kernel Kernel to use internally - */ - Curved_kernel_via_analysis_2(const Curve_kernel_2& kernel) : - Base_kernel(kernel) { - } - - //!@} -}; // class Curved_kernel_via_analysis_2 - template -class Curved_kernel_via_analysis_2 : +class Curved_kernel_via_analysis_2 : public CGALi::Curved_kernel_via_analysis_2_base< - Curved_kernel_via_analysis_2, CurveKernel_2 > { - + Curved_kernel_via_analysis_2, + void, CurveKernel_2 > +{ public: //! type of curve kernel typedef CurveKernel_2 Curve_kernel_2; //! this instance itself - typedef Curved_kernel_via_analysis_2< Curve_kernel_2, void> Self; + typedef Curved_kernel_via_analysis_2< Curve_kernel_2 > Self; - //!\name Rebind - //!@{ - - //! allows to rebind CKvA_2 wrt to NewCKvA - template < class NewCKvA_2 > + //! redefine rebind to terminate unrolling nested templates + template struct rebind { - //! the rebound type - typedef Curved_kernel_via_analysis_2< Curve_kernel_2, NewCKvA_2 > - Other; + + typedef CGALi::Curved_kernel_via_analysis_2_functors< X > + Functor_base; }; - - //!@} - + public: //!\name Embedded types to fulfill \c ArrangementTraits_2 concept //!@{ @@ -356,8 +261,8 @@ protected: //!@{ //! class collecting basic types - typedef CGALi::Curved_kernel_via_analysis_2_base < Self, CurveKernel_2 > - Base_kernel; + typedef CGALi::Curved_kernel_via_analysis_2_base < Self, void, + CurveKernel_2 > Base_kernel; //!@} public: diff --git a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h index 908b67d4294..77693a67cae 100755 --- a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h +++ b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Arc_2.h @@ -633,9 +633,9 @@ public: //!@} -#define CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(X, Y, Z) \ +#define CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(X, Y) \ typename Curved_kernel_via_analysis_2::X Y = \ - Curved_kernel_via_analysis_2::instance().Z(); \ + Curved_kernel_via_analysis_2::instance().Y##_object(); \ public: @@ -862,7 +862,7 @@ public: //!@} -private: +public: //! \name Shortcuts for code readability //!@{ @@ -923,8 +923,7 @@ public: ) const { CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Compare_x_near_boundary_2, - compare_x_near_boundary_2, - compare_x_near_boundary_2_object); + compare_x_near_boundary_2); CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); return compare_x_near_boundary_2( p, *dynamic_cast< const Kernel_arc_2* >(this), ce @@ -979,8 +978,7 @@ public: const Kernel_arc_2& cv2, CGAL::Arr_curve_end ce2) const { CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Compare_x_near_boundary_2, - compare_x_near_boundary_2, - compare_x_near_boundary_2_object); + compare_x_near_boundary_2); CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); return compare_x_near_boundary_2( *dynamic_cast< const Kernel_arc_2* >(this), ce1, cv2, ce2 @@ -1007,8 +1005,7 @@ public: ) const { CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Compare_y_near_boundary_2, - compare_y_near_boundary_2, - compare_y_near_boundary_2_object); + compare_y_near_boundary_2); CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); return compare_y_near_boundary_2( *dynamic_cast< const Kernel_arc_2* >(this), cv2, ce @@ -1044,8 +1041,7 @@ public: CGAL::Comparison_result compare_y_at_x(const Point_2& p) const { CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Compare_y_at_x_2, - compare_y_at_x_2, - compare_y_at_x_2_object); + compare_y_at_x_2); CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); return compare_y_at_x_2(p, *dynamic_cast< const Kernel_arc_2* >(this)); } @@ -1071,8 +1067,7 @@ public: const Point_2 &p) const { CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Compare_y_at_x_left_2, - compare_y_at_x_left_2, - compare_y_at_x_left_2_object); + compare_y_at_x_left_2); CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); return compare_y_at_x_left_2( *dynamic_cast< const Kernel_arc_2* >(this), cv2, p @@ -1099,8 +1094,7 @@ public: const Point_2 &p) const { CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Compare_y_at_x_right_2, - compare_y_at_x_right_2, - compare_y_at_x_right_2_object); + compare_y_at_x_right_2); CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); return compare_y_at_x_right_2( *dynamic_cast< const Kernel_arc_2* >(this), cv2, p @@ -1200,8 +1194,7 @@ public: bool is_equal(const Kernel_arc_2& cv2) const { CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Equal_2, - equal_2, - equal_2_object); + equal_2); CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); return equal_2(*dynamic_cast< const Kernel_arc_2* >(this), cv2); @@ -1217,8 +1210,7 @@ public: bool do_overlap(const Kernel_arc_2& cv2) const { CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Do_overlap_2, - do_overlap_2, - do_overlap_2_object); + do_overlap_2); CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); return do_overlap_2(*dynamic_cast< const Kernel_arc_2* >(this), cv2); } @@ -1299,8 +1291,7 @@ public: OutputIterator oi) const { CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Intersect_2, - intersect_2, - intersect_2_object); + intersect_2); CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); return intersect_2( @@ -1403,7 +1394,8 @@ public: // do we need this method separetely ?? Kernel_arc_2 trim(const Point_2& p, const Point_2& q) const { - CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Trim_2, trim_2, trim_2_object); + CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Trim_2, trim_2); + CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); return trim_2(*dynamic_cast< const Kernel_arc_2* >(this), p, q); } @@ -1420,8 +1412,7 @@ public: void split(const Point_2& p, Kernel_arc_2& s1, Kernel_arc_2& s2) const { CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Split_2, - split_2, - split_2_object); + split_2); CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); split_2(*dynamic_cast< const Kernel_arc_2* >(this), p, s1, s2); } @@ -1436,8 +1427,7 @@ public: bool are_mergeable(const Kernel_arc_2& cv2) const { CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Are_mergeable_2, - are_mergeable_2, - are_mergeable_2_object); + are_mergeable_2); CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); return are_mergeable_2( *dynamic_cast< const Kernel_arc_2* >(this), cv2 @@ -1455,7 +1445,7 @@ public: */ Kernel_arc_2 merge(const Kernel_arc_2& cv2) const { - CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Merge_2, merge_2, merge_2_object); + CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Merge_2, merge_2); Kernel_arc_2 tmp; CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); merge_2(*dynamic_cast< const Kernel_arc_2* >(this), cv2, tmp); @@ -1463,9 +1453,6 @@ public: } //!@} - -#undef CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC - //!\name Simplification //!@{ @@ -1566,41 +1553,31 @@ protected: if (p.location() == CGAL::ARR_INTERIOR && q.location() == CGAL::ARR_INTERIOR) { - Kernel_arc_2 new_arc= this->_replace_endpoints( - p, q, - (this->is_vertical() ? -1 : this->arcno(p.x())), - (this->is_vertical() ? -1 : this->arcno(q.x())) - ).first; - - return new_arc; - } else { + return _replace_endpoints(p, q, + (is_vertical() ? -1 : arcno(p.x())), + (is_vertical() ? -1 : arcno(q.x()))).first; + } - if (p.location() != CGAL::ARR_INTERIOR && - q.location() != CGAL::ARR_INTERIOR) { - return *this; - } - if (p.location() != CGAL::ARR_INTERIOR && - q.location() == CGAL::ARR_INTERIOR) { + if (p.location() != CGAL::ARR_INTERIOR && + q.location() != CGAL::ARR_INTERIOR) + return static_cast(*this); + + Kernel_arc_2 left_arc, right_arc; + CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Split_2, split_2); + + if (p.location() != CGAL::ARR_INTERIOR && + q.location() == CGAL::ARR_INTERIOR) { - Kernel_arc_2 left_arc, right_arc; - // TODO really use instance? - Curved_kernel_via_analysis_2::instance(). - split_2_object()(*this,q,left_arc,right_arc); - return left_arc; - } - if (p.location() == CGAL::ARR_INTERIOR && - q.location() != CGAL::ARR_INTERIOR) { - - Kernel_arc_2 left_arc, right_arc; - // TODO really use instance? - Curved_kernel_via_analysis_2::instance(). - split_2_object()(*this,p,left_arc,right_arc); - return right_arc; - - } + split_2(static_cast(*this), q, left_arc, + right_arc); + return left_arc; } - CGAL_error_msg("Never reached"); - return *this; + // if (p.location() == CGAL::ARR_INTERIOR && + // q.location() != CGAL::ARR_INTERIOR) + + split_2(static_cast(*this), p, left_arc, + right_arc); + return right_arc; } public: @@ -1619,7 +1596,9 @@ public: bool trim_by_arc(const Kernel_arc_2& cv2, Kernel_arc_2& trimmed1, Kernel_arc_2& trimmed2) const { - const Kernel_arc_2& cv1 = *this; + CGAL_precondition(dynamic_cast< const Kernel_arc_2* >(this)); + + const Kernel_arc_2& cv1 = static_cast< const Kernel_arc_2& >(*this); Point_2 common_left, common_right; @@ -1629,14 +1608,13 @@ public: return false; } - typename Curve_kernel_2::Compare_x_2 compare_x; - - typename Curved_kernel_via_analysis_2_Functors - ::Construct_point_on_arc_2 - construct_point_on_arc = - Curved_kernel_via_analysis_2::instance(). - construct_point_on_arc_2_object(); - + typename Curve_kernel_2::Compare_x_2 compare_x( + Curved_kernel_via_analysis_2::instance(). + kernel().compare_x_2_object()); + + CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC(Construct_point_on_arc_2, + construct_point_on_arc_2); + Point_2 left1, left2; if (common_left.location() != CGAL::ARR_LEFT_BOUNDARY) { @@ -1646,7 +1624,7 @@ public: common_left.x()) == CGAL::EQUAL) ) { left1 = cv1._minpoint(); } else { - left1 = construct_point_on_arc(common_left.x(), + left1 = construct_point_on_arc_2(common_left.x(), cv1.curve(), cv1.arcno(), cv1); @@ -1657,7 +1635,7 @@ public: common_left.x()) == CGAL::EQUAL) ) { left2 = cv2._minpoint(); } else { - left2 = construct_point_on_arc(common_left.x(), + left2 = construct_point_on_arc_2(common_left.x(), cv2.curve(), cv2.arcno(), cv2); @@ -1678,7 +1656,7 @@ public: common_right.x()) == CGAL::EQUAL) ) { right1 = cv1._maxpoint(); } else { - right1 = construct_point_on_arc(common_right.x(), + right1 = construct_point_on_arc_2(common_right.x(), cv1.curve(), cv1.arcno(), cv1); @@ -1689,7 +1667,7 @@ public: common_right.x()) == CGAL::EQUAL) ) { right2 = cv2._maxpoint(); } else { - right2 = construct_point_on_arc(common_right.x(), + right2 = construct_point_on_arc_2(common_right.x(), cv2.curve(), cv2.arcno(), cv2); @@ -1704,7 +1682,7 @@ public: trimmed2 = cv2._trim(left2, right2); return joint; -} + } //!@} @@ -2756,6 +2734,8 @@ protected: construct_point_on_arc = Curved_kernel_via_analysis_2::instance(). construct_point_on_arc_2_object(); + + Point_2 xy = construct_point_on_arc( x, nonvert.curve(), nonvert.arcno(x), nonvert ); @@ -2861,6 +2841,7 @@ protected: return oi; } + #undef CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_ARC //!@} public: @@ -2910,8 +2891,11 @@ public: #define CGAL_BEFRIEND_CKvA_2_FUNCTOR(Z) \ friend class Curved_kernel_via_analysis_2::Z; \ friend class Curved_kernel_via_analysis_2_Functors:: \ - Z< Curved_kernel_via_analysis_2 >; \ - + Z; + +//Curved_kernel_via_analysis_2_functors< + // Curved_kernel_via_analysis_2> >; + CGAL_BEFRIEND_CKvA_2_FUNCTOR(Construct_arc_2); CGAL_BEFRIEND_CKvA_2_FUNCTOR(Is_vertical_2); CGAL_BEFRIEND_CKvA_2_FUNCTOR(Is_bounded_2); diff --git a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Curve_interval_arcno_cache.h b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Curve_interval_arcno_cache.h index 3819c3b9171..ff304002dd5 100755 --- a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Curve_interval_arcno_cache.h +++ b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Curve_interval_arcno_cache.h @@ -35,18 +35,14 @@ namespace CGALi { * for each \c Status_line_1 object stores the precomputed mapping * from interval arcnos (on left and right sides) to event arcnos */ -template +template struct Curve_interval_arcno_cache { //!\name Public types //!@{ //! this instance's first template parameter - typedef CurvedKernelViaAnalysis_2 Curved_kernel_via_analysis_2; - - //! type of curve kernel - typedef typename Curved_kernel_via_analysis_2::Curve_kernel_2 - Curve_kernel_2; + typedef CurveKernel_2 Curve_kernel_2; //! type of curve analysis typedef typename Curve_kernel_2::Curve_analysis_2 Curve_analysis_2; @@ -83,13 +79,9 @@ struct Curve_interval_arcno_cache { /*!\brief * Standard constructor - * - * \param kernel The kernel that is used internally */ - Curve_interval_arcno_cache(Curved_kernel_via_analysis_2 *kernel) : - _m_curved_kernel_2(kernel), _m_last_curve_id(-1) { - - CGAL_assertion(kernel != NULL); + Curve_interval_arcno_cache() : + _m_last_curve_id(-1) { } //!@} @@ -207,9 +199,6 @@ private: //!\name Private members //!@{ - //! pointer to \c Curved_kernel_via_analysis_2 - Curved_kernel_via_analysis_2 *_m_curved_kernel_2; - //! a pair of vectors (right and left side of event-line respectively) typedef std::pair, std::vector > Arcno_vector_pair; diff --git a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Curved_kernel_via_analysis_2_functors.h b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Curved_kernel_via_analysis_2_functors.h index 30002f10dcf..f37b9021754 100755 --- a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Curved_kernel_via_analysis_2_functors.h +++ b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Curved_kernel_via_analysis_2_functors.h @@ -27,7 +27,7 @@ CGAL_BEGIN_NAMESPACE namespace CGALi { #ifndef CERR -//#define CKvA_DEBUG_PRINT_CERR +#define CKvA_DEBUG_PRINT_CERR #ifdef CKvA_DEBUG_PRINT_CERR #define CERR(x) std::cerr << x #else @@ -53,10 +53,7 @@ public: //! this instance's template parameter typedef CurvedKernelViaAnalysis_2 Curved_kernel_via_analysis_2; - //! the curve type - typedef typename Curved_kernel_via_analysis_2::Curve_2 Curve_2; - - //! the point type + //! the point type typedef typename Curved_kernel_via_analysis_2::Point_2 Point_2; //! the arc type @@ -115,17 +112,12 @@ protected: //!@} }; - #define CGAL_CKvA_2_GRAB_BASE_FUNCTOR_TYPES \ - typedef typename Base::Curve_2 Curve_2; \ typedef typename Base::Point_2 Point_2; \ typedef typename Base::Arc_2 Arc_2; \ typedef typename Base::Curve_analysis_2 Curve_analysis_2; \ typedef typename Base::X_coordinate_1 X_coordinate_1; \ -// end define - - /*!\brief * Functor to construct a point on a curve */ @@ -157,7 +149,7 @@ public: } /*!\brief - * Constructs a interior point + * Constructs an interior point * * \param x x-coordinate * \param c The supporting curve @@ -212,18 +204,18 @@ public: * \param arc Can be used to query meta data * \return The constructed point */ - Point_2 operator()( - const X_coordinate_1& x, - const Curve_analysis_2& c, int arcno, - const Arc_2& arc) { - CGAL_assertion(c.id() == arc.curve().id()); - CGAL_assertion(arcno == arc.arcno(x)); + Point_2 operator()(const X_coordinate_1& x, + const Curve_analysis_2& c, int arcno, const Arc_2& arc) { - typename Curved_kernel_via_analysis_2::Construct_point_2 - construct_point = Curved_kernel_via_analysis_2::instance(). - construct_point_2_object(); - - Point_2 pt = construct_point(x, c, arcno); + CGAL::set_pretty_mode(std::cerr); + CERR("point: " << CGAL::to_double(x) << ", " << arcno << ", " << + c.id() << + "\narc = " << arc << "\n"); + + CGAL_assertion(c.id() == arc.curve().id()); + //CGAL_assertion(arcno == arc.arcno(x)); + + Point_2 pt = Base::_ckva()->construct_point_2_object()(x, c, arcno); // here we can modify the point, if we want to return pt; @@ -575,7 +567,6 @@ public: } }; -// Functor computing parameter space in y for arc template < class CurvedKernelViaAnalysis_2 > class Parameter_space_in_y_2 : public Curved_kernel_via_analysis_2_functor_base< CurvedKernelViaAnalysis_2 > { @@ -726,7 +717,7 @@ public: /*!\brief * Functor that compares x-coordinates of two interior points */ -template +template < class CurvedKernelViaAnalysis_2 > class Compare_x_2 : public Curved_kernel_via_analysis_2_functor_base< CurvedKernelViaAnalysis_2 > { @@ -832,7 +823,7 @@ public: /*!\brief * Functor that compares x-coordinates near the top or bottom boundary */ -template +template < class CurvedKernelViaAnalysis_2 > class Compare_x_near_boundary_2 : public Curved_kernel_via_analysis_2_functor_base< CurvedKernelViaAnalysis_2 > { @@ -1150,25 +1141,24 @@ public: cv.is_in_x_range(p.x(), &eq_min, &eq_max); CGAL_assertion(in_x_range); + typename Base::Curve_kernel_2::Compare_xy_2 cmp_xy( + Base::_ckva()->kernel().compare_xy_2_object()); + if (cv.is_vertical()) { if (cv.is_finite(CGAL::ARR_MIN_END)) { // for vertical arcs we can ask for .xy() member - if (Curved_kernel_via_analysis_2::instance().kernel(). - compare_xy_2_object()( - p.xy(), cv._minpoint().xy(), true - ) == CGAL::SMALLER) { + if (cmp_xy(p.xy(), cv._minpoint().xy(), true) == + CGAL::SMALLER) { CERR("cmp result: " << CGAL::SMALLER << "\n"); return CGAL::SMALLER; } } if (cv.is_finite(CGAL::ARR_MAX_END)) { - if (Curved_kernel_via_analysis_2::instance().kernel(). - compare_xy_2_object()( - p.xy(), cv._maxpoint().xy(), true - ) == CGAL::LARGER) { + if (cmp_xy(p.xy(), cv._maxpoint().xy(), true) == + CGAL::LARGER) { CERR("cmp result: " << CGAL::LARGER << "\n"); return CGAL::LARGER; } @@ -1178,25 +1168,17 @@ public: } CGAL::Comparison_result res; if (eq_min) { - res = Curved_kernel_via_analysis_2::instance().kernel(). - compare_xy_2_object()( - p.xy(), cv._minpoint().xy(), true - ); + res = cmp_xy(p.xy(), cv._minpoint().xy(), true); + } else if (eq_max) { - res = Curved_kernel_via_analysis_2::instance().kernel(). - compare_xy_2_object()( - p.xy(), cv._maxpoint().xy(), true - ); + res = cmp_xy(p.xy(), cv._maxpoint().xy(), true); + } else { - Point_2 point_on_s - = Curved_kernel_via_analysis_2::instance(). - construct_point_on_arc_2_object() - ( p.x(), - cv.curve(), - cv.arcno(), - cv ); - res = Curved_kernel_via_analysis_2::instance().kernel(). - compare_xy_2_object()(p.xy(), point_on_s.xy(), true); + Point_2 point_on_s = + Base::_ckva()->construct_point_on_arc_2_object() + (p.x(), cv.curve(), cv.arcno(), cv ); + + res = cmp_xy(p.xy(), point_on_s.xy(), true); } CERR("cmp result: " << res << "\n"); return res; @@ -1803,10 +1785,7 @@ public: CGAL_precondition(p.location() == CGAL::ARR_INTERIOR); CGAL_precondition(q.location() == CGAL::ARR_INTERIOR); - CGAL_precondition( - !Curved_kernel_via_analysis_2::instance(). - equal_2_object()(p, q) - ); + CGAL_precondition(!Base::_ckva()->equal_2_object()(p, q)); CGAL_precondition(cv.compare_y_at_x(p) == CGAL::EQUAL); CGAL_precondition(cv.compare_y_at_x(q) == CGAL::EQUAL); @@ -1957,13 +1936,12 @@ public: CGAL_precondition(cv1.is_interior(common.location())); // check that there are no other non-vertical branches coming // through this point - typedef typename - Curved_kernel_via_analysis_2::Curve_kernel_2::Curve_analysis_2 - Curve_analysis_2; + Curve_analysis_2 ca_2(cv1.curve()); typename Curve_analysis_2::Status_line_1 cv_line = ca_2.status_line_for_x(common.x()); CGAL_assertion(cv_line.is_event()); // ?? + // we are not allowed to use number_of_incident_branches() // since the common point might be supported by different curve, // and therefore its arcno might be not valid for *this arc @@ -2130,7 +2108,7 @@ public: /*!\brief * Functor that decomposes curve into x-monotone arcs and isolated points */ -template < class CurvedKernelViaAnalysis_2> +template < class CurvedKernelViaAnalysis_2 > class Make_x_monotone_2 : public Curved_kernel_via_analysis_2_functor_base< CurvedKernelViaAnalysis_2 > { @@ -2189,10 +2167,11 @@ public: * \return The past-the-end iterator */ template < class OutputIterator > - OutputIterator operator()(const Curve_2& cv, OutputIterator oi) const { + OutputIterator operator()(const Curve_analysis_2& cv, OutputIterator oi) + const { CGAL::CGALi::Make_x_monotone_2< Curved_kernel_via_analysis_2 > - make_x_monotone(&Curved_kernel_via_analysis_2::instance()); + make_x_monotone(Base::_ckva()); return make_x_monotone(cv, oi); } @@ -2218,7 +2197,7 @@ public: oi = (*this)(curve, oi); else if(CGAL::assign(nxarc, obj)) oi = std::transform(nxarc.begin(), nxarc.end(), oi, - std::ptr_fun(CGAL::make_object)); + std::ptr_fun(CGAL::make_object)); else // allow the remaining objects to pass through *oi++ = obj; return oi; @@ -2228,7 +2207,7 @@ public: /*!\brief * Functor that computes the x-extreme points of a curve */ -template < class CurvedKernelViaAnalysis_2> +template < class CurvedKernelViaAnalysis_2 > class X_extreme_points_2 : public Curved_kernel_via_analysis_2_functor_base< CurvedKernelViaAnalysis_2 > { @@ -2242,9 +2221,12 @@ public: Base; CGAL_CKvA_2_GRAB_BASE_FUNCTOR_TYPES; + + typedef typename Curve_analysis_2::Xy_coordinate_2 Xy_coordinate_2; //! the result type - typedef std::iterator< std::output_iterator_tag, Point_2 > result_type; + typedef std::iterator< std::output_iterator_tag, Xy_coordinate_2 > + result_type; //! the arity of the functor typedef Arity_tag<2> Arity; @@ -2276,24 +2258,13 @@ public: for( int j = 0; j < lifts; j++ ) { - std::pair incident_arcs - = status_line.number_of_incident_branches(j); - - if ( ( incident_arcs.first == 0 ) || - (incident_arcs.second == 0) ) { - - typename Point_2::Xy_coordinate_2 xy - = status_line.algebraic_real_2(j); - - Point_2 p = Base::_ckva()->construct_point_2_object() - (xy.x(),xy.curve(),xy.arcno()); - oi++ = p; - } + std::pair arcs = + status_line.number_of_incident_branches(j); + if (arcs.first == 0 || arcs.second == 0) + *oi++ = status_line.algebraic_real_2(j); } - } - return oi; } @@ -2302,7 +2273,7 @@ public: /*!\brief * Functor that computes the y-extreme points of a curve */ -template < class CurvedKernelViaAnalysis_2> +template < class CurvedKernelViaAnalysis_2 > class Y_extreme_points_2 : public Curved_kernel_via_analysis_2_functor_base< CurvedKernelViaAnalysis_2 > { @@ -2316,9 +2287,12 @@ public: Base; CGAL_CKvA_2_GRAB_BASE_FUNCTOR_TYPES; + + typedef typename Curve_analysis_2::Xy_coordinate_2 Xy_coordinate_2; //! the result type - typedef std::iterator< std::output_iterator_tag, Point_2 > result_type; + typedef std::iterator< std::output_iterator_tag, Xy_coordinate_2 > + result_type; //! the arity of the functor typedef Arity_tag<2> Arity; @@ -2340,61 +2314,54 @@ public: typedef typename Curve_analysis_2::Status_line_1 Status_line_1; - std::vector y_critical_points; - typename Base::Curve_kernel_2 curve_kernel = Base::_ckva()->kernel(); Curve_analysis_2 ca_yx = curve_kernel.swap_x_and_y_2_object() (ca); - Base::_ckva()->x_extreme_points_2_object() - ( ca_yx, std::back_inserter(y_critical_points) ); + std::vector y_critical_points; - for( typename std::vector::iterator it + Base::_ckva()->x_extreme_points_2_object()(ca_yx, + std::back_inserter(y_critical_points)); + + for( typename std::vector::iterator it = y_critical_points.begin(); it != y_critical_points.end(); it++ ) { - X_coordinate_1 curr_x - = curve_kernel.get_y_2_object() ( it->xy() ); + X_coordinate_1 curr_x = curve_kernel.get_y_2_object()( *it ); Status_line_1 status_line = ca.status_line_at_exact_x(curr_x); int lifts = status_line.number_of_events(); for( int i = 0; i < lifts; i++ ) { - typename Point_2::Xy_coordinate_2 lift_xy - = status_line.algebraic_real_2(i); + Xy_coordinate_2 lift_xy = status_line.algebraic_real_2(i); bool y_coordinate_found; while(true) { if( curve_kernel.upper_boundary_y_2_object() (lift_xy) < - curve_kernel.lower_boundary_x_2_object() (it->xy()) ) { + curve_kernel.lower_boundary_x_2_object() (*it) ) { y_coordinate_found = false; break; } if( curve_kernel.upper_boundary_y_2_object() (lift_xy) >= - curve_kernel.upper_boundary_x_2_object() (it->xy()) ) { + curve_kernel.upper_boundary_x_2_object() (*it) ) { y_coordinate_found = true; break; } - curve_kernel.refine_x_2_object() (it->xy()); + curve_kernel.refine_x_2_object() (*it); } if(y_coordinate_found) { - int arcno = i; - *oi++ = Base::_ckva()->construct_point_2_object() - (curr_x, ca, arcno); + *oi++ = Xy_coordinate_2(curr_x, ca, i); break; } - } - } - return oi; } @@ -2406,9 +2373,9 @@ public: } // namespace Curved_kernel_via_analysis_2_Functors /*!\brief - * Collects main set of functors of a curved kernel + * Collects the main set of functors of a curved kernel */ -template < class CurvedKernelViaAnalysis_2 > +template < class CurvedKernelViaAnalysis_2, class Dummy = void> class Curved_kernel_via_analysis_2_functors { public: @@ -2418,16 +2385,15 @@ public: //! this instance's first template parameter typedef CurvedKernelViaAnalysis_2 Curved_kernel_via_analysis_2; - - // declares curved kernel functors, - // for each functor defines a member function +// typedef Curved_kernel_via_analysis_2_functors< +// CurvedKernelViaAnalysis_2 > Functor_base; + +// declares curved kernel functors, for each functor defines a member function // returning an instance of this functor #define CGAL_CKvA_2_functor_pred(Y, Z) \ - /*!\brief functor */ \ typedef \ - Curved_kernel_via_analysis_2_Functors::Y< Curved_kernel_via_analysis_2 > \ - Y; \ - /*!\brief returns instance of functor */ \ + Curved_kernel_via_analysis_2_Functors::Y< Curved_kernel_via_analysis_2 \ + > Y; \ Y Z() const { return Y(&Curved_kernel_via_analysis_2::instance()); } #define CGAL_CKvA_2_functor_cons(Y, Z) CGAL_CKvA_2_functor_pred(Y, Z) @@ -2467,6 +2433,15 @@ public: CGAL_CKvA_2_functor_cons(Make_x_monotone_2, make_x_monotone_2_object); CGAL_CKvA_2_functor_cons(X_extreme_points_2, x_extreme_points_2_object); CGAL_CKvA_2_functor_cons(Y_extreme_points_2, y_extreme_points_2_object); + + CGAL_CKvA_2_functor_cons(Construct_point_2, + construct_point_2_object); + + CGAL_CKvA_2_functor_cons(Construct_point_on_arc_2, + construct_point_on_arc_2_object); + + CGAL_CKvA_2_functor_cons(Construct_arc_2, + construct_arc_2_object); #undef CGAL_CKvA_2_functor_pred #undef CGAL_CKvA_2_functor_cons diff --git a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h index 31f9d1758b0..ff3b08d67db 100755 --- a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h +++ b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2/Point_2.h @@ -450,9 +450,9 @@ public: //!\name Predicates //!@{ -#define CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_POINT(X, Y, Z) \ +#define CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_POINT(X, Y) \ typename Curved_kernel_via_analysis_2::X Y = \ - Curved_kernel_via_analysis_2::instance().Z(); \ + Curved_kernel_via_analysis_2::instance().Y##_object(); \ /*!\brief * Compares x-coordinates of this point with \c q @@ -468,9 +468,7 @@ public: CGAL_precondition(this->ptr()->_m_xy); CGAL_precondition(q.ptr()->_m_xy); - CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_POINT(Compare_x_2, - compare_x_2, - compare_x_2_object); + CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_POINT(Compare_x_2, compare_x_2); CGAL_precondition(dynamic_cast< const Kernel_point_2* >(this)); return compare_x_2(*dynamic_cast< const Kernel_point_2* >(this), q); } @@ -492,9 +490,7 @@ public: CGAL_precondition(this->ptr()->_m_xy); CGAL_precondition(q.ptr()->_m_xy); - CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_POINT(Compare_xy_2, - compare_xy_2, - compare_xy_2_object); + CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_POINT(Compare_xy_2, compare_xy_2); CGAL_precondition(dynamic_cast< const Kernel_point_2* >(this)); return compare_xy_2( *dynamic_cast< const Kernel_point_2* >(this), q, equal_x @@ -513,9 +509,7 @@ public: ) const { CGAL_precondition(this->ptr()->_m_xy); - CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_POINT(Is_on_2, - is_on_2, - is_on_2_object); + CGAL_CKvA_2_GRAB_CK_FUNCTOR_FOR_POINT(Is_on_2, is_on_2); CGAL_precondition(dynamic_cast< const Kernel_point_2* >(this)); return is_on_2(*dynamic_cast< const Kernel_point_2* >(this), curve); } @@ -673,9 +667,9 @@ public: // befriending the functors #define CGAL_BEFRIEND_CKvA_2_FUNCTOR(Z) \ - friend class Curved_kernel_via_analysis_2::Z; \ + friend class Curved_kernel_via_analysis_2::Z; \ friend class Curved_kernel_via_analysis_2_Functors:: \ - Z< Curved_kernel_via_analysis_2 >; \ + Z< Curved_kernel_via_analysis_2 >; CGAL_BEFRIEND_CKvA_2_FUNCTOR(Construct_point_2); CGAL_BEFRIEND_CKvA_2_FUNCTOR(Compare_x_2); diff --git a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2l.h b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2l.h index f04867097dd..dcd9ce55f74 100644 --- a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2l.h +++ b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2l.h @@ -28,25 +28,93 @@ #include #include - CGAL_BEGIN_NAMESPACE +namespace CGALi { + +template +struct CKvA2l_functor_base : + public BaseCKvA::template rebind< CKvA2l >::Functor_base { + + typedef CKvA2l Self; + + typedef typename BaseCKvA::template rebind< Self >::Functor_base + Functor_base; + + //! type of Construct_point_2 functor + typedef + CGALi::Curved_kernel_via_analysis_2l_Functors::Construct_point_2l< Self > + Construct_point_2; + //! returns an instance of Construct_point_2 functor + Construct_point_2 construct_point_2_object() const { + return Construct_point_2(&Self::instance()); + } + + //! type of Construct_projected_point_2 functor + typedef typename BaseCKvA::Construct_point_2 + Construct_projected_point_2; + //! returns an instance of Construct_projected_point_2 functor + Construct_projected_point_2 construct_projected_point_2_object() const { + + return BaseCKvA::instance().construct_point_2_object(); + } + + //! type of Construct_arc_2 functor + typedef + CGALi::Curved_kernel_via_analysis_2l_Functors::Construct_arc_2l< Self > + Construct_arc_2; + //! returns an instance of Construct_arc_2 functor + Construct_arc_2 construct_arc_2_object() const { + return Construct_arc_2(&Self::instance()); + } + + //! type of Construct_projected_arc_2 functor + typedef typename BaseCKvA::Construct_arc_2 + Construct_projected_arc_2; + //! returns an instance of Construct_projected_arc_2 functor + Construct_projected_arc_2 construct_projected_arc_2_object() const { + + return BaseCKvA::instance().construct_arc_2_object(); + } + + // declares curved kernel functors, + // for each functor defines a member function +// returning an instance of this functor +#define CGAL_CKvA_2l_functor_pred(Y, Z) \ + typedef CGALi::Curved_kernel_via_analysis_2l_Functors::Y< Self > Y; \ + Y Z() const { return Y(&Self::instance()); } + +#define CGAL_CKvA_2l_functor_cons(Y, Z) CGAL_CKvA_2l_functor_pred(Y, Z) + +public: + + CGAL_CKvA_2l_functor_pred(Compare_xyz_3, compare_xyz_3_object); + + CGAL_CKvA_2l_functor_pred(Is_on_2, is_on_2_object); + + CGAL_CKvA_2l_functor_pred(Is_on_3, is_on_3_object); + +#undef CGAL_CKvA_2l_functor_pred +#undef CGAL_CKvA_2l_functor_cons +}; + +} // namespace CGALi + + //! basic kernel to maintain points and arcs on a surface -template < class CurvedKernelViaAnalysis_2, class SurfacePair_3 > +template < class BaseCKvA_2, class SurfacePair_3 > class Curved_kernel_via_analysis_2l : - public CurvedKernelViaAnalysis_2:: - template rebind< - Curved_kernel_via_analysis_2l< - CurvedKernelViaAnalysis_2, SurfacePair_3 - > - >::Other + public CGALi::Curved_kernel_via_analysis_2_base< + Curved_kernel_via_analysis_2l< BaseCKvA_2, SurfacePair_3 >, + BaseCKvA_2, typename BaseCKvA_2::Curve_kernel_2, + CGALi::CKvA2l_functor_base > { public: //! \name public typedefs //!@{ //! this instance's first template argument - typedef CurvedKernelViaAnalysis_2 Curved_kernel_via_analysis_2; + typedef BaseCKvA_2 Curved_kernel_via_analysis_2; //! this instance's second template parameter typedef SurfacePair_3 Surface_pair_3; @@ -86,15 +154,13 @@ public: //!@} -public: - //!\name base type - //!@{ +protected: - //! the base type - typedef typename Curved_kernel_via_analysis_2:: - template rebind< Self >::Other Base; - - //!@} + //! base kernel type + typedef CGALi::Curved_kernel_via_analysis_2_base< + Self, Curved_kernel_via_analysis_2, Curve_kernel_2, + CGALi::CKvA2l_functor_base > + Base_kernel; public: //! \name Constructors @@ -102,78 +168,15 @@ public: //! default constructor Curved_kernel_via_analysis_2l() : - Base() { + Base_kernel() { } //! construct using specific \c Curve_kernel_2 instance (for controlling) Curved_kernel_via_analysis_2l(const Curve_kernel_2& kernel) : - Base(kernel) { + Base_kernel(kernel) { } //!@} - - //!\name embedded constructions and predicates - //!@{ - - //! type of Construct_point_2 functor - typedef - CGALi::Curved_kernel_via_analysis_2l_Functors::Construct_point_2l< Self > - Construct_point_2; - //! returns an instance of Construct_point_2 functor - Construct_point_2 construct_point_2_object() const { - return Construct_point_2(&Self::instance()); - } - - //! type of Construct_projected_point_2 functor - typedef typename Curved_kernel_via_analysis_2::Construct_point_2 - Construct_projected_point_2; - //! returns an instance of Construct_projected_point_2 functor - Construct_projected_point_2 construct_projected_point_2_object() const { - return - Curved_kernel_via_analysis_2(this->kernel()). - construct_point_2_object(); - } - - //! type of Construct_arc_2 functor - typedef - CGALi::Curved_kernel_via_analysis_2l_Functors::Construct_arc_2l< Self > - Construct_arc_2; - //! returns an instance of Construct_arc_2 functor - Construct_arc_2 construct_arc_2_object() const { - return Construct_arc_2(&Self::instance()); - } - - //! type of Construct_projected_arc_2 functor - typedef typename Curved_kernel_via_analysis_2::Construct_arc_2 - Construct_projected_arc_2; - //! returns an instance of Construct_projected_arc_2 functor - Construct_projected_arc_2 construct_projected_arc_2_object() const { - return - Curved_kernel_via_analysis_2(this->kernel()). - construct_arc_2_object(); - } - - // declares curved kernel functors, - // for each functor defines a member function -// returning an instance of this functor -#define CGAL_CKvA_2l_functor_pred(Y, Z) \ - typedef CGALi::Curved_kernel_via_analysis_2l_Functors::Y< Self > Y; \ - Y Z() const { return Y(&Self::instance()); } - -#define CGAL_CKvA_2l_functor_cons(Y, Z) CGAL_CKvA_2l_functor_pred(Y, Z) - -public: - - CGAL_CKvA_2l_functor_pred(Compare_xyz_3, compare_xyz_3_object); - - CGAL_CKvA_2l_functor_pred(Is_on_2, is_on_2_object); - - CGAL_CKvA_2l_functor_pred(Is_on_3, is_on_3_object); - -#undef CGAL_CKvA_2l_functor_pred -#undef CGAL_CKvA_2l_functor_cons - - //!@} }; // class Curved_kernel_via_analysis_2l diff --git a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2l/Curved_kernel_via_analysis_2l_functors.h b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2l/Curved_kernel_via_analysis_2l_functors.h index 2e5cfdd77f7..80dfeb80bc5 100644 --- a/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2l/Curved_kernel_via_analysis_2l_functors.h +++ b/Curved_kernel_via_analysis_2/include/CGAL/Curved_kernel_via_analysis_2l/Curved_kernel_via_analysis_2l_functors.h @@ -41,7 +41,7 @@ namespace CGALi { namespace Curved_kernel_via_analysis_2l_Functors { #define CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES \ - typedef typename Base::Curve_2 Curve_2; \ + typedef typename Base::Curve_analysis_2 Curve_analysis_2; \ typedef typename Base::Point_2 Point_2; \ typedef typename Base::Arc_2 Arc_2; \ typedef typename Base::X_coordinate_1 X_coordinate_1; \ @@ -577,7 +577,7 @@ public: * \param c The curve * \return (true) if the \c p lies on \c c */ - result_type operator()(const Point_2& p, const Curve_2& c) const { + result_type operator()(const Point_2& p, const Curve_analysis_2& c) const { CERR("\nqkvais_on_2: p: " << p << "\n curve: " << c << "\n"); // FUTURE TODO implement Is_on_2 with Curve_2 == Surface_3 (eriC) diff --git a/Curved_kernel_via_analysis_2/include/CGAL/Filtered_curved_kernel_via_analysis_2.h b/Curved_kernel_via_analysis_2/include/CGAL/Filtered_curved_kernel_via_analysis_2.h index eb5c07383ab..53bf8c7c817 100755 --- a/Curved_kernel_via_analysis_2/include/CGAL/Filtered_curved_kernel_via_analysis_2.h +++ b/Curved_kernel_via_analysis_2/include/CGAL/Filtered_curved_kernel_via_analysis_2.h @@ -32,10 +32,8 @@ CGAL_BEGIN_NAMESPACE #ifndef CKvA_CERR -#ifndef CKvA_DEBUG_PRINT_CERR -#define CKvA_DEBUG_PRINT_CERR 0 -#endif -#if CKvA_DEBUG_PRINT_CERR +//#define FCKvA_DEBUG_PRINT_CERR +#ifdef FCKvA_DEBUG_PRINT_CERR #define CKvA_CERR(x) std::cout << x #else #define CKvA_CERR(x) static_cast(0) @@ -52,9 +50,9 @@ namespace Filtered_curved_kernel_via_analysis_2_Functors { typedef typename Curved_kernel_via_analysis_2::Arc_2 Arc_2; \ -template < class CurvedKernelViaAnalysis_2 > +template < class CurvedKernelViaAnalysis_2, class FunctorBase > class Compare_xy_2 : - public CurvedKernelViaAnalysis_2::Base::Compare_xy_2 { + public FunctorBase::Compare_xy_2 { public: //! this instance template parameter @@ -73,7 +71,7 @@ public: #endif //! the base type - typedef typename Curved_kernel_via_analysis_2::Base::Compare_xy_2 Base; + typedef typename FunctorBase::Compare_xy_2 Base; //! the result type typedef CGAL::Comparison_result result_type; @@ -98,20 +96,14 @@ public: CKvA_CERR("\nfilteredcompare_xy_; p1: " << p1 << "; p2: " << p2 << "\n"); - - Base base_compare_xy(this->_ckva()); - - result_type res = base_compare_xy(p1, p2, equal_x); - - CKvA_CERR("result: " << res << "\n"); - - return res; + + return Base::operator()(p1, p2, equal_x); } }; -template < class CurvedKernelViaAnalysis_2 > +template < class CurvedKernelViaAnalysis_2, class FunctorBase > class Compare_y_near_boundary_2 : - public CurvedKernelViaAnalysis_2::Base::Compare_y_near_boundary_2 { + public FunctorBase::Compare_y_near_boundary_2 { public: //! this instance template parameter @@ -131,7 +123,7 @@ public: #endif //! the bae type - typedef typename CurvedKernelViaAnalysis_2::Base::Compare_y_near_boundary_2 + typedef typename FunctorBase::Compare_y_near_boundary_2 Base; //! the result type @@ -161,7 +153,7 @@ public: CGAL_assertion_code ( CGAL::Arr_parameter_space loc1 = cv1.location(ce); ) - CGAL_precondition(cv1.is_on_left_right(loc1) && + CGAL_precondition(Arc_2::is_on_left_right(loc1) && loc1 == cv2.location(ce)); // comparing ids is the same as calling is_identical() ?? if (cv1.id() == cv2.id()) { @@ -209,7 +201,7 @@ public: CGAL_assertion_code(bool check = ) CGAL::assign(asym_info2, obj2); CGAL_assertion(check); - filter_res = this->_ckva()->kernel().compare_x_2_object()( + filter_res = Base::_ckva()->kernel().compare_x_2_object()( asym_info1, asym_info2 ); } @@ -228,18 +220,13 @@ public: return filter_res; } - Base base_compare_y_near_boundary(this->_ckva()); - - result_type res = base_compare_y_near_boundary(cv1, cv2, ce); - - CKvA_CERR("result: " << res << "\n"); - return res; + return Base::operator()(cv1, cv2, ce); } }; -template < class CurvedKernelViaAnalysis_2 > +template < class CurvedKernelViaAnalysis_2, class FunctorBase > class Compare_y_at_x_2 : - public CurvedKernelViaAnalysis_2::Base::Compare_y_at_x_2 { + public FunctorBase::Compare_y_at_x_2 { public: //! this instance template parameter @@ -259,7 +246,7 @@ public: #endif //! the bae type - typedef typename CurvedKernelViaAnalysis_2::Base::Compare_y_at_x_2 Base; + typedef typename FunctorBase::Compare_y_at_x_2 Base; //! the result type typedef CGAL::Comparison_result result_type; @@ -281,21 +268,13 @@ public: */ result_type operator()(const Point_2& p, const Arc_2& cv) const { - CKvA_CERR("\nfilteredcompare_y_at_x; p: " << p - << ";\n cv:" << cv << "\n"); - - Base base_compare_y_at_x(this->_ckva()); - - result_type res = base_compare_y_at_x(p, cv); - - CKvA_CERR("result: " << res << "\n"); - return res; + return Base::operator()(p, cv); } }; -template < class CurvedKernelViaAnalysis_2 > +template < class CurvedKernelViaAnalysis_2, class FunctorBase > class Compare_y_at_x_left_2 : - public CurvedKernelViaAnalysis_2::Base::Compare_y_at_x_left_2 { + public FunctorBase::Compare_y_at_x_left_2 { public: //! this instance template parameter @@ -315,8 +294,7 @@ public: #endif //! the bae type - typedef typename - CurvedKernelViaAnalysis_2::Base::Compare_y_at_x_left_2 Base; + typedef typename FunctorBase::Compare_y_at_x_left_2 Base; //! the result type typedef CGAL::Comparison_result result_type; @@ -343,22 +321,13 @@ public: result_type operator() (const Arc_2& cv1, const Arc_2& cv2, const Point_2& p) const { - CKvA_CERR("\ncompare_y_at_x_left(cv2); cv1: " << cv1 << "; cv2: " << - cv2 << "; p: " << p << "\n"); - - - Base base_compare_y_at_x_left(this->_ckva()); - - result_type res = base_compare_y_at_x_left(cv1, cv2, p); - - CKvA_CERR("result: " << res << "\n"); - return res; + return Base::operator()(cv1, cv2, p); } }; -template < class CurvedKernelViaAnalysis_2 > +template < class CurvedKernelViaAnalysis_2, class FunctorBase > class Compare_y_at_x_right_2 : - public CurvedKernelViaAnalysis_2::Base::Compare_y_at_x_right_2 { + public FunctorBase::Compare_y_at_x_right_2 { public: //! this instance template parameter @@ -378,8 +347,7 @@ public: #endif //! the bae type - typedef typename - CurvedKernelViaAnalysis_2::Base::Compare_y_at_x_right_2 Base; + typedef typename FunctorBase::Compare_y_at_x_right_2 Base; //! the result type typedef CGAL::Comparison_result result_type; @@ -409,25 +377,25 @@ public: CKvA_CERR("\ncompare_y_at_x_right(cv2); cv1: " << cv1 << "; cv2: " << cv2 << "; p: " << p << "\n"); - - Base base_compare_y_at_x_right(this->_ckva()); - - result_type res = base_compare_y_at_x_right(cv1, cv2, p); - - CKvA_CERR("result: " << res << "\n"); - return res; + return Base::operator()(cv1, cv2, p); } }; -//!\brief Tests two objects, whether two arcs can have an intersection -template < class CurvedKernelViaAnalysis_2 > -class May_have_intersection_2 { +template < class CurvedKernelViaAnalysis_2, class FunctorBase > +class May_have_intersection_2 : + public Curved_kernel_via_analysis_2_Functors:: + Curved_kernel_via_analysis_2_functor_base< CurvedKernelViaAnalysis_2 > { + public: //! this instance template parameter typedef CurvedKernelViaAnalysis_2 Curved_kernel_via_analysis_2; CGAL_FILTERED_CKvA_2_GRAB_BASE_FUNCTOR_TYPES; + typedef Curved_kernel_via_analysis_2_Functors:: + Curved_kernel_via_analysis_2_functor_base< CurvedKernelViaAnalysis_2 > + Base; + #if DOXYGEN_RUNNING //! type of curve typedef typename Curved_kernel_via_analysis_2::Curve_2 Curve_2; @@ -470,16 +438,14 @@ public: //! standard constructor May_have_intersection_2(Curved_kernel_via_analysis_2 *kernel) : - _m_curved_kernel(kernel) { - CGAL_assertion(kernel != NULL); + Base(kernel) { } /*!\brief * Checks whether \c cv1 and \c cv2 can have an intersection. If * not it certainly returns false, if possible, it return true. */ - template < class Arc_2_ > - bool operator()(const Arc_2_& cv1, const Arc_2_& cv2) const { + bool operator()(const Arc_2& cv1, const Arc_2& cv2) const { Arc_2 trimmed_cv1, trimmed_cv2; @@ -599,8 +565,8 @@ public: */ template < class OutputIterator > OutputIterator construct_covering_approximation( - const Arc_2& arc, OutputIterator oi - ) const { + const Arc_2& arc, OutputIterator oi) const { + CKvA_CERR("\nconstruct_covering_approximation; arc: " << arc << ";\n cv:" << arc << "\n"); @@ -641,46 +607,36 @@ public: update_y(y_min,y_max,y_interval_for_arc_end(arc,CGAL::ARR_MAX_END)); + typename Curved_kernel_via_analysis_2::Construct_point_on_arc_2 + construct_pt_on_arc(Base::_ckva()-> + construct_point_on_arc_2_object()); + if(!arc.is_vertical()) { - - + + std::vector pts; #ifdef USE_X_CRITICAL_POINTS #warning Uses X_critical points! - std::vector x_critical_points; - typename Curve_kernel_2::X_critical_points_2() - (arc.curve(), std::back_inserter(x_critical_points)); - - int n = static_cast(x_critical_points.size()); - - for( int i = 0; i < n; i++ ) { - - Xy_coordinate_2& curr_xy = x_critical_points[i]; - - Point_2 curr_point - = typename Curved_kernel_via_analysis_2 - ::Construct_point_2(_m_curved_kernel) - (curr_xy.x(),curr_xy.curve(), curr_xy.arcno()); - + (arc.curve(), std::back_inserter(pts)); #else - - std::vector y_extreme_points; - - _m_curved_kernel->y_extreme_points_2_object() - (arc.curve(), std::back_inserter(y_extreme_points)); - - int n = static_cast(y_extreme_points.size()); - - for( int i = 0; i < n; i++ ) { - - Point_2& curr_point = y_extreme_points[i]; - + Base::_ckva()->y_extreme_points_2_object()(arc.curve(), + std::back_inserter(pts)); #endif - - if( typename Curved_kernel_via_analysis_2 - ::Is_on_2(_m_curved_kernel) (curr_point, arc) ) { + int n = static_cast(pts.size()); + for( int i = 0; i < n; i++ ) { + + const Xy_coordinate_2& curr_xy = pts[i]; + + CERR("construct point on arc call: " << + curr_xy << "; arc = " << arc << "\n\n"); + Point_2 curr_point = construct_pt_on_arc + (curr_xy.x(), curr_xy.curve(), curr_xy.arcno(), arc); + + CERR("is_on_2 call: " << + curr_point << "; arc = " << arc << "\n\n"); + if(Base::_ckva()->is_on_2_object()(curr_point, arc)) { CGAL::Bbox_2 point_bbox = curr_point.xy().approximation_box_2(threshold()); std::pair y_iv @@ -689,7 +645,6 @@ public: } } - } CGAL::Bbox_2 bbox(x_min, y_min, x_max, y_max); @@ -700,16 +655,13 @@ public: return oi; } -private: - //! pointer to \c Curved_kernel_via_analysis_2 ? - Curved_kernel_via_analysis_2 *_m_curved_kernel; }; //! checks wether and how two arcs are intersection - with first filtering -template < class CurvedKernelViaAnalysis_2 > +template < class CurvedKernelViaAnalysis_2, class FunctorBase > class Intersect_2 : - public CurvedKernelViaAnalysis_2::Base::Intersect_2 { + public FunctorBase::Intersect_2 { public: //! this instance template parameter @@ -729,7 +681,7 @@ public: #endif //! the bae type - typedef typename CurvedKernelViaAnalysis_2::Base::Intersect_2 Base; + typedef typename FunctorBase::Intersect_2 Base; //! standard constructor Intersect_2(Curved_kernel_via_analysis_2 *kernel) : @@ -754,39 +706,29 @@ public: CKvA_CERR("\nfiltered_intersect; cv1: " << cv1 << ";\n cv2:" << cv2 << ""); - if (!this->_ckva()->may_have_intersection_2_object()(cv1, cv2)) { + if (!Base::_ckva()->may_have_intersection_2_object()(cv1, cv2)) { // return no one CKvA_CERR("\nfilter: sucessfull\n"); CGAL_assertion_code( { - std::list< CGAL::Object > tmp; - Base base_intersection(this->_ckva()); - base_intersection(cv1, cv2, std::back_inserter(tmp)); + std::vector tmp; + Base::operator()(cv1, cv2, std::back_inserter(tmp)); CGAL_assertion(tmp.empty()); }); - return oi; } // else CKvA_CERR("\nfilter: failed\n"); - // and call usual intersection - std::list< CGAL::Object > tmp; - Base base_intersection(this->_ckva()); - base_intersection(cv1, cv2, std::back_inserter(tmp)); - for (std::list< CGAL::Object >::const_iterator it = tmp.begin(); - it != tmp.end(); it++) { - *oi++ = *it; - } - return oi; + return Base::operator()(cv1, cv2, oi); } }; -template < class CurvedKernelViaAnalysis_2 > +template < class CurvedKernelViaAnalysis_2, class FunctorBase > class Is_on_2 : - public CurvedKernelViaAnalysis_2::Base::Is_on_2 { + public FunctorBase::Is_on_2 { public: //! this instance template parameter @@ -806,7 +748,7 @@ public: #endif //! the bae type - typedef typename CurvedKernelViaAnalysis_2::Base::Is_on_2 Base; + typedef typename FunctorBase::Is_on_2 Base; //! the result type typedef bool result_type; @@ -825,25 +767,14 @@ public: */ result_type operator()(const Point_2& p, const Curve_2& c) const { - //CKvA_CERR("\nfiltered_is_on; p: " << p << ";\n c:" << c << ""); - - Base base_is_on(this->_ckva()); - result_type res = base_is_on(p, c); - - CKvA_CERR("result: " << res << "\n"); - - return res; + CKvA_CERR("\nfiltered_is_on; p: " << p << ";\n c:" << c << ""); + + return Base::operator()(p, c); } - result_type operator()(const Point_2& p, const Arc_2& c) const { + result_type operator()(const Point_2& p, const Arc_2& arc) const { - Base base_is_on(this->_ckva()); - result_type res = base_is_on(p, c); - - CKvA_CERR("result: " << res << "\n"); - - return res; - + return Base::operator()(p, arc); } }; @@ -851,117 +782,23 @@ public: } // namespace Filtered_curved_kernel_via_analysis_2_Functors -} // namespace CGALi -/*!\brief - * Filtered curved kernel, i.e., intersection predicate is filted by first - * computing a covering approximation. Only if these overlap for two arcs - * the exact intersection predicate is called. - */ -template < class CurvedKernelViaAnalysis_2 > -class Filtered_curved_kernel_via_analysis_2 : - public CurvedKernelViaAnalysis_2:: - template rebind< - Filtered_curved_kernel_via_analysis_2< CurvedKernelViaAnalysis_2 > - >::Other -{ -public: - //! \name public typedefs - //!@{ +template +struct Filtered_functor_base : + public BaseCKvA::template rebind< FCKvA >::Functor_base { - //! this instance's first template argument - typedef CurvedKernelViaAnalysis_2 Curved_kernel_via_analysis_2; - - //! myself - typedef - Filtered_curved_kernel_via_analysis_2< Curved_kernel_via_analysis_2 > Self; + typedef FCKvA Self; - //! type of curve kernel - typedef typename - Curved_kernel_via_analysis_2::Curve_kernel_2 Curve_kernel_2; + typedef BaseCKvA Base_ckva; - //! type of curve analysis - typedef typename Curve_kernel_2::Curve_analysis_2 Curve_analysis_2; - -public: - //!\name embedded types for \c Arrangement_2 package - //!@{ + typedef typename BaseCKvA::template rebind< Self >::Functor_base + Functor_base; - //! type of curve_2 - typedef Curve_analysis_2 Curve_2; - - //! type of a point on generic curve - typedef CGALi::Point_2< Self > Point_2; - - //! type of an arc on generic curve - typedef CGALi::Arc_2< Self > Arc_2; - - //! type of weakly x-monotone arc for \c ArrangementTraits_2 - typedef Arc_2 X_monotone_curve_2; - - //!@} - -public: - //!\name base type - //!@{ - - //! the base type - typedef typename Curved_kernel_via_analysis_2:: - template rebind< Self >::Other Base; - - //!@} - -public: - //! \name Constructors - //!@{ - - //! default constructor - Filtered_curved_kernel_via_analysis_2() : - Base() { - } - - //! construct using specific \c Curve_kernel_2 instance (for controlling) - Filtered_curved_kernel_via_analysis_2(const Curve_kernel_2& kernel) : - Base(kernel) { - } - - //!@} - - //!\name Additional functors - //!@{ - -// declares curved kernel functors, for each functor defines a member function -// returning an instance of this functor -#define CGAL_CKvA_2_functor_pred(Y, Z) \ - typedef CGALi::Curved_kernel_via_analysis_2_Functors::Y Y; \ - Y Z() const { return Y(&Self::instance()); } - -#define CGAL_CKvA_2_functor_cons(Y, Z) CGAL_CKvA_2_functor_pred(Y, Z) - -public: - - CGAL_CKvA_2_functor_cons(Construct_point_2, - construct_point_2_object); - - CGAL_CKvA_2_functor_cons(Construct_point_on_arc_2, - construct_point_on_arc_2_object); - - CGAL_CKvA_2_functor_cons(Construct_arc_2, - construct_arc_2_object); - - CGAL_CKvA_2_functor_cons(X_extreme_points_2, - x_extreme_points_2_object); - - CGAL_CKvA_2_functor_cons(Y_extreme_points_2, - y_extreme_points_2_object); - -#undef CGAL_CKvA_2_functor_pred -#undef CGAL_CKvA_2_functor_cons - // declares curved kernel functors, for each functor defines a member function // returning an instance of this functor #define CGAL_FILTERED_CKvA_2_functor_pred(Y, Z) \ - typedef CGALi::Filtered_curved_kernel_via_analysis_2_Functors::Y Y; \ + typedef CGALi::Filtered_curved_kernel_via_analysis_2_Functors:: \ + Y< Self, Functor_base > Y; \ Y Z() const { return Y(&Self::instance()); } #define CGAL_FILTERED_CKvA_2_functor_cons(Y, Z) \ @@ -990,10 +827,83 @@ public: #undef CGAL_FILTERED_CKvA_2_functor_pred #undef CGAL_FILTERED_CKvA_2_functor_cons - //!@} +}; + +} // namespace CGALi + +/*!\brief + * Filtered curved kernel, i.e., intersection predicate is filted by first + * computing a covering approximation. Only if these overlap for two arcs + * the exact intersection predicate is called. + */ +template < class BaseCKvA_2 > +class Filtered_curved_kernel_via_analysis_2 : + public CGALi::Curved_kernel_via_analysis_2_base< + Filtered_curved_kernel_via_analysis_2< BaseCKvA_2 >, + BaseCKvA_2, typename BaseCKvA_2::Curve_kernel_2, + CGALi::Filtered_functor_base > +{ +public: + //! \name public typedefs + //!@{ + + //! this instance's first template argument + typedef BaseCKvA_2 Curved_kernel_via_analysis_2; -}; // class Curved_kernel_via_analysis_2 + //! myself + typedef Filtered_curved_kernel_via_analysis_2< + Curved_kernel_via_analysis_2 > Self; + + //! type of curve kernel + typedef typename + Curved_kernel_via_analysis_2::Curve_kernel_2 Curve_kernel_2; + + //! type of curve analysis + typedef typename Curve_kernel_2::Curve_analysis_2 Curve_analysis_2; + +public: + //!\name embedded types for \c Arrangement_2 package + //!@{ + + //! type of curve_2 + typedef Curve_analysis_2 Curve_2; + + //! type of a point on generic curve + typedef CGALi::Point_2< Self > Point_2; + + //! type of an arc on generic curve + typedef CGALi::Arc_2< Self > Arc_2; + + //! type of weakly x-monotone arc for \c ArrangementTraits_2 + typedef Arc_2 X_monotone_curve_2; + + //!@} + +protected: + + //! base kernel type + typedef CGALi::Curved_kernel_via_analysis_2_base< + Self, Curved_kernel_via_analysis_2, Curve_kernel_2, + CGALi::Filtered_functor_base > Base_kernel; + +public: + //! \name Constructors + //!@{ + + //! default constructor + Filtered_curved_kernel_via_analysis_2() : + Base_kernel() { + } + + //! construct using specific \c Curve_kernel_2 instance (for controlling) + Filtered_curved_kernel_via_analysis_2(const Curve_kernel_2& kernel) : + Base_kernel(kernel) { + } + + //!@} + +}; // class Filtered_curved_kernel_via_analysis_2 CGAL_END_NAMESPACE -#endif // CGAL_CURVED_KERNEL_VIA_ANALYSIS_2_H +#endif // CGAL_FILTERED_CURVED_KERNEL_VIA_ANALYSIS_2_H diff --git a/Curved_kernel_via_analysis_2/include/CGAL/Quadrical_kernel_via_analysis_2.h b/Curved_kernel_via_analysis_2/include/CGAL/Quadrical_kernel_via_analysis_2.h index a59d6bca32e..10a899cd7ff 100644 --- a/Curved_kernel_via_analysis_2/include/CGAL/Quadrical_kernel_via_analysis_2.h +++ b/Curved_kernel_via_analysis_2/include/CGAL/Quadrical_kernel_via_analysis_2.h @@ -555,14 +555,16 @@ public: template < class CurvedKernelViaAnalysis_2l > class Compare_xy_2 : - public CurvedKernelViaAnalysis_2l::Base::Compare_xy_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Compare_xy_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2l Curved_kernel_via_analysis_2l; //! the base type - typedef typename Curved_kernel_via_analysis_2l::Base::Compare_xy_2 Base; + typedef typename CurvedKernelViaAnalysis_2l:: + Functor_base::Compare_xy_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -609,14 +611,16 @@ public: template < class CurvedKernelViaAnalysis_2l > class Compare_x_near_boundary_2 : - public CurvedKernelViaAnalysis_2l::Base::Compare_x_near_boundary_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Compare_x_near_boundary_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2l Curved_kernel_via_analysis_2l; //! the base type typedef typename - Curved_kernel_via_analysis_2l::Base::Compare_x_near_boundary_2 + CurvedKernelViaAnalysis_2l:: + Functor_base::Compare_x_near_boundary_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -725,14 +729,16 @@ public: template < class CurvedKernelViaAnalysis_2l > class Compare_y_near_boundary_2 : - public CurvedKernelViaAnalysis_2l::Base::Compare_y_near_boundary_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Compare_y_near_boundary_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2l Curved_kernel_via_analysis_2l; //! the base type typedef typename - Curved_kernel_via_analysis_2l::Base::Compare_y_near_boundary_2 + CurvedKernelViaAnalysis_2l:: + Functor_base::Compare_y_near_boundary_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -778,9 +784,9 @@ public: int sheet2 = cv2.sheet(); Base base_compare_y_near_boundary(this->_ckva()); - typename Curved_kernel_via_analysis_2l::Base::Compare_y_at_x_right_2 + typename Curved_kernel_via_analysis_2l::Functor_base::Compare_y_at_x_right_2 base_compare_y_at_x_right(this->_ckva()); - typename Curved_kernel_via_analysis_2l::Base::Compare_y_at_x_left_2 + typename Curved_kernel_via_analysis_2l::Functor_base::Compare_y_at_x_left_2 base_compare_y_at_x_left(this->_ckva()); if (sheet1 != sheet2) { @@ -817,7 +823,8 @@ public: template < class CurvedKernelViaAnalysis_2l > class Compare_y_at_x_2 : - public CurvedKernelViaAnalysis_2l::Base::Compare_y_at_x_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Compare_y_at_x_2 { public: //! this instance' first template parameter @@ -825,7 +832,8 @@ public: //! the base type typedef typename - Curved_kernel_via_analysis_2l::Base::Compare_y_at_x_2 Base; + CurvedKernelViaAnalysis_2l:: + Functor_base::Compare_y_at_x_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -882,14 +890,16 @@ public: template < class CurvedKernelViaAnalysis_2l > class Compare_y_at_x_left_2 : - public CurvedKernelViaAnalysis_2l::Base::Compare_y_at_x_left_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Compare_y_at_x_left_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2l Curved_kernel_via_analysis_2l; //! the base type - typedef typename Curved_kernel_via_analysis_2l::Base::Compare_y_at_x_left_2 + typedef typename CurvedKernelViaAnalysis_2l:: + Functor_base::Compare_y_at_x_left_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -962,7 +972,8 @@ public: template < class CurvedKernelViaAnalysis_2l > class Compare_y_at_x_right_2 : - public CurvedKernelViaAnalysis_2l::Base::Compare_y_at_x_right_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Compare_y_at_x_right_2 { public: //! this instance' first template parameter @@ -970,7 +981,8 @@ public: //! the base type typedef typename - Curved_kernel_via_analysis_2l::Base::Compare_y_at_x_right_2 + CurvedKernelViaAnalysis_2l:: + Functor_base::Compare_y_at_x_right_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -1042,7 +1054,8 @@ public: //!\brief returns Parameter_space_in_y_2 template < class CurvedKernelViaAnalysis_2l > class Parameter_space_in_y_2 : - public CurvedKernelViaAnalysis_2l::Base::Parameter_space_in_y_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Parameter_space_in_y_2 { public: //! this instance' first template parameter @@ -1050,7 +1063,8 @@ public: //! the base type typedef typename - Curved_kernel_via_analysis_2l::Base::Parameter_space_in_y_2 Base; + CurvedKernelViaAnalysis_2l:: + Functor_base::Parameter_space_in_y_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -1097,7 +1111,8 @@ public: //!\brief Constructs min vertex of arc template < class CurvedKernelViaAnalysis_2l > class Construct_min_vertex_2 : - public CurvedKernelViaAnalysis_2l::Base::Construct_min_vertex_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Construct_min_vertex_2 { public: //! this instance' first template parameter @@ -1105,7 +1120,8 @@ public: //! the base type typedef typename - Curved_kernel_via_analysis_2l::Base::Construct_min_vertex_2 Base; + CurvedKernelViaAnalysis_2l:: + Functor_base::Construct_min_vertex_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -1143,7 +1159,8 @@ public: //!\brief Constructs max vertex of arc template < class CurvedKernelViaAnalysis_2l > class Construct_max_vertex_2 : - public CurvedKernelViaAnalysis_2l::Base::Construct_max_vertex_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Construct_max_vertex_2 { public: //! this instance' first template parameter @@ -1151,7 +1168,8 @@ public: //! the base type typedef typename - Curved_kernel_via_analysis_2l::Base::Construct_max_vertex_2 Base; + CurvedKernelViaAnalysis_2l:: + Functor_base::Construct_max_vertex_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -1189,14 +1207,16 @@ public: template < class CurvedKernelViaAnalysis_2l > class Do_overlap_2 : - public CurvedKernelViaAnalysis_2l::Base::Do_overlap_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Do_overlap_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2l Curved_kernel_via_analysis_2l; //! the base type - typedef typename Curved_kernel_via_analysis_2l::Base::Do_overlap_2 Base; + typedef typename CurvedKernelViaAnalysis_2l:: + Functor_base::Do_overlap_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -1239,14 +1259,16 @@ public: //!\brief Tests two objects, whether they are equal template < class CurvedKernelViaAnalysis_2l > class Equal_2 : - public CurvedKernelViaAnalysis_2l::Base::Equal_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Equal_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2l Curved_kernel_via_analysis_2l; //! the base type - typedef typename Curved_kernel_via_analysis_2l::Base::Equal_2 Base; + typedef typename CurvedKernelViaAnalysis_2l:: + Functor_base::Equal_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -1308,14 +1330,15 @@ public: //! checks wether and how two arcs are intersection - with first filtering template < class CurvedKernelViaAnalysis_2l > class Intersect_2 : - public CurvedKernelViaAnalysis_2l::Base::Intersect_2 { + public CurvedKernelViaAnalysis_2l::Functor_base::Intersect_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2l Curved_kernel_via_analysis_2l; //! the base type - typedef typename Curved_kernel_via_analysis_2l::Base::Intersect_2 Base; + typedef typename CurvedKernelViaAnalysis_2l:: + Functor_base::Intersect_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -1488,14 +1511,16 @@ public: template < class CurvedKernelViaAnalysis_2l > class Trim_2 : - public CurvedKernelViaAnalysis_2l::Base::Trim_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Trim_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2l Curved_kernel_via_analysis_2l; //! the base type - typedef typename Curved_kernel_via_analysis_2l::Base::Trim_2 Base; + typedef typename CurvedKernelViaAnalysis_2l:: + Functor_base::Trim_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -1543,14 +1568,16 @@ public: template < class CurvedKernelViaAnalysis_2l > class Split_2 : - public CurvedKernelViaAnalysis_2l::Base::Split_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Split_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2l Curved_kernel_via_analysis_2l; //! the base type - typedef typename Curved_kernel_via_analysis_2l::Base::Split_2 Base; + typedef typename CurvedKernelViaAnalysis_2l:: + Functor_base::Split_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -1615,14 +1642,16 @@ public: template < class CurvedKernelViaAnalysis_2l > class Are_mergeable_2 : - public CurvedKernelViaAnalysis_2l::Base::Are_mergeable_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Are_mergeable_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2l Curved_kernel_via_analysis_2l; //! the base type - typedef typename Curved_kernel_via_analysis_2l::Base::Are_mergeable_2 + typedef typename CurvedKernelViaAnalysis_2l:: + Functor_base::Are_mergeable_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -1661,11 +1690,9 @@ public: res = false; } - if (res) { - Base base_are_mergeable(this->_ckva()); - res = base_are_mergeable(cv1, cv2); - } - + if (res) + res = Base::operator()(cv1, cv2); + CERR("result: " << res << "\n"); return res; } @@ -1674,14 +1701,16 @@ public: template < class CurvedKernelViaAnalysis_2l > class Merge_2 : - public CurvedKernelViaAnalysis_2l::Base::Merge_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Merge_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2l Curved_kernel_via_analysis_2l; //! the base type - typedef typename Curved_kernel_via_analysis_2l::Base::Merge_2 Base; + typedef typename CurvedKernelViaAnalysis_2l:: + Functor_base::Merge_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; @@ -1742,23 +1771,24 @@ public: template < class CurvedKernelViaAnalysis_2l > class Make_x_monotone_2 : - public CurvedKernelViaAnalysis_2l::Base::Make_x_monotone_2 { + public CurvedKernelViaAnalysis_2l:: + Functor_base::Make_x_monotone_2 { public: //! this instance' first template parameter typedef CurvedKernelViaAnalysis_2l Curved_kernel_via_analysis_2l; //! the base type - typedef typename Curved_kernel_via_analysis_2l::Base::Make_x_monotone_2 + typedef typename CurvedKernelViaAnalysis_2l:: + Functor_base::Make_x_monotone_2 Base; CGAL_CKvA_2l_GRAB_BASE_FUNCTOR_TYPES; - typedef typename - Curved_kernel_via_analysis_2l::Curved_kernel_via_analysis_2 - Curved_kernel_via_analysis_2; + typedef typename + Curved_kernel_via_analysis_2l::Curved_kernel_via_analysis_2 + Curved_kernel_via_analysis_2; - typedef QdX::Quadric_3_z_at_xy_isolator_traits< Curved_kernel_via_analysis_2, Curve_2 // Remark: Curve_2 == Surface_3 > Z_at_xy_traits; @@ -1840,114 +1870,16 @@ public: } // Quadrical_kernel_via_analysis_2_functors -} // namespace CGALi -//! basic kernel to maintain points and arcs on a quadric -template < class CurvedKernelViaAnalysis_2, class SurfacePair_3 > -class Quadrical_kernel_via_analysis_2 : - public CurvedKernelViaAnalysis_2:: - template rebind< - Quadrical_kernel_via_analysis_2< - CurvedKernelViaAnalysis_2, SurfacePair_3 - > - >::Other -{ -public: - //! \name public typedefs - //!@{ - - //! this instance's first template argument - typedef CurvedKernelViaAnalysis_2 Curved_kernel_via_analysis_2; - - //! this instance's second template parameter - typedef SurfacePair_3 Surface_pair_3; - - //! myself - typedef Quadrical_kernel_via_analysis_2< - Curved_kernel_via_analysis_2, Surface_pair_3 - > - Self; +template +struct Quadrical_functor_base : + public BaseCKvA::template rebind< QKvA >::Functor_base { - //! type of curve kernel - typedef typename - Curved_kernel_via_analysis_2::Curve_kernel_2 Curve_kernel_2; + typedef QKvA Self; - //! type of curve analysis - typedef typename Curve_kernel_2::Curve_analysis_2 Curve_analysis_2; + typedef typename BaseCKvA::template rebind< Self >::Functor_base + Functor_base; - //!@} - - //!\name embedded types for \c Arrangement_2 package - //!@{ - - //! type of surface - typedef typename Surface_pair_3::Surface_3 Surface_3; - - //! type of curve_2 - typedef Surface_3 Curve_2; - - //! type of a point on generic curve - typedef CGALi::Quadric_point_2< Self, Surface_pair_3 > Point_2; - - //! type of an arc on generic curve - typedef CGALi::Quadric_arc_2< Self, Surface_pair_3 > Arc_2; - - //! type of weakly x-monotone arc for \c ArrangementTraits_2 - typedef Arc_2 X_monotone_curve_2; - - //! tag specifies which boundary functors are implemented - typedef CGAL::Arr_all_boundary_tag Boundary_category; - - //!@} - -public: - //!\name base type - //!@{ - - //! the base type - typedef typename Curved_kernel_via_analysis_2:: - template rebind< Self >::Other Base; - - //!@} - -public: - //! \name Constructors - //!@{ - - //! default constructor - Quadrical_kernel_via_analysis_2() : - Base() { - } - - //! standard constructor - Quadrical_kernel_via_analysis_2(const Surface_3& reference) : - Base(), - _m_reference(reference) { - } - - //! construct using specific \c Curve_kernel_2 instance (for controlling) - Quadrical_kernel_via_analysis_2(const Curve_kernel_2& kernel, - const Surface_3& reference) : - Base(kernel), - _m_reference(reference) { - } - - //!@} - - //!\name Access members - //!@{ - - //! returns the reference surface - inline - const Surface_3& reference() { - return _m_reference; - } - //!@} - -public: - //!\name embedded constructions and predicates - //!@{ - //! type of Construct_point_2 functor typedef CGALi::Curved_kernel_via_analysis_2l_Functors::Construct_point_2l @@ -1958,15 +1890,12 @@ public: } //! type of Construct_projected_point_2 functor - typedef - typename Curved_kernel_via_analysis_2::Construct_point_2 - Construct_projected_point_2; + typedef typename BaseCKvA::Construct_point_2 Construct_projected_point_2; //! returns an instance of Construct_projected_point_2 functor Construct_projected_point_2 construct_projected_point_2_object() const { - return - Curved_kernel_via_analysis_2(this->kernel()). - construct_point_2_object(); + + return BaseCKvA::instance().construct_point_2_object(); } //! type of Construct_arc_2 functor @@ -1979,14 +1908,12 @@ public: } //! type of Construct_projected_arc_2 functor - typedef - typename Curved_kernel_via_analysis_2::Construct_arc_2 - Construct_projected_arc_2; + typedef typename BaseCKvA::Construct_arc_2 Construct_projected_arc_2; //! returns an instance of Construct_projected_arc_2 functor Construct_projected_arc_2 construct_projected_arc_2_object() const { - return - Curved_kernel_via_analysis_2(this->kernel()). - construct_arc_2_object(); + +//!@todo: alternative: BaseCKvA(Self::instance().kernel()).instance(). ? + return BaseCKvA::instance().construct_arc_2_object(); } // declares curved kernel functors, for each functor defines a member function @@ -2062,6 +1989,108 @@ public: #undef CGAL_QKvA_2_functor_pred #undef CGAL_QKvA_2_functor_cons +}; + +} // namespace CGALi + +//! basic kernel to maintain points and arcs on a quadric +template < class BaseCKvA_2, class SurfacePair_3 > +class Quadrical_kernel_via_analysis_2 : + public CGALi::Curved_kernel_via_analysis_2_base< + Quadrical_kernel_via_analysis_2< BaseCKvA_2, SurfacePair_3 >, + BaseCKvA_2, typename BaseCKvA_2::Curve_kernel_2, + CGALi::Quadrical_functor_base > +{ +public: + //! \name public typedefs + //!@{ + + //! this instance's first template argument + typedef BaseCKvA_2 Curved_kernel_via_analysis_2; + + //! this instance's second template parameter + typedef SurfacePair_3 Surface_pair_3; + + //! myself + typedef Quadrical_kernel_via_analysis_2< + Curved_kernel_via_analysis_2, Surface_pair_3 + > + Self; + + //! type of curve kernel + typedef typename Curved_kernel_via_analysis_2::Curve_kernel_2 + Curve_kernel_2; + + //! type of curve analysis + typedef typename Curve_kernel_2::Curve_analysis_2 Curve_analysis_2; + + //!@} + + //!\name embedded types for \c Arrangement_2 package + //!@{ + + //! type of surface + typedef typename Surface_pair_3::Surface_3 Surface_3; + + //! type of curve_2 + typedef Surface_3 Curve_2; + + //! type of a point on generic curve + typedef CGALi::Quadric_point_2< Self, Surface_pair_3 > Point_2; + + //! type of an arc on generic curve + typedef CGALi::Quadric_arc_2< Self, Surface_pair_3 > Arc_2; + + //! type of weakly x-monotone arc for \c ArrangementTraits_2 + typedef Arc_2 X_monotone_curve_2; + + //! tag specifies which boundary functors are implemented + typedef CGAL::Arr_all_boundary_tag Boundary_category; + + //!@} + +protected: + + //! base kernel type + typedef CGALi::Curved_kernel_via_analysis_2_base< + Self, Curved_kernel_via_analysis_2, Curve_kernel_2, + CGALi::Quadrical_functor_base > + Base_kernel; + +public: + //! \name Constructors + //!@{ + + //! default constructor + Quadrical_kernel_via_analysis_2() : + Base_kernel() { + } + + //! standard constructor + Quadrical_kernel_via_analysis_2(const Surface_3& reference) : + Base_kernel(), + _m_reference(reference) { + } + + //! construct using specific \c Curve_kernel_2 instance (for controlling) + Quadrical_kernel_via_analysis_2(const Curve_kernel_2& kernel, + const Surface_3& reference) : + Base_kernel(kernel), + _m_reference(reference) { + } + + //!@} + + //!\name Access members + //!@{ + + //! returns the reference surface + inline + const Surface_3& reference() { + return _m_reference; + } + //!@} + protected: //!\name Data members