0033661: Data Exchange, Step Import - Tessellated GDTs are not imported
[occt.git] / src / BRepMesh / BRepMesh_Edge.hxx
index 5a46ebb..c574123 100644 (file)
 #define _BRepMesh_Edge_HeaderFile
 
 #include <Standard.hxx>
-#include <Standard_DefineAlloc.hxx>
-#include <Standard_Macro.hxx>
 #include <BRepMesh_DegreeOfFreedom.hxx>
-
-//! Light weighted structure representing simple link.
-class BRepMesh_OrientedEdge
-{
-public:
-
-  DEFINE_STANDARD_ALLOC
-
-  //! Default constructor.
-  Standard_EXPORT BRepMesh_OrientedEdge()
-    : myFirstNode(-1),
-      myLastNode(-1)
-  {
-  }
-
-  //! Constructs a link between two vertices.
-  Standard_EXPORT BRepMesh_OrientedEdge(
-    const Standard_Integer         theFirstNode,
-    const Standard_Integer         theLastNode)
-    : myFirstNode(theFirstNode),
-      myLastNode(theLastNode)
-  {
-  }
-
-  //! Returns index of first node of the Link.
-  inline Standard_Integer FirstNode() const
-  {
-    return myFirstNode;
-  }
-
-  //! Returns index of last node of the Link.
-  inline Standard_Integer LastNode() const
-  {
-    return myLastNode;
-  }
-
-  //! Returns hash code for this edge.
-  //! @param theUpper upper index in the container.
-  //! @return hash code.
-  Standard_EXPORT Standard_Integer HashCode(const Standard_Integer theUpper) const
-  {
-    return ::HashCode(myFirstNode + myLastNode, theUpper);
-  }
-
-  //! Checks this and other edge for equality.
-  //! @param theOther edge to be checked against this one.
-  //! @retrun TRUE if edges have the same orientation, FALSE if not.
-  inline Standard_Boolean IsEqual(const BRepMesh_OrientedEdge& theOther) const
-  {
-    return (myFirstNode == theOther.myFirstNode && myLastNode == theOther.myLastNode);
-  }
-
-  //! Alias for IsEqual.
-  Standard_Boolean operator ==(const BRepMesh_OrientedEdge& Other) const
-  {
-    return IsEqual(Other);
-  }
-
-private:
-
-  Standard_Integer myFirstNode;
-  Standard_Integer myLastNode;
-};
+#include <BRepMesh_OrientedEdge.hxx>
+#include <Standard_HashUtils.hxx>
 
 //! Light weighted structure representing link of the mesh.
 class BRepMesh_Edge : public BRepMesh_OrientedEdge
@@ -88,14 +25,14 @@ class BRepMesh_Edge : public BRepMesh_OrientedEdge
 public:
 
     //! Default constructor.
-  Standard_EXPORT BRepMesh_Edge()
+  BRepMesh_Edge()
     : BRepMesh_OrientedEdge(),
       myMovability(BRepMesh_Deleted)
   {
   }
 
   //! Constructs a link between two vertices.
-  Standard_EXPORT BRepMesh_Edge(
+  BRepMesh_Edge(
     const Standard_Integer         theFirstNode,
     const Standard_Integer         theLastNode,
     const BRepMesh_DegreeOfFreedom theMovability)
@@ -105,30 +42,30 @@ public:
   }
 
   //! Returns movability flag of the Link.
-  inline BRepMesh_DegreeOfFreedom Movability() const
+  BRepMesh_DegreeOfFreedom Movability() const
   {
     return myMovability;
   }
 
   //! Sets movability flag of the Link.
-  //! \param theMovability flag to be set.
-  inline void SetMovability(const BRepMesh_DegreeOfFreedom theMovability)
+  //! @param theMovability flag to be set.
+  void SetMovability(const BRepMesh_DegreeOfFreedom theMovability)
   {
     myMovability = theMovability;
   }
 
   //! Checks if the given edge and this one have the same orientation.
-  //! \param theOther edge to be checked against this one.
-  //! \retrun TRUE if edges have the same orientation, FALSE if not.
-  inline Standard_Boolean IsSameOrientation(const BRepMesh_Edge& theOther) const
+  //! @param theOther edge to be checked against this one.
+  //! \return TRUE if edges have the same orientation, FALSE if not.
+  Standard_Boolean IsSameOrientation(const BRepMesh_Edge& theOther) const
   {
     return BRepMesh_OrientedEdge::IsEqual(theOther);
   }
 
   //! Checks for equality with another edge.
-  //! \param theOther edge to be checked against this one.
-  //! \return TRUE if equal, FALSE if not.
-  inline Standard_Boolean IsEqual(const BRepMesh_Edge& theOther) const
+  //! @param theOther edge to be checked against this one.
+  //! @return TRUE if equal, FALSE if not.
+  Standard_Boolean IsEqual(const BRepMesh_Edge& theOther) const
   {
     if (myMovability == BRepMesh_Deleted || theOther.myMovability == BRepMesh_Deleted)
       return Standard_False;
@@ -148,16 +85,28 @@ private:
   BRepMesh_DegreeOfFreedom  myMovability;
 };
 
-inline Standard_Integer HashCode(const BRepMesh_OrientedEdge&   theEdge,
-                                 const Standard_Integer         theUpper)
+namespace std
 {
-  return theEdge.HashCode(theUpper);
-}
-
-inline Standard_Integer HashCode(const BRepMesh_Edge&   theEdge,
-                                 const Standard_Integer theUpper)
-{
-  return theEdge.HashCode(theUpper);
+  template <>
+  struct hash<BRepMesh_Edge>
+  {
+    size_t operator()(const BRepMesh_Edge& theEdge) const noexcept
+    {
+      union Combination
+      {
+        unsigned short Arr[2]; // Node can be represented as a short
+        uint32_t Hash;
+
+      } aCombination;
+      aCombination.Arr[0] = static_cast<unsigned short>(theEdge.FirstNode());
+      aCombination.Arr[1] = static_cast<unsigned short>(theEdge.LastNode());
+      if (aCombination.Arr[0] > aCombination.Arr[1])
+      {
+        std::swap(aCombination.Arr[0], aCombination.Arr[1]);
+      }
+      return static_cast<size_t>(aCombination.Hash);
+    }
+  };
 }
 
 #endif