diff --git a/src/bundles/graphics/_graphics/mesh_edges.cpp b/src/bundles/graphics/_graphics/mesh_edges.cpp
index e0537a835..215d82122 100644
|
a
|
b
|
|
| 13 | 13 | * === UCSF ChimeraX Copyright === |
| 14 | 14 | */ |
| 15 | 15 | |
| 16 | | #include <set> // use std::set |
| | 16 | #include <unordered_set> // use std::unordered_set |
| 17 | 17 | |
| 18 | 18 | #include <arrays/pythonarray.h> // use array_from_python() |
| 19 | 19 | #include <arrays/rcarray.h> // use Numeric_Array, Array<T> |
| … |
… |
|
| 25 | 25 | namespace Map_Cpp |
| 26 | 26 | { |
| 27 | 27 | |
| | 28 | static_assert(sizeof(int) * 2 == sizeof(size_t), "Size of int is not half of size_t - hash needs a re-think!"); |
| | 29 | |
| | 30 | struct edge_hash |
| | 31 | { |
| | 32 | std::size_t operator() (const std::pair<int, int> &edge) const noexcept |
| | 33 | { |
| | 34 | return (size_t)edge.first << 32 | edge.second; |
| | 35 | } |
| | 36 | }; |
| | 37 | |
| 28 | 38 | // ---------------------------------------------------------------------------- |
| 29 | 39 | // Find edges of displayed triangles. Edges that appear in 2 or more triangles |
| 30 | 40 | // are only listed once. |
| … |
… |
namespace Map_Cpp
|
| 32 | 42 | static IArray calculate_masked_edges(const IArray &triangles, |
| 33 | 43 | const BArray &tmask, const BArray &emask) |
| 34 | 44 | { |
| 35 | | std::set< std::pair<int,int> > edges; |
| | 45 | std::unordered_set< std::pair<int,int>, edge_hash > edges; |
| 36 | 46 | |
| 37 | 47 | unsigned char *show_t = (tmask.size() > 0 ? tmask.values() : NULL); |
| 38 | 48 | unsigned char *show_e = (emask.size() > 0 ? emask.values() : NULL); |
| 39 | 49 | int n = triangles.size(0); |
| | 50 | edges.max_load_factor(0.75); |
| | 51 | edges.reserve(n*2); |
| | 52 | |
| 40 | 53 | int *tarray = triangles.values(); |
| 41 | 54 | for (int k = 0 ; k < n ; ++k, tarray += 3) |
| 42 | 55 | { |
| … |
… |
static IArray calculate_masked_edges(const IArray &triangles,
|
| 56 | 69 | int64_t size[2] = {(int64_t)edges.size(), 2}; |
| 57 | 70 | IArray masked_edges(2, size); |
| 58 | 71 | int *eiarray = masked_edges.values(); |
| 59 | | for (std::set< std::pair<int,int> >::iterator ei = edges.begin() ; |
| | 72 | for (auto ei = edges.begin() ; |
| 60 | 73 | ei != edges.end() ; ++ei) |
| 61 | 74 | { |
| 62 | 75 | *eiarray = (*ei).first; eiarray += 1; |