Ticket #6243: mesh_edges.cpp.diff

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

Replaced set with size_t vector sort and unique

  • 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..93b8202a1 100644
    a b  
    1313 * === UCSF ChimeraX Copyright ===
    1414 */
    1515
    16 #include <set>                          // use std::set
     16#include <vector>
     17#include <algorithm>
     18#include <functional>
    1719
    1820#include <arrays/pythonarray.h>         // use array_from_python()
    1921#include <arrays/rcarray.h>             // use Numeric_Array, Array<T>
     
    2527namespace Map_Cpp
    2628{
    2729
     30static_assert(sizeof(int) * 2 == sizeof(size_t), "Size of int is not half of size_t - hash needs a re-think!");
     31
     32
     33size_t edge_hash (int i0, int i1) noexcept
     34{
     35  return ((size_t)i0 << 32 | i1);
     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
     46  std::vector< size_t > edges;
    3647
    3748  unsigned char *show_t = (tmask.size() > 0 ? tmask.values() : NULL);
    3849  unsigned char *show_e = (emask.size() > 0 ? emask.values() : NULL);
    39   int n = triangles.size(0);
     50  size_t n = triangles.size(0);
     51
    4052  int *tarray = triangles.values();
    4153  for (int k = 0 ; k < n ; ++k, tarray += 3)
    4254    {
    static IArray calculate_masked_edges(const IArray &triangles,  
    4759            if (ebits & (EDGE0_DISPLAY_MASK << j))
    4860              {
    4961                int i0 = tarray[j], i1 = tarray[(j+1)%3];
    50                 edges.insert(i0 < i1 ? std::pair<int,int>(i0, i1) :
    51                              std::pair<int,int>(i1, i0));
     62                edges.push_back(i0 < i1 ? edge_hash(i0, i1) : edge_hash(i1, i0));
    5263              }
    5364        }
    5465    }
     66  std::sort(edges.begin(), edges.end());
     67  auto last = std::unique(edges.begin(), edges.end());
     68  edges.erase(last, edges.end());
     69
    5570
    5671  int64_t size[2] = {(int64_t)edges.size(), 2};
    5772  IArray masked_edges(2, size);
    5873  int *eiarray = masked_edges.values();
    59   for (std::set< std::pair<int,int> >::iterator ei = edges.begin() ;
     74  for (auto ei = edges.begin() ;
    6075       ei != edges.end() ; ++ei)
    6176    {
    62       *eiarray = (*ei).first; eiarray += 1;
    63       *eiarray = (*ei).second; eiarray += 1;
     77      auto i0 = (*ei)>>32;
     78      auto i1 = (*ei)&0x00000000FFFFFFFF;
     79      *eiarray = i0; eiarray += 1;
     80      *eiarray = i1; eiarray += 1;
    6481    }
    6582
    6683  return masked_edges;