From 9e82356213431b50f0cd0994059f128c856a51ba Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Fri, 24 Jul 2020 16:54:29 +0200 Subject: [PATCH 1/2] fix compare_subdomains compared std::vector were not made unique! always different in presence of different numbers of incident cells --- .../internal/tetrahedral_remeshing_helpers.h | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h index 2c99833b158..f1b095d3dcc 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h @@ -25,6 +25,8 @@ #include +#include + namespace CGAL { namespace Tetrahedral_remeshing @@ -761,20 +763,20 @@ Subdomain_relation compare_subdomains(const typename C3t3::Vertex_handle v0, { typedef typename C3t3::Subdomain_index Subdomain_index; - std::vector subdomains_v0; - incident_subdomains(v0, c3t3, std::back_inserter(subdomains_v0)); - std::sort(subdomains_v0.begin(), subdomains_v0.end()); + boost::container::flat_set subdomains_v0; + incident_subdomains(v0, c3t3, + std::inserter(subdomains_v0, subdomains_v0.begin())); - std::vector subdomains_v1; - incident_subdomains(v1, c3t3, std::back_inserter(subdomains_v1)); - std::sort(subdomains_v1.begin(), subdomains_v1.end()); + boost::container::flat_set subdomains_v1; + incident_subdomains(v1, c3t3, + std::inserter(subdomains_v1, subdomains_v1.begin())); if (subdomains_v0.size() == subdomains_v1.size()) { - for (unsigned int i = 0; i < subdomains_v0.size(); i++) - if (subdomains_v0[i] != subdomains_v1[i]) - return DIFFERENT; - return EQUAL; + if(std::equal(subdomains_v0.begin(), subdomains_v0.end(), subdomains_v1.begin())) + return EQUAL; + else + return DIFFERENT; } else { From 993e4b599ae13f31e76594248043f06c993ec894 Mon Sep 17 00:00:00 2001 From: Jane Tournois Date: Tue, 28 Jul 2020 10:34:10 +0200 Subject: [PATCH 2/2] Use a small_vector as the third template arguments of the flat_set That will avoid the memory allocation at each call of the function. --- .../internal/tetrahedral_remeshing_helpers.h | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h index f1b095d3dcc..fa58069e499 100644 --- a/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h +++ b/Tetrahedral_remeshing/include/CGAL/Tetrahedral_remeshing/internal/tetrahedral_remeshing_helpers.h @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -26,6 +27,7 @@ #include #include +#include namespace CGAL { @@ -762,12 +764,15 @@ Subdomain_relation compare_subdomains(const typename C3t3::Vertex_handle v0, const C3t3& c3t3) { typedef typename C3t3::Subdomain_index Subdomain_index; + typedef boost::container::flat_set, + boost::container::small_vector > Set_of_subdomains; - boost::container::flat_set subdomains_v0; + Set_of_subdomains subdomains_v0; incident_subdomains(v0, c3t3, std::inserter(subdomains_v0, subdomains_v0.begin())); - boost::container::flat_set subdomains_v1; + Set_of_subdomains subdomains_v1; incident_subdomains(v1, c3t3, std::inserter(subdomains_v1, subdomains_v1.begin())); @@ -780,13 +785,14 @@ Subdomain_relation compare_subdomains(const typename C3t3::Vertex_handle v0, } else { - std::vector - intersection((std::min)(subdomains_v0.size(), subdomains_v1.size()), -1); - typename std::vector::iterator + boost::container::small_vector + intersection((std::min)(subdomains_v0.size(), subdomains_v1.size()), -1); + typename boost::container::small_vector::iterator end_it = std::set_intersection(subdomains_v0.begin(), subdomains_v0.end(), subdomains_v1.begin(), subdomains_v1.end(), intersection.begin()); - std::ptrdiff_t intersection_size = (end_it - intersection.begin()); + std::ptrdiff_t intersection_size = + std::distance(intersection.begin(), end_it); if (subdomains_v0.size() > subdomains_v1.size() && intersection_size == std::ptrdiff_t(subdomains_v1.size()))