diff options
author | vrouvrea <vrouvrea@636b058d-ea47-450e-bf9e-a15bfbe3eedb> | 2016-12-15 22:21:54 +0000 |
---|---|---|
committer | vrouvrea <vrouvrea@636b058d-ea47-450e-bf9e-a15bfbe3eedb> | 2016-12-15 22:21:54 +0000 |
commit | 75585b58076af057d1e458ea5668a97455d93688 (patch) | |
tree | dc8a802e6195054dc07a457fe8743f2326070755 /src/common/include/gudhi_patches/CGAL/NewKernel_d/Kernel_object_converter.h | |
parent | b93ea27ea392f49f85deee23526c9330a716093b (diff) | |
parent | 0df3c9bcca4345b8be27ca2fd90eb5137072740c (diff) |
Merge last trunk modifications
git-svn-id: svn+ssh://scm.gforge.inria.fr/svnroot/gudhi/branches/bottleneck_integration@1888 636b058d-ea47-450e-bf9e-a15bfbe3eedb
Former-commit-id: 951a081ac634f829fa49265005ea1e620f2c08ca
Diffstat (limited to 'src/common/include/gudhi_patches/CGAL/NewKernel_d/Kernel_object_converter.h')
-rw-r--r-- | src/common/include/gudhi_patches/CGAL/NewKernel_d/Kernel_object_converter.h | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/src/common/include/gudhi_patches/CGAL/NewKernel_d/Kernel_object_converter.h b/src/common/include/gudhi_patches/CGAL/NewKernel_d/Kernel_object_converter.h new file mode 100644 index 00000000..99918ed2 --- /dev/null +++ b/src/common/include/gudhi_patches/CGAL/NewKernel_d/Kernel_object_converter.h @@ -0,0 +1,134 @@ +// 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_KO_CONVERTER_H +#define CGAL_KD_KO_CONVERTER_H +#include <CGAL/NewKernel_d/utils.h> +#include <CGAL/NewKernel_d/functor_tags.h> +#include <CGAL/Kernel/mpl.h> // First_if_different +#include <CGAL/Dimension.h> +namespace CGAL { +template <class Tag_, class K1, class K2> struct KO_converter; +//TODO: It would probably be better if this was a Misc Functor in K1. +// This way K1 could chose how it wants to present its points (sparse +// iterator?) and derived classes would inherit it. + +namespace internal { +template <class D /*=Dynamic_dimension_tag*/, class K1, class K2> +struct Point_converter_help { + typedef typename Get_type<K1, Point_tag>::type argument_type; + typedef typename Get_type<K2, Point_tag>::type result_type; + template <class C> + result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& p) const { + typename Get_functor<K1, Construct_ttag<Point_cartesian_const_iterator_tag> >::type i(k1); + typename Get_functor<K2, Construct_ttag<Point_tag> >::type cp(k2); + return cp(conv(i(p,Begin_tag())),conv(i(p,End_tag()))); + } +}; +#ifdef CGAL_CXX11 +// This doesn't seem so useful, the compiler should be able to handle +// the iterators just as efficiently. +template <int d, class K1, class K2> +struct Point_converter_help<Dimension_tag<d>,K1,K2> { + typedef typename Get_type<K1, Point_tag>::type argument_type; + typedef typename Get_type<K2, Point_tag>::type result_type; + template <class C,int...I> + result_type help(Indices<I...>, K1 const& k1, K2 const& k2, C const& conv, argument_type const& p) const { + typename Get_functor<K1, Compute_point_cartesian_coordinate_tag>::type cc(k1); + typename Get_functor<K2, Construct_ttag<Point_tag> >::type cp(k2); + return cp(conv(cc(p,I))...); + } + template <class C> + result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& p) const { + return help(typename N_increasing_indices<d>::type(),k1,k2,conv,p); + } +}; +#endif +} +template <class K1, class K2> struct KO_converter<Point_tag,K1,K2> +: internal::Point_converter_help<typename K1::Default_ambient_dimension,K1,K2> +{}; + +template <class K1, class K2> struct KO_converter<Vector_tag,K1,K2>{ + typedef typename Get_type<K1, Vector_tag>::type K1_Vector; + + // Disabling is now done in KernelD_converter + // // can't use vector without at least a placeholder point because of this + // typedef typename K1:: Point K1_Point; + // typedef typename First_if_different<K1_Vector,K1_Point>::Type argument_type; + + typedef K1_Vector argument_type; + typedef typename Get_type<K2, Vector_tag>::type result_type; + template <class C> + result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& v) const { + typename Get_functor<K1, Construct_ttag<Vector_cartesian_const_iterator_tag> >::type i(k1); + typename Get_functor<K2, Construct_ttag<Vector_tag> >::type cp(k2); + return cp(conv(i(v,Begin_tag())),conv(i(v,End_tag()))); + } +}; + +template <class K1, class K2> struct KO_converter<Segment_tag,K1,K2>{ + typedef typename Get_type<K1, Segment_tag>::type argument_type; + typedef typename Get_type<K2, Segment_tag>::type result_type; + template <class C> + result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& s) const { + typename Get_functor<K1, Segment_extremity_tag>::type f(k1); + typename Get_functor<K2, Construct_ttag<Segment_tag> >::type cs(k2); + return cs(conv(f(s,0)),conv(f(s,1))); + } +}; + +template <class K1, class K2> struct KO_converter<Hyperplane_tag,K1,K2>{ + typedef typename Get_type<K1, Hyperplane_tag>::type argument_type; + typedef typename Get_type<K2, Hyperplane_tag>::type result_type; + template <class C> + result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& h) const { + typename Get_functor<K1, Orthogonal_vector_tag>::type ov(k1); + typename Get_functor<K1, Hyperplane_translation_tag>::type ht(k1); + typename Get_functor<K2, Construct_ttag<Hyperplane_tag> >::type ch(k2); + return ch(conv(ov(h)),conv(ht(h))); + } +}; + +template <class K1, class K2> struct KO_converter<Sphere_tag,K1,K2>{ + typedef typename Get_type<K1, Sphere_tag>::type argument_type; + typedef typename Get_type<K2, Sphere_tag>::type result_type; + template <class C> + result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& s) const { + typename Get_functor<K1, Center_of_sphere_tag>::type cos(k1); + typename Get_functor<K1, Squared_radius_tag>::type sr(k1); + typename Get_functor<K2, Construct_ttag<Sphere_tag> >::type cs(k2); + return cs(conv(cos(s)),conv(sr(s))); + } +}; + +template <class K1, class K2> struct KO_converter<Weighted_point_tag,K1,K2>{ + typedef typename Get_type<K1, Weighted_point_tag>::type argument_type; + typedef typename Get_type<K2, Weighted_point_tag>::type result_type; + template <class C> + result_type operator()(K1 const& k1, K2 const& k2, C const& conv, argument_type const& s) const { + typename Get_functor<K1, Point_drop_weight_tag>::type pdw(k1); + typename Get_functor<K1, Point_weight_tag>::type pw(k1); + typename Get_functor<K2, Construct_ttag<Weighted_point_tag> >::type cwp(k2); + return cwp(conv(pdw(s)),conv(pw(s))); + } +}; + +} +#endif |