Merge branch 'Tet_remeshing-fix_compare_subdomains-jtournois' into Tet_remeshing-speedup-GF

This commit is contained in:
Jane Tournois 2020-07-31 09:23:01 +01:00
commit b17fefdd4a
1 changed files with 22 additions and 14 deletions

View File

@ -17,6 +17,7 @@
#include <utility> #include <utility>
#include <array> #include <array>
#include <iterator>
#include <CGAL/Point_3.h> #include <CGAL/Point_3.h>
#include <CGAL/Weighted_point_3.h> #include <CGAL/Weighted_point_3.h>
@ -25,6 +26,9 @@
#include <CGAL/IO/File_binary_mesh_3.h> #include <CGAL/IO/File_binary_mesh_3.h>
#include <boost/container/flat_set.hpp>
#include <boost/container/small_vector.hpp >
namespace CGAL namespace CGAL
{ {
namespace Tetrahedral_remeshing namespace Tetrahedral_remeshing
@ -760,31 +764,35 @@ Subdomain_relation compare_subdomains(const typename C3t3::Vertex_handle v0,
const C3t3& c3t3) const C3t3& c3t3)
{ {
typedef typename C3t3::Subdomain_index Subdomain_index; typedef typename C3t3::Subdomain_index Subdomain_index;
typedef boost::container::flat_set<Subdomain_index,
std::less<Subdomain_index>,
boost::container::small_vector<Subdomain_index, 30> > Set_of_subdomains;
std::vector<Subdomain_index> subdomains_v0; Set_of_subdomains subdomains_v0;
incident_subdomains(v0, c3t3, std::back_inserter(subdomains_v0)); incident_subdomains(v0, c3t3,
std::sort(subdomains_v0.begin(), subdomains_v0.end()); std::inserter(subdomains_v0, subdomains_v0.begin()));
std::vector<Subdomain_index> subdomains_v1; Set_of_subdomains subdomains_v1;
incident_subdomains(v1, c3t3, std::back_inserter(subdomains_v1)); incident_subdomains(v1, c3t3,
std::sort(subdomains_v1.begin(), subdomains_v1.end()); std::inserter(subdomains_v1, subdomains_v1.begin()));
if (subdomains_v0.size() == subdomains_v1.size()) if (subdomains_v0.size() == subdomains_v1.size())
{ {
for (unsigned int i = 0; i < subdomains_v0.size(); i++) if(std::equal(subdomains_v0.begin(), subdomains_v0.end(), subdomains_v1.begin()))
if (subdomains_v0[i] != subdomains_v1[i])
return DIFFERENT;
return EQUAL; return EQUAL;
else
return DIFFERENT;
} }
else else
{ {
std::vector<Subdomain_index> boost::container::small_vector<Subdomain_index, 30>
intersection((std::min)(subdomains_v0.size(), subdomains_v1.size()), -1); intersection((std::min)(subdomains_v0.size(), subdomains_v1.size()), -1);
typename std::vector<Subdomain_index>::iterator typename boost::container::small_vector<Subdomain_index, 30>::iterator
end_it = std::set_intersection(subdomains_v0.begin(), subdomains_v0.end(), end_it = std::set_intersection(subdomains_v0.begin(), subdomains_v0.end(),
subdomains_v1.begin(), subdomains_v1.end(), subdomains_v1.begin(), subdomains_v1.end(),
intersection.begin()); 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() if (subdomains_v0.size() > subdomains_v1.size()
&& intersection_size == std::ptrdiff_t(subdomains_v1.size())) && intersection_size == std::ptrdiff_t(subdomains_v1.size()))