#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
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)
}
//! 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;
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