From 7049d667e5b1574c0f91d0c827574fff3f3988f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mael=20Rouxel-Labb=C3=A9?= Date: Fri, 10 Sep 2021 18:12:30 +0200 Subject: [PATCH] Avoid copying arrays --- .../internal/Bbox_3_Triangle_3_do_intersect.h | 86 ++++++++++--------- 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Triangle_3_do_intersect.h b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Triangle_3_do_intersect.h index 5b87ed6678a..ccc948e1873 100644 --- a/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Triangle_3_do_intersect.h +++ b/Intersections_3/include/CGAL/Intersections_3/internal/Bbox_3_Triangle_3_do_intersect.h @@ -191,14 +191,15 @@ collinear_axis(const std::array& side) template inline -Uncertain do_axis_intersect(const std::array< std::array , 3>& triangle, - const std::array< std::array , 3>& sides, +Uncertain do_axis_intersect(const std::array, 3>& triangle, + const std::array, 3>& sides, const Box3& bbox, Fct do_axis_intersect_aux_impl) { - // TODO: no longer a ptr, is it an issue for swap? - std::array j = triangle[SIDE]; - std::array k = triangle[(SIDE+2)%3]; + const std::array& j = triangle[SIDE]; + const std::array& k = triangle[(SIDE+2)%3]; + const std::array* j_ptr = &j; + const std::array* k_ptr = &k; std::array p_min, p_max; get_min_max(AXE==0? 0: AXE==1? sides[SIDE][2]: -sides[SIDE][1], @@ -208,48 +209,51 @@ Uncertain do_axis_intersect(const std::array< std::array , 3>& tria switch(AXE) { - case 0: + case 0: { - // t_max >= t_min - Uncertain b = do_axis_intersect_aux_A0(k[1]-j[1], k[2]-j[2], sides, do_axis_intersect_aux_impl) != NEGATIVE; - if(is_indeterminate(b)) - return b; - if(b) - std::swap(j,k); + // t_max >= t_min + Uncertain b = do_axis_intersect_aux_A0(k[1]-j[1], k[2]-j[2], sides, do_axis_intersect_aux_impl) != NEGATIVE; + if(is_indeterminate(b)) + return b; + if(b) + std::swap(j_ptr, k_ptr); - return CGAL_AND((do_axis_intersect_aux_A0(p_min[1]-j[1], p_min[2]-j[2], sides, do_axis_intersect_aux_impl) != POSITIVE), - (do_axis_intersect_aux_A0(p_max[1]-k[1], p_max[2]-k[2], sides, do_axis_intersect_aux_impl) != NEGATIVE) ); - } - case 1: + return CGAL_AND((do_axis_intersect_aux_A0(p_min[1]-(*j_ptr)[1], p_min[2]-(*j_ptr)[2], + sides, do_axis_intersect_aux_impl) != POSITIVE), + (do_axis_intersect_aux_A0(p_max[1]-(*k_ptr)[1], p_max[2]-(*k_ptr)[2], + sides, do_axis_intersect_aux_impl) != NEGATIVE) ); + } + case 1: { - // t_max >= t_min - Uncertain b = do_axis_intersect_aux_A1(k[0]-j[0], k[2]-j[2], sides, do_axis_intersect_aux_impl) != NEGATIVE; - if(is_indeterminate(b)) - return b; - if(b) - std::swap(j,k); + // t_max >= t_min + Uncertain b = do_axis_intersect_aux_A1(k[0]-j[0], k[2]-j[2], sides, do_axis_intersect_aux_impl) != NEGATIVE; + if(is_indeterminate(b)) + return b; + if(b) + std::swap(j_ptr, k_ptr); - return CGAL_AND((do_axis_intersect_aux_A1(p_min[0]-j[0], p_min[2]-j[2], sides, do_axis_intersect_aux_impl) != POSITIVE), - (do_axis_intersect_aux_A1(p_max[0]-k[0], p_max[2]-k[2], sides, do_axis_intersect_aux_impl) != NEGATIVE) ); - - } - case 2: + return CGAL_AND((do_axis_intersect_aux_A1(p_min[0]-(*j_ptr)[0], p_min[2]-(*j_ptr)[2], + sides, do_axis_intersect_aux_impl) != POSITIVE), + (do_axis_intersect_aux_A1(p_max[0]-(*k_ptr)[0], p_max[2]-(*k_ptr)[2], + sides, do_axis_intersect_aux_impl) != NEGATIVE) ); + } + case 2: { - // t_max >= t_min - Uncertain b = do_axis_intersect_aux_A2(k[0]-j[0], k[1]-j[1], sides, do_axis_intersect_aux_impl) != NEGATIVE; - if( is_indeterminate(b)) - return b; + // t_max >= t_min + Uncertain b = do_axis_intersect_aux_A2(k[0]-j[0], k[1]-j[1], sides, do_axis_intersect_aux_impl) != NEGATIVE; + if(is_indeterminate(b)) + return b; + if(b) + std::swap(j_ptr, k_ptr); - if(b) - std::swap(j,k); - - return CGAL_AND((do_axis_intersect_aux_A2(p_min[0]-j[0], p_min[1]-j[1], sides, do_axis_intersect_aux_impl) != POSITIVE), - (do_axis_intersect_aux_A2(p_max[0]-k[0], p_max[1]-k[1], sides, do_axis_intersect_aux_impl) != NEGATIVE) ); - } - default: - // Should not happen - CGAL_error(); - return make_uncertain(false); + return CGAL_AND((do_axis_intersect_aux_A2(p_min[0]-(*j_ptr)[0], p_min[1]-(*j_ptr)[1], + sides, do_axis_intersect_aux_impl) != POSITIVE), + (do_axis_intersect_aux_A2(p_max[0]-(*k_ptr)[0], p_max[1]-(*k_ptr)[1], + sides, do_axis_intersect_aux_impl) != NEGATIVE) ); + } + default: // Should not happen + CGAL_error(); + return make_uncertain(false); } }