diff --git a/Packages/Interval_arithmetic/include/CGAL/Filtered_predicate.h b/Packages/Interval_arithmetic/include/CGAL/Filtered_predicate.h index 6b46cec3f60..45ae8800a75 100644 --- a/Packages/Interval_arithmetic/include/CGAL/Filtered_predicate.h +++ b/Packages/Interval_arithmetic/include/CGAL/Filtered_predicate.h @@ -21,8 +21,8 @@ // // Author(s) : Sylvain Pion -#ifndef CGAL_FILTER_PREDICATE_H -#define CGAL_FILTER_PREDICATE_H +#ifndef CGAL_FILTERED_PREDICATE_H +#define CGAL_FILTERED_PREDICATE_H #include #include @@ -244,7 +244,87 @@ public: } #endif - // Idem for more than 7 arguments. Do it on demand. + template + result_type + operator()(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, + const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8) const +#ifndef CGAL_CFG_OUTOFLINE_TEMPLATE_MEMBER_DEFINITION_BUG + ; +#else + { + try + { + CGAL_PROFILER(std::string("calls to : ") + std::string(__PRETTY_FUNCTION__)); + Protect_FPU_rounding P; + Ares res = ap(c2a(a1), c2a(a2), c2a(a3), c2a(a4), + c2a(a5), c2a(a6), c2a(a7), c2a(a8) ); + if (! is_indeterminate(res)) + return res; + } + catch (Interval_nt_advanced::unsafe_comparison) {} + CGAL_PROFILER(std::string("failures of : ") + std::string(__PRETTY_FUNCTION__)); + Protect_FPU_rounding P(CGAL_FE_TONEAREST); + return ep(c2e(a1), c2e(a2), c2e(a3), c2e(a4), + c2e(a5), c2e(a6), c2e(a7), c2e(a8) ); + } +#endif + + template + result_type + operator()(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, + const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, + const A9 &a9) const +#ifndef CGAL_CFG_OUTOFLINE_TEMPLATE_MEMBER_DEFINITION_BUG + ; +#else + { + try + { + CGAL_PROFILER(std::string("calls to : ") + std::string(__PRETTY_FUNCTION__)); + Protect_FPU_rounding P; + Ares res = ap(c2a(a1), c2a(a2), c2a(a3), c2a(a4), + c2a(a5), c2a(a6), c2a(a7), c2a(a8), c2a(a9) ); + if (! is_indeterminate(res)) + return res; + } + catch (Interval_nt_advanced::unsafe_comparison) {} + CGAL_PROFILER(std::string("failures of : ") + std::string(__PRETTY_FUNCTION__)); + Protect_FPU_rounding P(CGAL_FE_TONEAREST); + return ep(c2e(a1), c2e(a2), c2e(a3), c2e(a4), + c2e(a5), c2e(a6), c2e(a7), c2e(a8), c2e(a9) ); + } +#endif + + template + result_type + operator()(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, + const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, + const A9 &a9, const A10 &a10) const +#ifndef CGAL_CFG_OUTOFLINE_TEMPLATE_MEMBER_DEFINITION_BUG + ; +#else + { + try + { + CGAL_PROFILER(std::string("calls to : ") + std::string(__PRETTY_FUNCTION__)); + Protect_FPU_rounding P; + Ares res = ap(c2a(a1), c2a(a2), c2a(a3), c2a(a4), + c2a(a5), c2a(a6), c2a(a7), c2a(a8), c2a(a9), c2a(a10) ); + if (! is_indeterminate(res)) + return res; + } + catch (Interval_nt_advanced::unsafe_comparison) {} + CGAL_PROFILER(std::string("failures of : ") + std::string(__PRETTY_FUNCTION__)); + Protect_FPU_rounding P(CGAL_FE_TONEAREST); + return ep(c2e(a1), c2e(a2), c2e(a3), c2e(a4), + c2e(a5), c2e(a6), c2e(a7), c2e(a8), c2e(a9), c2e(a10) ); + } +#endif + + // Idem for more than 10 arguments. Do it on demand. }; #ifndef CGAL_CFG_OUTOFLINE_TEMPLATE_MEMBER_DEFINITION_BUG @@ -369,8 +449,106 @@ Filtered_predicate:: Protect_FPU_rounding P(CGAL_FE_TONEAREST); return ep(c2e(a1), c2e(a2), c2e(a3), c2e(a4), c2e(a5), c2e(a6)); } + +template + template +typename Filtered_predicate::result_type +Filtered_predicate:: + operator()(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, + const A5 &a5, const A6 &a6, const A7 &a7) const +{ + try + { + CGAL_PROFILER(std::string("calls to : ") + std::string(CGAL_PRETTY_FUNCTION)); + Protect_FPU_rounding P; + Ares res = ap(c2a(a1), c2a(a2), c2a(a3), c2a(a4), c2a(a5), c2a(a6), + c2a(a7)); + if (! is_indeterminate(res)) + return res; + } + catch (Interval_nt_advanced::unsafe_comparison) {} + CGAL_PROFILER(std::string("failures of : ") + std::string(CGAL_PRETTY_FUNCTION)); + Protect_FPU_rounding P(CGAL_FE_TONEAREST); + return ep(c2e(a1), c2e(a2), c2e(a3), c2e(a4), c2e(a5), c2e(a6), c2e(a7)); +} + +template + template +typename Filtered_predicate::result_type +Filtered_predicate:: + operator()(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, + const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8) const +{ + try + { + CGAL_PROFILER(std::string("calls to : ") + std::string(CGAL_PRETTY_FUNCTION)); + Protect_FPU_rounding P; + Ares res = ap(c2a(a1), c2a(a2), c2a(a3), c2a(a4), c2a(a5), c2a(a6), + c2a(a7), c2a(a8)); + if (! is_indeterminate(res)) + return res; + } + catch (Interval_nt_advanced::unsafe_comparison) {} + CGAL_PROFILER(std::string("failures of : ") + std::string(CGAL_PRETTY_FUNCTION)); + Protect_FPU_rounding P(CGAL_FE_TONEAREST); + return ep(c2e(a1), c2e(a2), c2e(a3), c2e(a4), c2e(a5), c2e(a6), c2e(a7), + c2e(a8)); +} + +template + template +typename Filtered_predicate::result_type +Filtered_predicate:: + operator()(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, + const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, + const A9 &a9) const +{ + try + { + CGAL_PROFILER(std::string("calls to : ") + std::string(CGAL_PRETTY_FUNCTION)); + Protect_FPU_rounding P; + Ares res = ap(c2a(a1), c2a(a2), c2a(a3), c2a(a4), c2a(a5), c2a(a6), + c2a(a7), c2a(a8), c2a(a9)); + if (! is_indeterminate(res)) + return res; + } + catch (Interval_nt_advanced::unsafe_comparison) {} + CGAL_PROFILER(std::string("failures of : ") + std::string(CGAL_PRETTY_FUNCTION)); + Protect_FPU_rounding P(CGAL_FE_TONEAREST); + return ep(c2e(a1), c2e(a2), c2e(a3), c2e(a4), c2e(a5), c2e(a6), c2e(a7), + c2e(a8), c2e(a9)); +} + +template + template +typename Filtered_predicate::result_type +Filtered_predicate:: + operator()(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, + const A5 &a5, const A6 &a6, const A7 &a7, const A8 &a8, + const A9 &a9, const A10 &a10) const +{ + try + { + CGAL_PROFILER(std::string("calls to : ") + std::string(CGAL_PRETTY_FUNCTION)); + Protect_FPU_rounding P; + Ares res = ap(c2a(a1), c2a(a2), c2a(a3), c2a(a4), c2a(a5), c2a(a6), + c2a(a7), c2a(a8), c2a(a9), c2a(a10)); + if (! is_indeterminate(res)) + return res; + } + catch (Interval_nt_advanced::unsafe_comparison) {} + CGAL_PROFILER(std::string("failures of : ") + std::string(CGAL_PRETTY_FUNCTION)); + Protect_FPU_rounding P(CGAL_FE_TONEAREST); + return ep(c2e(a1), c2e(a2), c2e(a3), c2e(a4), c2e(a5), c2e(a6), c2e(a7), + c2e(a8), c2e(a9), c2e(a10)); +} + #endif CGAL_END_NAMESPACE -#endif // CGAL_FILTER_PREDICATE_H +#endif // CGAL_FILTERED_PREDICATE_H