Reviewed by Darin.
[WebKit-https.git] / JavaScriptCore / kxmlcore / HashFunctions.h
1 // -*- mode: c++; c-basic-offset: 4 -*-
2 /*
3  * This file is part of the KDE libraries
4  * Copyright (C) 2005 Apple Computer, Inc.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB.  If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  *
21  */
22
23 #ifndef KXMLCORE_HASH_FUNCTIONS_H
24 #define KXMLCORE_HASH_FUNCTIONS_H
25
26 #include <stdint.h>
27
28 #include "RefPtr.h"
29
30 namespace KXMLCore {
31
32     template<typename T> class DefaultHash;
33
34     template<int size> unsigned pointerHash(void *pointer);
35
36     // Thomas Wang's 32 bit mix
37     // http://www.cris.com/~Ttwang/tech/inthash.htm
38     template<> inline unsigned pointerHash<4>(void *pointer) 
39     {
40         uint32_t key = static_cast<uint32_t>(reinterpret_cast<uintptr_t>(pointer));
41         key += ~(key << 15);
42         key ^= (key >> 10);
43         key += (key << 3);
44         key ^= (key >> 6);
45         key += ~(key << 11);
46         key ^= (key >> 16);
47         return key;
48     }
49     
50     // Thomas Wang's 64 bit mix
51     // http://www.cris.com/~Ttwang/tech/inthash.htm
52     template<> inline unsigned pointerHash<8>(void *pointer)
53     {
54         uint64_t key = reinterpret_cast<uint64_t>(pointer);
55         key += ~(key << 32);
56         key ^= (key >> 22);
57         key += ~(key << 13);
58         key ^= (key >> 8);
59         key += (key << 3);
60         key ^= (key >> 15);
61         key += ~(key << 27);
62         key ^= (key >> 31);
63         return key;
64     }
65
66     // pointer identity hash - default for pointer types that don't
67     // explicitly specialize otherwise; also should work for integer
68     // types
69     template<typename T> struct PtrHash {
70         static unsigned hash(T key) { return pointerHash<sizeof(void *)>((void *)key); }
71         static bool equal(T a, T b) { return a == b; }
72     };
73
74     template<typename P> struct PtrHash<RefPtr<P> > {
75         static unsigned hash(const RefPtr<P>& key) { return  pointerHash<sizeof(void *)>((void *)key.get()); }
76         static bool equal(const RefPtr<P>& a, const RefPtr<P>& b) { return a == b; }
77     };
78
79     template<typename P> struct DefaultHash<P *> {
80         typedef PtrHash<P *> Hash;
81     };
82
83     template<> struct DefaultHash<int> {
84         typedef PtrHash<int> Hash;
85     };
86     
87 } // namespace KXMLCore
88
89 using KXMLCore::DefaultHash;
90 using KXMLCore::PtrHash;
91
92 #endif // KXLMCORE_HASH_FUNCTIONS_H