mirror of https://github.com/CGAL/cgal
try to make it easier to read and to keep consistency
This commit is contained in:
parent
6b71a94254
commit
d291901614
|
|
@ -50,28 +50,57 @@ class Expr;
|
||||||
namespace CGAL { namespace internal {
|
namespace CGAL { namespace internal {
|
||||||
|
|
||||||
// Two classes which tell the preferred "exact number types" corresponding to a type.
|
// Two classes which tell the preferred "exact number types" corresponding to a type.
|
||||||
|
// Exact_ring_selector<double> and Exact_field_selector<double> are used by EPICK as exact number type
|
||||||
|
// to answer predicates at the end of the filtering chain of predicates and EPECK uses
|
||||||
|
// Exact_field_selector<double> for as its exact number type.
|
||||||
|
|
||||||
// The default template chooses mpq_class, Gmpq, leda_rational, or Quotient<MP_Float>.
|
|
||||||
// It should support the built-in types.
|
|
||||||
template < typename >
|
|
||||||
struct Exact_field_selector
|
|
||||||
|
|
||||||
#if BOOST_VERSION > 107900 && defined(CGAL_USE_BOOST_MP)
|
enum ENT_backend_choice
|
||||||
// use boost-mp by default
|
{
|
||||||
// Boost
|
GMP_BACKEND,
|
||||||
{ typedef BOOST_cpp_arithmetic_kernel::Rational Type; };
|
GMPXX_BACKEND,
|
||||||
#else // BOOST_VERSION > 107900
|
BOOST_GMP_BACKEND,
|
||||||
#ifdef CGAL_USE_GMPXX
|
BOOST_BACKEND,
|
||||||
{ typedef mpq_class Type; };
|
LEDA_BACKEND,
|
||||||
#elif defined(CGAL_USE_GMP)
|
MP_FLOAT_BACKEND
|
||||||
#if defined(CGAL_USE_BOOST_MP)
|
};
|
||||||
{ typedef BOOST_gmp_arithmetic_kernel::Rational Type; };
|
|
||||||
|
template <ENT_backend_choice>
|
||||||
|
struct Exact_NT_backend;
|
||||||
|
|
||||||
|
#ifdef CGAL_USE_GMP
|
||||||
|
template <>
|
||||||
|
struct Exact_NT_backend<GMP_BACKEND>
|
||||||
|
{
|
||||||
|
typedef Gmpq Rational;
|
||||||
|
#ifdef CGAL_HAS_MPZF
|
||||||
|
typedef Mpzf Integer;
|
||||||
#else
|
#else
|
||||||
{ typedef Gmpq Type; };
|
typedef Gmpzf Integer;
|
||||||
#endif
|
#endif
|
||||||
#elif defined(CGAL_USE_LEDA)
|
};
|
||||||
{ typedef leda_rational Type; };
|
#endif
|
||||||
#elif defined(CGAL_USE_BOOST_MP)
|
|
||||||
|
#ifdef CGAL_USE_GMPXX
|
||||||
|
template <>
|
||||||
|
struct Exact_NT_backend<GMPXX_BACKEND>
|
||||||
|
{
|
||||||
|
typedef mpq_class Rational;
|
||||||
|
typedef Exact_NT_backend<GMP_BACKEND>::Integer Integer;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CGAL_USE_BOOST_MP
|
||||||
|
template <>
|
||||||
|
struct Exact_NT_backend<BOOST_GMP_BACKEND>
|
||||||
|
{
|
||||||
|
typedef BOOST_gmp_arithmetic_kernel::Rational Rational;
|
||||||
|
typedef Exact_NT_backend<GMP_BACKEND>::Integer Integer;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct Exact_NT_backend<BOOST_BACKEND>
|
||||||
|
{
|
||||||
// See the discussion in https://github.com/CGAL/cgal/pull/3614
|
// See the discussion in https://github.com/CGAL/cgal/pull/3614
|
||||||
// This is disabled for now because cpp_rational is even slower than Quotient<MP_Float>. Quotient<cpp_int> will be a good candidate after some polishing.
|
// This is disabled for now because cpp_rational is even slower than Quotient<MP_Float>. Quotient<cpp_int> will be a good candidate after some polishing.
|
||||||
// In fact, the new version of cpp_rational from here: https://github.com/boostorg/multiprecision/pull/366
|
// In fact, the new version of cpp_rational from here: https://github.com/boostorg/multiprecision/pull/366
|
||||||
|
|
@ -79,32 +108,64 @@ struct Exact_field_selector
|
||||||
// while Quotient does not. Though, we can still use it if needed.
|
// while Quotient does not. Though, we can still use it if needed.
|
||||||
#if BOOST_VERSION <= 107800
|
#if BOOST_VERSION <= 107800
|
||||||
// See this comment: https://github.com/CGAL/cgal/pull/5937#discussion_r721533675
|
// See this comment: https://github.com/CGAL/cgal/pull/5937#discussion_r721533675
|
||||||
{ typedef Quotient<boost::multiprecision::cpp_int> Type; };
|
typedef Quotient<boost::multiprecision::cpp_int> Rational;
|
||||||
#else
|
#else
|
||||||
{ typedef BOOST_cpp_arithmetic_kernel::Rational Type; };
|
typedef BOOST_cpp_arithmetic_kernel::Rational Rational;
|
||||||
#endif
|
#endif
|
||||||
#else
|
typedef cpp_float Integer;
|
||||||
{ typedef Quotient<MP_Float> Type; };
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CGAL_USE_LEDA
|
||||||
|
template <>
|
||||||
|
struct Exact_NT_backend<LEDA_BACKEND>
|
||||||
|
{
|
||||||
|
typedef leda_rational Rational;
|
||||||
|
typedef leda_integer Integer;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template <>
|
||||||
|
struct Exact_NT_backend<MP_FLOAT_BACKEND>
|
||||||
|
{
|
||||||
|
typedef Quotient<MP_Float> Rational;
|
||||||
|
typedef MP_Float Integer;
|
||||||
|
};
|
||||||
|
|
||||||
|
constexpr ENT_backend_choice Default_Exact_nt_back_end =
|
||||||
|
#if BOOST_VERSION > 107900 && defined(CGAL_USE_BOOST_MP)
|
||||||
|
BOOST_BACKEND;
|
||||||
|
#else // BOOST_VERSION > 107900
|
||||||
|
#ifdef CGAL_USE_GMPXX
|
||||||
|
GMPXX_BACKEND;
|
||||||
|
#elif defined(CGAL_USE_GMP)
|
||||||
|
#if defined(CGAL_USE_BOOST_MP)
|
||||||
|
BOOST_GMP_BACKEND;
|
||||||
|
#else
|
||||||
|
GMP_BACKEND;
|
||||||
|
#endif
|
||||||
|
#elif defined(CGAL_USE_LEDA)
|
||||||
|
LEDA_BACKEND;
|
||||||
|
#else
|
||||||
|
MP_FLOAT_BACKEND;
|
||||||
|
#endif
|
||||||
#endif // BOOST_VERSION > 107900
|
#endif // BOOST_VERSION > 107900
|
||||||
|
|
||||||
|
template < typename >
|
||||||
|
struct Exact_field_selector
|
||||||
|
{
|
||||||
|
using Type = typename Exact_NT_backend<Default_Exact_nt_back_end>::Rational;
|
||||||
|
};
|
||||||
|
|
||||||
// By default, a field is a safe choice of ring.
|
// By default, a field is a safe choice of ring.
|
||||||
template < typename T >
|
template < typename T >
|
||||||
struct Exact_ring_selector : Exact_field_selector < T > { };
|
struct Exact_ring_selector : Exact_field_selector < T > { };
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct Exact_ring_selector<double>
|
struct Exact_ring_selector<double>
|
||||||
#if BOOST_VERSION > 107900 && defined(CGAL_USE_BOOST_MP)
|
{
|
||||||
{ typedef cpp_float Type; };
|
using Type = typename Exact_NT_backend<Default_Exact_nt_back_end>::Integer;
|
||||||
#elif CGAL_HAS_MPZF
|
};
|
||||||
{ typedef Mpzf Type; };
|
|
||||||
#elif defined(CGAL_USE_BOOST_MP)
|
|
||||||
{ typedef boost::multiprecision::cpp_int Type; };
|
|
||||||
#elif defined(CGAL_HAS_THREADS) || !defined(CGAL_USE_GMP)
|
|
||||||
{ typedef MP_Float Type; };
|
|
||||||
#else
|
|
||||||
{ typedef Gmpzf Type; };
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template <>
|
template <>
|
||||||
struct Exact_ring_selector<float> : Exact_ring_selector<double> { };
|
struct Exact_ring_selector<float> : Exact_ring_selector<double> { };
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue