Bugfix: 32-bit port
[foam-extend-3.2.git] / src / foam / primitives / hashes / Hash / Hash.H
blob96b6d453c1951cef79b033b703cefb36536c2259
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Class
25     Foam::Hash
27 Description
28     Hash function class for primitives.  All non-primitives used to hash
29     entries on hash tables likely need a specialized version of this class.
31 \*---------------------------------------------------------------------------*/
33 #ifndef Hash_H
34 #define Hash_H
36 #include <inttypes.h>
38 #include "label.H"
39 #include "uLabel.H"
40 #include "Hasher.H"
41 #include "pTraits.H"
43 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
45 namespace Foam
48 /*---------------------------------------------------------------------------*\
49                             Class Hash Declaration
50 \*---------------------------------------------------------------------------*/
52 template<class PrimitiveType>
53 class Hash
55 public:
57     Hash()
58     {}
60     unsigned operator()(const PrimitiveType& p, unsigned seed) const
61     {
62         return Hasher(&p, sizeof(p), seed);
63     }
65     unsigned operator()(const PrimitiveType& p) const
66     {
67         return Hasher(&p, sizeof(p));
68     }
73 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
75 //- Hash specialization for hashing labels
76 template<>
77 class Hash<label>
79 public:
81     Hash()
82     {}
84     //- Incrementally hash a label.
85     //  This will necessarily return a different value than the
86     //  non-incremental version.
87     unsigned operator()(const label& p, unsigned seed) const
88     {
89         return Hasher(&p, sizeof(label), seed);
90     }
92     //- Return the unsigned representation of a label.
93     //  This helps if people have relied on the hash value corresponding to
94     //  the natural order.
95     unsigned operator()(const label& p) const
96     {
97         return p;
98     }
102 //- Hash specialization for hashing pointer addresses.
103 //  Treat a pointer like a intptr_t.
104 //  This should work for both 32-bit and 64-bit pointers.
105 template<>
106 class Hash<void*>
108 public:
110     Hash()
111     {}
113     unsigned operator()(const void* const& p, unsigned seed) const
114     {
115         return Hash<intptr_t>()(intptr_t(p), seed);
116     }
118     unsigned operator()(const void* const& p) const
119     {
120         return Hash<intptr_t>()(intptr_t(p));
121     }
126 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
128 } // End namespace Foam
130 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
132 #endif
134 // ************************************************************************* //