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; |