0030720: Coding - fix HashCode() function problems that are not resolved with 30550
[occt.git] / src / Standard / Standard_Size.hxx
CommitLineData
b311480e 1// Created on: 2006-08-22
2// Created by: Alexander GRIGORIEV
973c2be1 3// Copyright (c) 2006-2014 OPEN CASCADE SAS
b311480e 4//
973c2be1 5// This file is part of Open CASCADE Technology software library.
b311480e 6//
d5f74e42 7// This library is free software; you can redistribute it and/or modify it under
8// the terms of the GNU Lesser General Public License version 2.1 as published
973c2be1 9// by the Free Software Foundation, with special exception defined in the file
10// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11// distribution for complete text of the license and disclaimer of any warranty.
b311480e 12//
973c2be1 13// Alternatively, this file may be used under the terms of Open CASCADE
14// commercial license or contractual agreement.
7fd59977 15
16#ifndef _Standard_Size_HeaderFile
17#define _Standard_Size_HeaderFile
18
2b2be3fb 19#include <Standard_Integer.hxx>
20
7fd59977 21// msv 26.05.2009: add HashCode and IsEqual functions
22
2b2be3fb 23//! Computes a hash code for the given value of the Standard_Size type, in the range [1, theUpperBound]
467e864a 24//! @tparam TheSize the type of the given value (it is Standard_Size,
25//! and must not be the same as "unsigned int", because the overload of the HashCode function
26//! for "unsigned int" type is already presented in Standard_Integer.hxx)
2b2be3fb 27//! @param theValue the value of the Standard_Size type which hash code is to be computed
28//! @param theUpperBound the upper bound of the range a computing hash code must be within
29//! @return a computed hash code, in the range [1, theUpperBound]
467e864a 30template <typename TheSize>
31typename opencascade::std::enable_if<!opencascade::std::is_same<Standard_Size, unsigned int>::value
32 && opencascade::std::is_same<TheSize, Standard_Size>::value,
33 Standard_Integer>::type
34HashCode (const TheSize theValue, const Standard_Integer theUpperBound)
7fd59977 35{
2b2be3fb 36 Standard_Size aKey = ~theValue + (theValue << 18);
7fd59977 37 aKey ^= (aKey >> 31);
38 aKey *= 21;
39 aKey ^= (aKey >> 11);
40 aKey += (aKey << 6);
41 aKey ^= (aKey >> 22);
2b2be3fb 42 return IntegerHashCode(aKey, IntegerLast(), theUpperBound);
7fd59977 43}
44
45// ------------------------------------------------------------------
46// IsEqual : Returns Standard_True if two values are equal
47// ------------------------------------------------------------------
48inline Standard_Boolean IsEqual(const Standard_Size One,
49 const Standard_Size Two)
50{
51 return One == Two;
52}
53
54#endif