adding a specialization for Sqrt_extension for NT_converter

and its test
This commit is contained in:
Sébastien Loriot 2012-10-15 07:39:24 +00:00
parent 1ebfa4025e
commit e0a34e1dc8
2 changed files with 59 additions and 2 deletions

View File

@ -40,6 +40,7 @@
#include <CGAL/Sqrt_extension_fwd.h> #include <CGAL/Sqrt_extension_fwd.h>
#include <boost/optional.hpp> #include <boost/optional.hpp>
#include <boost/type_traits/is_same.hpp> #include <boost/type_traits/is_same.hpp>
#include <CGAL/NT_converter.h>
#define CGAL_int(T) typename First_if_different<int, T>::Type #define CGAL_int(T) typename First_if_different<int, T>::Type
@ -672,6 +673,48 @@ Sqrt_extension<NT,ROOT,ACDE_TAG,FP_TAG> square (const Sqrt_extension<NT,ROOT,ACD
x.gamma())); x.gamma()));
} }
//NT_converter specializations
template <class NT1,class ROOT1,class NT2,class ROOT2,class ACDE_TAG,class FP_TAG>
struct NT_converter < Sqrt_extension<NT1,ROOT1,ACDE_TAG,FP_TAG> , Sqrt_extension<NT2,ROOT2,ACDE_TAG,FP_TAG> >
: public std::unary_function< NT1, NT2 >
{
Sqrt_extension<NT2,ROOT2,ACDE_TAG,FP_TAG>
operator()(const Sqrt_extension<NT1,ROOT1,ACDE_TAG,FP_TAG> &a) const
{
if(!a.is_extended()) {
return Sqrt_extension<NT2,ROOT2,ACDE_TAG,FP_TAG>(NT_converter<NT1,NT2>()(a.a0()));
} else {
return Sqrt_extension<NT2,ROOT2,ACDE_TAG,FP_TAG>
(NT_converter<NT1,NT2>()(a.a0()),
NT_converter<NT1,NT2>()(a.a1()),
NT_converter<ROOT1,ROOT2>()(a.root()));
}
}
};
template <class NT1,class NT2,class ROOT2,class ACDE_TAG,class FP_TAG>
struct NT_converter < NT1 , Sqrt_extension<NT2,ROOT2,ACDE_TAG,FP_TAG> >
: public std::unary_function< NT1, NT2 >
{
Sqrt_extension<NT2,ROOT2,ACDE_TAG,FP_TAG>
operator()(const NT1 &a) const
{
return Sqrt_extension<NT2,ROOT2,ACDE_TAG,FP_TAG>(NT_converter<NT1,NT2>()(a));
}
};
//needed because it's a better match than the specialization <NT1,NT1>
template <class NT1,class ROOT1,class ACDE_TAG,class FP_TAG>
struct NT_converter < Sqrt_extension<NT1,ROOT1,ACDE_TAG,FP_TAG>, Sqrt_extension<NT1,ROOT1,ACDE_TAG,FP_TAG> >
: public std::unary_function< NT1, NT1 >
{
const Sqrt_extension<NT1,ROOT1,ACDE_TAG,FP_TAG>&
operator()(const Sqrt_extension<NT1,ROOT1,ACDE_TAG,FP_TAG> &a) const
{
return a;
}
};
// UNARY // UNARY
template <class NT,class ROOT,class ACDE_TAG,class FP_TAG> Sqrt_extension<NT,ROOT,ACDE_TAG,FP_TAG> template <class NT,class ROOT,class ACDE_TAG,class FP_TAG> Sqrt_extension<NT,ROOT,ACDE_TAG,FP_TAG>
operator + (const Sqrt_extension<NT,ROOT,ACDE_TAG,FP_TAG>& p) { return p; } operator + (const Sqrt_extension<NT,ROOT,ACDE_TAG,FP_TAG>& p) { return p; }

View File

@ -729,6 +729,19 @@ void sqrt_extension_test(){
test_get_arithmetic_kernel<AT,ACDE_TAG>(); test_get_arithmetic_kernel<AT,ACDE_TAG>();
} }
#include <CGAL/internal/Exact_type_selector.h>
void test_nt_converter()
{
typedef CGAL::internal::Exact_type_selector<int>::Type NT;
typedef CGAL::Sqrt_extension<double,double> Source;
typedef CGAL::Sqrt_extension<NT,NT> Target;
CGAL::NT_converter<Source,Target> converter;
Source s;
Target t=converter(s);
}
int main(){ int main(){
#ifdef CGAL_HAS_LEDA_ARITHMETIC_KERNEL #ifdef CGAL_HAS_LEDA_ARITHMETIC_KERNEL
sqrt_extension_test<CGAL::LEDA_arithmetic_kernel,CGAL::Tag_false>(); sqrt_extension_test<CGAL::LEDA_arithmetic_kernel,CGAL::Tag_false>();
@ -739,6 +752,7 @@ int main(){
sqrt_extension_test<CGAL::CORE_arithmetic_kernel,CGAL::Tag_false>(); sqrt_extension_test<CGAL::CORE_arithmetic_kernel,CGAL::Tag_false>();
sqrt_extension_test<CGAL::CORE_arithmetic_kernel,CGAL::Tag_true>(); sqrt_extension_test<CGAL::CORE_arithmetic_kernel,CGAL::Tag_true>();
#endif // CGAL_HAS_CORE_ARITHMETIC_KERNEL #endif // CGAL_HAS_CORE_ARITHMETIC_KERNEL
test_nt_converter();
return 0; return 0;
} }