Ticket #5964: mesh_edges.cpp-1.diff

File mesh_edges.cpp-1.diff, 2.0 KB (added by Tristan Croll, 4 years ago)

Added by email2trac

  • src/bundles/graphics/_graphics/mesh_edges.cpp

    diff --git a/src/bundles/graphics/_graphics/mesh_edges.cpp b/src/bundles/graphics/_graphics/mesh_edges.cpp
    index e0537a835..215d82122 100644
    a b  
    1313 * === UCSF ChimeraX Copyright ===
    1414 */
    1515
    16 #include <set>                          // use std::set
     16#include <unordered_set>                                // use std::unordered_set
    1717
    1818#include <arrays/pythonarray.h>         // use array_from_python()
    1919#include <arrays/rcarray.h>             // use Numeric_Array, Array<T>
     
    2525namespace Map_Cpp
    2626{
    2727
     28static_assert(sizeof(int) * 2 == sizeof(size_t), "Size of int is not half of size_t - hash needs a re-think!");
     29
     30struct 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
    2838// ----------------------------------------------------------------------------
    2939// Find edges of displayed triangles.  Edges that appear in 2 or more triangles
    3040// are only listed once.
    namespace Map_Cpp  
    3242static IArray calculate_masked_edges(const IArray &triangles,
    3343                                     const BArray &tmask, const BArray &emask)
    3444{
    35   std::set< std::pair<int,int> > edges;
     45  std::unordered_set< std::pair<int,int>, edge_hash > edges;
    3646
    3747  unsigned char *show_t = (tmask.size() > 0 ? tmask.values() : NULL);
    3848  unsigned char *show_e = (emask.size() > 0 ? emask.values() : NULL);
    3949  int n = triangles.size(0);
     50  edges.max_load_factor(0.75);
     51  edges.reserve(n*2);
     52
    4053  int *tarray = triangles.values();
    4154  for (int k = 0 ; k < n ; ++k, tarray += 3)
    4255    {
    static IArray calculate_masked_edges(const IArray &triangles,  
    5669  int64_t size[2] = {(int64_t)edges.size(), 2};
    5770  IArray masked_edges(2, size);
    5871  int *eiarray = masked_edges.values();
    59   for (std::set< std::pair<int,int> >::iterator ei = edges.begin() ;
     72  for (auto ei = edges.begin() ;
    6073       ei != edges.end() ; ++ei)
    6174    {
    6275      *eiarray = (*ei).first; eiarray += 1;