diff --git a/Filtered_kernel/include/CGAL/Static_filtered_predicate.h b/Filtered_kernel/include/CGAL/Static_filtered_predicate.h index 9ff3aea5d1c..9353ce9b5b3 100644 --- a/Filtered_kernel/include/CGAL/Static_filtered_predicate.h +++ b/Filtered_kernel/include/CGAL/Static_filtered_predicate.h @@ -21,215 +21,34 @@ class Static_filtered_predicate { public: FP fp; EpicP epicp; - typedef typename AK::FT IA; - typedef typename FP::result_type result_type; - template - result_type operator()(const A1& a1) const + template + auto + operator()(const Args&... args) const + -> decltype(fp(args...)) { - CGAL::Epic_converter convert; - auto aa1 = convert(approx(a1)); - if(! aa1.second){ - return fp(a1); - } + CGAL::Epic_converter converter; - return epicp(aa1.first); - } + std::tuple converted_args; + auto convert = [&](auto index, const auto& arg) + { + auto converted = converter(approx(arg)); + if(converted.second) + std::get(converted_args) = converted; + return converted.second; + }; - template - result_type operator()(const A1& a1, const A2& a2) const - { - CGAL::Epic_converter convert; - auto aa1 = convert(approx(a1)); - if(! aa1.second){ - return fp(a1, a2); - } - auto aa2 = convert(approx(a2)); - if(! aa2.second){ - return fp(a1, a2); - } - return epicp(aa1.first, aa2.first); - } + bool success = [&](std::index_sequence) { + return (... && convert(std::integral_constant{}, args)); + }(std::index_sequence_for{}); + if(!success) // failed to convert all arguments, call the base predicate + return fp(args...); - template - result_type operator()(const A1& a1, const A2& a2, const A3& a3) const - { - CGAL::Epic_converter convert; - auto aa1 = convert(approx(a1)); - if(! aa1.second){ - return fp(a1, a2, a3); - } - auto aa2 = convert(approx(a2)); - if(! aa2.second){ - return fp(a1, a2, a3); - } - auto aa3 = convert(approx(a3)); - if(! aa3.second){ - return fp(a1, a2, a3); - } - return epicp(aa1.first, aa2.first, aa3.first); - } - - - template - result_type operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4) const - { - CGAL::Epic_converter convert; - auto aa1 = convert(approx(a1)); - if(! aa1.second){ - return fp(a1, a2, a3, a4); - } - - auto aa2 = convert(approx(a2)); - if(! aa2.second){ - return fp(a1, a2, a3, a4); - } - - auto aa3 = convert(approx(a3)); - if(! aa3.second){ - return fp(a1, a2, a3, a4); - } - - auto aa4 = convert(approx(a4)); - if(! aa4.second){ - return fp(a1, a2, a3, a4); - } - return epicp(aa1.first, aa2.first, aa3.first, aa4.first); - } - - template - result_type operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5) const - { - CGAL::Epic_converter convert; - auto aa1 = convert(approx(a1)); - if(! aa1.second){ - return fp(a1, a2, a3, a4, a5); - } - auto aa2 = convert(approx(a2)); - if(! aa2.second){ - return fp(a1, a2, a3, a4, a5); - } - auto aa3 = convert(approx(a3)); - if(! aa3.second){ - return fp(a1, a2, a3, a4, a5); - } - auto aa4 = convert(approx(a4)); - if(! aa4.second){ - return fp(a1, a2, a3, a4, a5); - } - auto aa5 = convert(approx(a5)); - if(! aa5.second){ - return fp(a1, a2, a3, a4, a5); - } - return epicp(aa1.first, aa2.first, aa3.first, aa4.first, aa5.first); - } - - template - result_type operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6) const - { - CGAL::Epic_converter convert; - auto aa1 = convert(approx(a1)); - if(! aa1.second){ - return fp(a1, a2, a3, a4, a5, a6); - } - auto aa2 = convert(approx(a2)); - if(! aa2.second){ - return fp(a1, a2, a3, a4, a5, a6); - } - auto aa3 = convert(approx(a3)); - if(! aa3.second){ - return fp(a1, a2, a3, a4, a5, a6); - } - auto aa4 = convert(approx(a4)); - if(! aa4.second){ - return fp(a1, a2, a3, a4, a5, a6); - } - auto aa5 = convert(approx(a5)); - if(! aa5.second){ - return fp(a1, a2, a3, a4, a5, a6); - } - auto aa6 = convert(approx(a6)); - if(! aa6.second){ - return fp(a1, a2, a3, a4, a5, a6); - } - return epicp(aa1.first, aa2.first, aa3.first, aa4.first, aa5.first, aa6.first); - } - - template - result_type operator()(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A6& a7) const - { - CGAL::Epic_converter convert; - auto aa1 = convert(approx(a1)); - if(! aa1.second){ - return fp(a1, a2, a3, a4, a5, a6, a7); - } - auto aa2 = convert(approx(a2)); - if(! aa2.second){ - return fp(a1, a2, a3, a4, a5, a6, a7); - } - auto aa3 = convert(approx(a3)); - if(! aa3.second){ - return fp(a1, a2, a3, a4, a5, a6, a7); - } - auto aa4 = convert(approx(a4)); - if(! aa4.second){ - return fp(a1, a2, a3, a4, a5, a6, a7); - } - auto aa5 = convert(approx(a5)); - if(! aa5.second){ - return fp(a1, a2, a3, a4, a5, a6, a7); - } - auto aa6 = convert(approx(a6)); - if(! aa6.second){ - return fp(a1, a2, a3, a4, a5, a6, a7); - } - auto aa7 = convert(approx(a7)); - if(! aa7.second){ - return fp(a1, a2, a3, a4, a5, a6, a7); - } - return epicp(aa1.first, aa2.first, aa3.first, aa4.first, aa5.first, aa6.first, aa7.first); - } - - - 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 - { - CGAL::Epic_converter convert; - auto aa1 = convert(approx(a1)); - if(! aa1.second){ - return fp(a1, a2, a3, a4, a5, a6, a7, a8); - } - auto aa2 = convert(approx(a2)); - if(! aa2.second){ - return fp(a1, a2, a3, a4, a5, a6, a7, a8); - } - auto aa3 = convert(approx(a3)); - if(! aa3.second){ - return fp(a1, a2, a3, a4, a5, a6, a7, a8); - } - auto aa4 = convert(approx(a4)); - if(! aa4.second){ - return fp(a1, a2, a3, a4, a5, a6, a7, a8); - } - auto aa5 = convert(approx(a5)); - if(! aa5.second){ - return fp(a1, a2, a3, a4, a5, a6, a7, a8); - } - auto aa6 = convert(approx(a6)); - if(! aa6.second){ - return fp(a1, a2, a3, a5, a5, a6, a7, a8); - } - auto aa7 = convert(approx(a7)); - if(! aa7.second){ - return fp(a1, a2, a3, a5, a5, a6, a7, a8); - } - auto aa8 = convert(approx(a8)); - if(! aa8.second){ - return fp(a1, a2, a3, a4, a5, a6, a7, a8); - } - return epicp(aa1.first, aa2.first, aa3.first, aa4.first, aa5.first, aa6.first, aa7.first, aa8.first); + return [&](std::index_sequence) { + return epicp(std::get(converted_args).first...); + }(std::index_sequence_for{}); } };