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 |
30 | template <typename TheSize> |
31 | typename 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 |
34 | HashCode (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 | // ------------------------------------------------------------------ |
48 | inline Standard_Boolean IsEqual(const Standard_Size One, |
49 | const Standard_Size Two) |
50 | { |
51 | return One == Two; |
52 | } |
53 | |
54 | #endif |