// Copyright (c) 2014 // INRIA Saclay-Ile de France (France) // // This file is part of CGAL (www.cgal.org); you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License as // published by the Free Software Foundation; either version 3 of the License, // or (at your option) any later version. // // Licensees holding a valid commercial license may use this file in // accordance with the commercial license agreement provided with the software. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. // // $URL$ // $Id$ // // Author(s) : Marc Glisse #ifndef CGAL_KD_CARTESIAN_STATIC_FILTERS_H #define CGAL_KD_CARTESIAN_STATIC_FILTERS_H #include #include #include // bug, should be included by the next one #include #include namespace CGAL { namespace SFA { // static filter adapter // Note that this would be quite a bit simpler without stateful kernels template struct Orientation_of_points_2 : private Store_kernel { CGAL_FUNCTOR_INIT_STORE(Orientation_of_points_2) typedef typename Get_type::type Point; typedef typename Get_type::type result_type; typedef typename Get_type::type FT; typedef typename Get_functor::type CC; typedef typename Get_functor::type Orientation_base; // TODO: Move this out for easy reuse struct Adapter { struct Point_2 { R_ const&r; CC const&c; Point const& p; Point_2(R_ const&r_, CC const&c_, Point const&p_):r(r_),c(c_),p(p_){} // use result_of instead? typename CC::result_type x()const{return c(p,0);} typename CC::result_type y()const{return c(p,1);} }; struct Vector_2 {}; struct Circle_2 {}; struct Orientation_2 { typedef typename Orientation_of_points_2::result_type result_type; result_type operator()(Point_2 const&A, Point_2 const&B, Point_2 const&C)const{ Point const* t[3]={&A.p,&B.p,&C.p}; return Orientation_base(A.r)(make_transforming_iterator(t+0),make_transforming_iterator(t+3)); } }; }; template result_type operator()(Iter f, Iter CGAL_assertion_code(e))const{ CC c(this->kernel()); Point const& A=*f; Point const& B=*++f; Point const& C=*++f; CGAL_assertion(++f==e); typedef typename Adapter::Point_2 P; return typename internal::Static_filters_predicates::Orientation_2()(P(this->kernel(),c,A),P(this->kernel(),c,B),P(this->kernel(),c,C)); } }; } template struct Cartesian_static_filters : public R_ { CGAL_CONSTEXPR Cartesian_static_filters(){} CGAL_CONSTEXPR Cartesian_static_filters(int d):R_(d){} }; template struct Cartesian_static_filters, R_, Derived_> : public R_ { CGAL_CONSTEXPR Cartesian_static_filters(){} CGAL_CONSTEXPR Cartesian_static_filters(int d):R_(d){} typedef Cartesian_static_filters, R_, Derived_> Self; typedef typename Default::Get::type Derived; template struct Functor : Inherit_functor {}; template struct Functor { typedef //typename boost::mpl::if_ < //boost::is_same, //typename Get_functor::type, SFA::Orientation_of_points_2 // >::type type; }; }; } #endif