Made Kernel_checker work with constructions

Basically, use the same Pairify class to deduce the return type.
This commit is contained in:
Mael Rouxel-Labbé 2017-05-03 18:42:13 +02:00
parent 8edb36dd64
commit f636d0d070
1 changed files with 204 additions and 190 deletions

View File

@ -21,20 +21,17 @@
// //
// //
// Author(s) : Sylvain Pion // Author(s) : Sylvain Pion
// Mael Rouxel-Labbé
#ifndef CGAL_KERNEL_CHECKER_H #ifndef CGAL_KERNEL_CHECKER_H
#define CGAL_KERNEL_CHECKER_H #define CGAL_KERNEL_CHECKER_H
// This file contains the definition of a kernel traits checker. // This file contains the definition of a kernel traits checker.
//
// TODO:
// - At the moment, only predicates are checked. To handle constructions as
// well, the best approach is probably to have objects be pairs, and do
// everything in parallel (cf Curved_kernel's traits checker for an example).
// So the template parameter will be a comparator, not a converter.
#include <CGAL/basic.h> #include <CGAL/basic.h>
#include <CGAL/result_of.h>
#include <CGAL/use.h> #include <CGAL/use.h>
#include <utility> #include <utility>
#include <typeinfo> #include <typeinfo>
@ -77,7 +74,6 @@ struct Pairify <Angle, Angle> {
{ CGAL_kernel_assertion(t1 == t2); CGAL_USE(t2); return t1; } { CGAL_kernel_assertion(t1 == t2); CGAL_USE(t2); return t1; }
}; };
// Class used by Kernel_checker. // Class used by Kernel_checker.
template <class P1, class P2, class Cmp> template <class P1, class P2, class Cmp>
class Primitive_checker class Primitive_checker
@ -85,24 +81,21 @@ class Primitive_checker
P1 p1; P1 p1;
P2 p2; P2 p2;
Cmp cmp; Cmp cmp;
typedef Pairify<typename P1::result_type,
typename P2::result_type> Pair_maker;
Pair_maker pair_maker;
public: public:
Primitive_checker(const P1 &pp1 = P1(), const P2 &pp2 = P2(), const Cmp &c = Cmp())
typedef typename Pair_maker::result_type result_type; : p1(pp1), p2(pp2), cmp(c)
{ }
Primitive_checker(const P1 &pp1 = P1(), const P2 &pp2 = P2(),
const Cmp &c = Cmp())
: p1(pp1), p2(pp2), cmp(c) {}
template <class A1> template <class A1>
result_type typename Pairify<typename CGAL::cpp11::result_of<P1(const A1&)>::type,
typename CGAL::cpp11::result_of<P2(const A1&)>::type>::result_type
operator()(const A1 &a1) const operator()(const A1 &a1) const
{ {
typename P1::result_type res1 = p1(a1.first); typedef typename CGAL::cpp11::result_of<P1(const A1&)>::type result_type_1;
typename P2::result_type res2 = p2(a1.second); typedef typename CGAL::cpp11::result_of<P2(const A1&)>::type result_type_2;
result_type_1 res1 = p1(a1.first);
result_type_2 res2 = p2(a1.second);
if (! cmp(res1, res2)) if (! cmp(res1, res2))
{ {
std::cerr << "Kernel_checker error : " << res1 << " != " << res2 std::cerr << "Kernel_checker error : " << res1 << " != " << res2
@ -116,15 +109,18 @@ public:
std::cerr << CGAL_PRETTY_FUNCTION << std::endl; std::cerr << CGAL_PRETTY_FUNCTION << std::endl;
CGAL_kernel_assertion(false); CGAL_kernel_assertion(false);
} }
return pair_maker(res1, res2); return Pairify<result_type_1, result_type_2>()(res1, res2);
} }
template <class A1, class A2> template <class A1, class A2>
result_type typename Pairify<typename CGAL::cpp11::result_of<P1(const A1&, const A2&)>::type,
typename CGAL::cpp11::result_of<P2(const A1&, const A2&)>::type>::result_type
operator()(const A1 &a1, const A2 &a2) const operator()(const A1 &a1, const A2 &a2) const
{ {
typename P1::result_type res1 = p1(a1.first, a2.first); typedef typename CGAL::cpp11::result_of<P1(const A1&, const A2&)>::type result_type_1;
typename P2::result_type res2 = p2(a1.second, a2.second); typedef typename CGAL::cpp11::result_of<P2(const A1&, const A2&)>::type result_type_2;
result_type_1 res1 = p1(a1.first, a2.first);
result_type_2 res2 = p2(a1.second, a2.second);
if (! cmp(res1, res2)) if (! cmp(res1, res2))
{ {
std::cerr << "Kernel_checker error : " << res1 << " != " << res2 std::cerr << "Kernel_checker error : " << res1 << " != " << res2
@ -140,15 +136,20 @@ public:
std::cerr << CGAL_PRETTY_FUNCTION << std::endl; std::cerr << CGAL_PRETTY_FUNCTION << std::endl;
CGAL_kernel_assertion(false); CGAL_kernel_assertion(false);
} }
return pair_maker(res1, res2); return Pairify<result_type_1, result_type_2>()(res1, res2);
} }
template <class A1, class A2, class A3> template <class A1, class A2, class A3>
result_type typename Pairify<typename CGAL::cpp11::result_of<P1(
const A1&, const A2&, const A3&)>::type,
typename CGAL::cpp11::result_of<P2(
const A1&, const A2&, const A3&)>::type>::result_type
operator()(const A1 &a1, const A2 &a2, const A3 &a3) const operator()(const A1 &a1, const A2 &a2, const A3 &a3) const
{ {
typename P1::result_type res1 = p1(a1.first, a2.first, a3.first); typedef typename CGAL::cpp11::result_of<P1(const A1&, const A2&, const A3&)>::type result_type_1;
typename P2::result_type res2 = p2(a1.second, a2.second, a3.second); typedef typename CGAL::cpp11::result_of<P2(const A1&, const A2&, const A3&)>::type result_type_2;
result_type_1 res1 = p1(a1.first, a2.first, a3.first);
result_type_2 res2 = p2(a1.second, a2.second, a3.second);
if (! cmp(res1, res2)) if (! cmp(res1, res2))
{ {
std::cerr << "Kernel_checker error : " << res1 << " != " << res2 std::cerr << "Kernel_checker error : " << res1 << " != " << res2
@ -166,17 +167,23 @@ public:
std::cerr << CGAL_PRETTY_FUNCTION << std::endl; std::cerr << CGAL_PRETTY_FUNCTION << std::endl;
CGAL_kernel_assertion(false); CGAL_kernel_assertion(false);
} }
return pair_maker(res1, res2); return Pairify<result_type_1, result_type_2>()(res1, res2);
} }
template <class A1, class A2, class A3, class A4> template <class A1, class A2, class A3, class A4>
result_type typename Pairify<typename CGAL::cpp11::result_of<P1(
const A1&, const A2&, const A3&, const A4&)>::type,
typename CGAL::cpp11::result_of<P2(
const A1&, const A2&, const A3&, const A4&)>::type>::result_type
operator()(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4) const operator()(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4) const
{ {
typename P1::result_type res1 = p1(a1.first, a2.first, typedef typename CGAL::cpp11::result_of<P1(
a3.first, a4.first); const A1&, const A2&, const A3&, const A4&)>::type result_type_1;
typename P2::result_type res2 = p2(a1.second, a2.second, typedef typename CGAL::cpp11::result_of<P2(
a3.second, a4.second); const A1&, const A2&, const A3&, const A4&)>::type result_type_2;
result_type_1 res1 = p1(a1.first, a2.first, a3.first, a4.first);
result_type_2 res2 = p2(a1.second, a2.second, a3.second, a4.second);
if (! cmp(res1, res2)) if (! cmp(res1, res2))
{ {
std::cerr << "Kernel_checker error : " << res1 << " != " << res2 std::cerr << "Kernel_checker error : " << res1 << " != " << res2
@ -196,18 +203,23 @@ public:
std::cerr << CGAL_PRETTY_FUNCTION << std::endl; std::cerr << CGAL_PRETTY_FUNCTION << std::endl;
CGAL_kernel_assertion(false); CGAL_kernel_assertion(false);
} }
return pair_maker(res1, res2); return Pairify<result_type_1, result_type_2>()(res1, res2);
} }
template <class A1, class A2, class A3, class A4, class A5> template <class A1, class A2, class A3, class A4, class A5>
result_type typename Pairify<typename CGAL::cpp11::result_of<P1(
operator()(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A1&, const A2&, const A3&, const A4&, const A5&)>::type,
const A5 &a5) const typename CGAL::cpp11::result_of<P2(
const A1&, const A2&, const A3&, const A4&, const A5&)>::type>::result_type
operator()(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5) const
{ {
typename P1::result_type res1 = p1(a1.first, a2.first, typedef typename CGAL::cpp11::result_of<P1(
a3.first, a4.first, a5.first); const A1&, const A2&, const A3&, const A4&, const A5&)>::type result_type_1;
typename P2::result_type res2 = p2(a1.second, a2.second, typedef typename CGAL::cpp11::result_of<P2(
a3.second, a4.second, a5.second); const A1&, const A2&, const A3&, const A4&, const A5&)>::type result_type_2;
result_type_1 res1 = p1(a1.first, a2.first, a3.first, a4.first, a5.first);
result_type_2 res2 = p2(a1.second, a2.second, a3.second, a4.second, a5.second);
if (! cmp(res1, res2)) if (! cmp(res1, res2))
{ {
std::cerr << "Kernel_checker error : " << res1 << " != " << res2 std::cerr << "Kernel_checker error : " << res1 << " != " << res2
@ -229,7 +241,7 @@ public:
std::cerr << CGAL_PRETTY_FUNCTION << std::endl; std::cerr << CGAL_PRETTY_FUNCTION << std::endl;
CGAL_kernel_assertion(false); CGAL_kernel_assertion(false);
} }
return pair_maker(res1, res2); return Pairify<result_type_1, result_type_2>()(res1, res2);
} }
// Same thing with more arguments... // Same thing with more arguments...
@ -282,6 +294,7 @@ public:
CGAL_kc_pair(Object_3) CGAL_kc_pair(Object_3)
CGAL_kc_pair(Point_2) CGAL_kc_pair(Point_2)
CGAL_kc_pair(Weighted_point_2)
CGAL_kc_pair(Vector_2) CGAL_kc_pair(Vector_2)
CGAL_kc_pair(Direction_2) CGAL_kc_pair(Direction_2)
CGAL_kc_pair(Line_2) CGAL_kc_pair(Line_2)
@ -294,6 +307,7 @@ public:
CGAL_kc_pair(Aff_transformation_2) CGAL_kc_pair(Aff_transformation_2)
CGAL_kc_pair(Point_3) CGAL_kc_pair(Point_3)
CGAL_kc_pair(Weighted_point_3)
CGAL_kc_pair(Plane_3) CGAL_kc_pair(Plane_3)
CGAL_kc_pair(Vector_3) CGAL_kc_pair(Vector_3)
CGAL_kc_pair(Direction_3) CGAL_kc_pair(Direction_3)
@ -314,9 +328,9 @@ public:
#define CGAL_Kernel_cons(Y,Z) CGAL_Kernel_pred(Y,Z) #define CGAL_Kernel_cons(Y,Z) CGAL_Kernel_pred(Y,Z)
public: public:
#include <CGAL/Kernel/interface_macros.h> #include <CGAL/Kernel/interface_macros.h>
}; };
} //namespace CGAL } //namespace CGAL