mirror of https://github.com/CGAL/cgal
Add possibility to filter on kernels instead of number-types.
This commit is contained in:
parent
6eeb2259a4
commit
b63f32ccdd
|
|
@ -12,35 +12,57 @@
|
||||||
|
|
||||||
namespace CGAL {
|
namespace CGAL {
|
||||||
template<class K1, class K2> class CartesianD_converter {
|
template<class K1, class K2> class CartesianD_converter {
|
||||||
|
typedef CartesianD_converter<K1,K2> Self;
|
||||||
typedef typename K1::FT FT1;
|
typedef typename K1::FT FT1;
|
||||||
typedef typename K2::FT FT2;
|
typedef typename K2::FT FT2;
|
||||||
typedef NT_converter<FT1, FT2> NTc;
|
typedef NT_converter<FT1, FT2> NTc;
|
||||||
NTc c;
|
NTc c;
|
||||||
// TODO: store a K1 and a K2 and have a suitable constructor
|
// TODO: store a K1 and a K2 and have a suitable constructor
|
||||||
public:
|
public:
|
||||||
|
// For boost::result_of, used in transforming_iterator
|
||||||
|
template<class T,int i=0> struct result;
|
||||||
|
template<class T,int i> struct result<Self(T),i>{
|
||||||
|
//assert that T is an iterator, or better yet make sure
|
||||||
|
//we don't get here otherwise
|
||||||
|
#ifdef CGAL_CXX0X
|
||||||
|
static_assert(is_iterator<T>::value,"OUIN!");
|
||||||
|
#endif
|
||||||
|
typedef transforming_iterator<Self,T> type;
|
||||||
|
};
|
||||||
|
template<int i> struct result<Self(int),i>{typedef int type;};
|
||||||
|
template<int i> struct result<Self(Origin),i>{typedef Origin type;};
|
||||||
|
template<int i> struct result<Self(Null_vector),i>{typedef Null_vector type;};
|
||||||
|
template<int i> struct result<Self(Object),i>{typedef Object type;};
|
||||||
|
template<int i> struct result<Self(FT1),i>{typedef FT2 type;};
|
||||||
|
template<int i> struct result<Self(typename K1::Point),i>{typedef typename K2::Point type;};
|
||||||
|
template<int i> struct result<Self(typename First_if_different<typename K1::Vector,typename K1::Point>::Type),i>{typedef typename K2::Vector type;};
|
||||||
|
|
||||||
|
int operator()(int i)const{return i;}
|
||||||
Origin operator()(Origin const&o)const{return o;}
|
Origin operator()(Origin const&o)const{return o;}
|
||||||
Null_vector operator()(Null_vector const&v)const{return v;}
|
Null_vector operator()(Null_vector const&v)const{return v;}
|
||||||
FT2 operator()(FT1 const&x)const{return c(x);}
|
FT2 operator()(FT1 const&x)const{return c(x);}
|
||||||
//RT2 operator()(typename First_if_different<RT1,FT1>::Type const&x)const{return cr(x);}
|
//RT2 operator()(typename First_if_different<RT1,FT1>::Type const&x)const{return cr(x);}
|
||||||
|
|
||||||
template<class It>
|
template<class It>
|
||||||
transforming_iterator<NTc,typename boost::enable_if<is_iterator<It>,It>::type>
|
transforming_iterator<Self,typename boost::enable_if<is_iterator<It>,It>::type>
|
||||||
operator()(It const& it)const {
|
operator()(It const& it)const {
|
||||||
return make_transforming_iterator(it,c);
|
return make_transforming_iterator(it,*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
typename K2::Point operator()(typename K1::Point const& p){
|
typename K2::Point operator()(typename K1::Point const& p)const{
|
||||||
typename K1::template Construct<Construct_cartesian_const_iterator_tag>::type i;
|
typename K1::template Construct<Construct_cartesian_const_iterator_tag>::type i;
|
||||||
return K2::template Construct<Construct_point_tag>::type()(operator()(i.begin(p)),operator()(i.end(p)));
|
typename K2::template Construct<Construct_point_tag>::type cp;
|
||||||
|
return cp(operator()(i.begin(p)),operator()(i.end(p)));
|
||||||
}
|
}
|
||||||
|
|
||||||
typename K2::Vector operator()(typename First_if_different<typename K1::Vector,typename K1::Point>::Type const& p){
|
typename K2::Vector operator()(typename First_if_different<typename K1::Vector,typename K1::Point>::Type const& p)const{
|
||||||
typename K1::template Construct<Construct_cartesian_const_iterator_tag>::type i;
|
typename K1::template Construct<Construct_cartesian_const_iterator_tag>::type i;
|
||||||
return K2::template Construct<Construct_vector_tag>::type()(operator()(i.begin(p)),operator()(i.end(p)));
|
typename K2::template Construct<Construct_vector_tag>::type cv;
|
||||||
|
return cv(operator()(i.begin(p)),operator()(i.end(p)));
|
||||||
}
|
}
|
||||||
|
|
||||||
typename K2::Object_2
|
Object
|
||||||
operator()(const typename K1::Object_2 &obj) const
|
operator()(const Object &obj) const
|
||||||
{
|
{
|
||||||
#define CGAL_Kernel_obj(X) \
|
#define CGAL_Kernel_obj(X) \
|
||||||
if (const typename K1::X * ptr = object_cast<typename K1::X>(&obj)) \
|
if (const typename K1::X * ptr = object_cast<typename K1::X>(&obj)) \
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,18 @@
|
||||||
#include <CGAL/myeigen.h>
|
#include <CGAL/myeigen.h>
|
||||||
#include <CGAL/Kernel_d/Cartesian_base.h>
|
#include <CGAL/Kernel_d/Cartesian_base.h>
|
||||||
#include <CGAL/Kernel_d/Cartesian_filter_NT.h>
|
#include <CGAL/Kernel_d/Cartesian_filter_NT.h>
|
||||||
|
#include <CGAL/Kernel_d/Cartesian_filter_K.h>
|
||||||
#include <CGAL/Gmpq.h>
|
#include <CGAL/Gmpq.h>
|
||||||
#include <CGAL/Interval_nt.h>
|
#include <CGAL/Interval_nt.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
typedef CGAL::Cartesian_base_d<double,CGAL::Dimension_tag<2> > K0;
|
typedef CGAL::Cartesian_base_d<double,CGAL::Dimension_tag<2> > K0;
|
||||||
|
#if 0
|
||||||
typedef CGAL::Cartesian_filter_NT<K0> K1;
|
typedef CGAL::Cartesian_filter_NT<K0> K1;
|
||||||
//typedef CGAL::Cartesian_change_FT<K0,double> K1;
|
#elif 1
|
||||||
|
typedef CGAL::Cartesian_base_d<CGAL::Interval_nt_advanced,CGAL::Dimension_tag<2> > KA;
|
||||||
|
typedef CGAL::Cartesian_base_d<CGAL::Gmpq,CGAL::Dimension_tag<2> > KE;
|
||||||
|
typedef CGAL::Cartesian_filter_K<K0,KA,KE> K1;
|
||||||
|
#endif
|
||||||
typedef K1::Point P;
|
typedef K1::Point P;
|
||||||
typedef K1::Vector V;
|
typedef K1::Vector V;
|
||||||
typedef K1::Segment S;
|
typedef K1::Segment S;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue