// Created on: 1999-04-08 // Created by: Fabrice SERVANT // Copyright (c) 1999 Matra Datavision // Copyright (c) 1999-2014 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #ifndef _IntPolyh_Couple_HeaderFile #define _IntPolyh_Couple_HeaderFile #include "Standard.hxx" #include "Standard_DefineAlloc.hxx" #include "Standard_Handle.hxx" #include "Standard_Integer.hxx" #include "Standard_Real.hxx" #include "Standard_HashUtils.hxx" //! The class represents the couple of indices with additional //! characteristics such as analyzed flag and an angle. //! In IntPolyh_MaillageAffinage algorithm the class is used as a //! couple of interfering triangles with the intersection angle. class IntPolyh_Couple { public: DEFINE_STANDARD_ALLOC //! Constructor IntPolyh_Couple() : myIndex1(-1), myIndex2(-1), myAnalyzed(false), myAngle(-2.0) { } //! Constructor IntPolyh_Couple(const int theTriangle1, const int theTriangle2, const double theAngle = -2.0) : myIndex1(theTriangle1), myIndex2(theTriangle2), myAnalyzed(false), myAngle(theAngle) { } //! Returns the first index int FirstValue() const { return myIndex1; } //! Returns the second index int SecondValue() const { return myIndex2; } //! Returns TRUE if the couple has been analyzed bool IsAnalyzed() const { return myAnalyzed; } //! Returns the angle double Angle() const { return myAngle; } //! Sets the triangles void SetCoupleValue(const int theInd1, const int theInd2) { myIndex1 = theInd1; myIndex2 = theInd2; } //! Sets the analyzed flag void SetAnalyzed(const bool theAnalyzed) { myAnalyzed = theAnalyzed; } //! Sets the angle void SetAngle(const double theAngle) { myAngle = theAngle; } //! Returns true if the Couple is equal to bool IsEqual(const IntPolyh_Couple& theOther) const { return (myIndex1 == theOther.myIndex1 && myIndex2 == theOther.myIndex2) || (myIndex1 == theOther.myIndex2 && myIndex2 == theOther.myIndex1); } //! Returns true if the Couple is equal to bool operator==(const IntPolyh_Couple& theOther) const { return IsEqual(theOther); } // Dump Standard_EXPORT void Dump(const int v) const; private: int myIndex1; int myIndex2; bool myAnalyzed; double myAngle; }; namespace std { template <> struct hash { size_t operator()(const IntPolyh_Couple& theCouple) const noexcept { // Combine two int values into a single hash value. int aCombination[2]{theCouple.FirstValue(), theCouple.SecondValue()}; if (aCombination[0] > aCombination[1]) { std::swap(aCombination[0], aCombination[1]); } return opencascade::hashBytes(aCombination, sizeof(aCombination)); } }; } // namespace std #endif // _IntPolyh_Couple_HeaderFile