#2133 faceset helper: compare index vectors by address instead of value

This commit is contained in:
Thomas Krijnen
2022-04-11 14:12:17 +02:00
parent 054c0a9a27
commit 460fd5ca87
2 changed files with 16 additions and 4 deletions
+15 -3
View File
@@ -111,6 +111,18 @@ public:
std::map<int, TopoDS_Shape> Shape;
};
namespace util {
template <typename T>
typename std::enable_if<std::is_pointer<T>::value, T&>::type conditional_address_of(T& t) {
return t;
}
template <typename T>
typename std::enable_if<!std::is_pointer<T>::value, T*>::type conditional_address_of(T& t) {
return &t;
}
}
class IFC_GEOM_API MAKE_TYPE_NAME(Kernel) : public IfcGeom::Kernel {
private:
@@ -126,7 +138,7 @@ private:
class faceset_helper {
private:
MAKE_TYPE_NAME(Kernel)* kernel_;
std::set<LP> duplicates_;
std::set<typename std::conditional<std::is_pointer<LP>::value, LP, const LP*>::type> duplicates_;
std::map<const void*, int> vertex_mapping_;
std::map<std::pair<int, int>, TopoDS_Edge> edges_;
// not always in use
@@ -225,8 +237,8 @@ private:
return true;
}
bool wire(LP loop, TopoDS_Wire& wire) {
if (duplicates_.find(loop) != duplicates_.end()) {
bool wire(const LP& loop, TopoDS_Wire& wire) {
if (duplicates_.find(util::conditional_address_of(loop)) != duplicates_.end()) {
return false;
}
BRep_Builder builder;
+1 -1
View File
@@ -5613,7 +5613,7 @@ IfcGeom::Kernel::faceset_helper<CP, LP>::faceset_helper(
if (edge_sets.find(segment_set) != edge_sets.end()) {
duplicate_faces++;
duplicates_.insert(*ps);
duplicates_.insert(util::conditional_address_of(*ps));
continue;
}
edge_sets.insert(segment_set);