summaryrefslogtreecommitdiffstats
path: root/src/objcache.cpp
diff options
context:
space:
mode:
authordimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2006-10-04 20:28:41 (GMT)
committerdimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2006-10-04 20:28:41 (GMT)
commit3c8148441a129febc5c2b9e4b2b2cbd018ad3b6e (patch)
treed2526ce0c99b1f268769fd8bd1c56e6dda83fd7f /src/objcache.cpp
parentc844985adde0459f1f01ed00d0a289591fbcd2af (diff)
downloadDoxygen-3c8148441a129febc5c2b9e4b2b2cbd018ad3b6e.zip
Doxygen-3c8148441a129febc5c2b9e4b2b2cbd018ad3b6e.tar.gz
Doxygen-3c8148441a129febc5c2b9e4b2b2cbd018ad3b6e.tar.bz2
Release-1.4.7-20061004
Diffstat (limited to 'src/objcache.cpp')
-rw-r--r--src/objcache.cpp33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/objcache.cpp b/src/objcache.cpp
index c192504..63e7eb7 100644
--- a/src/objcache.cpp
+++ b/src/objcache.cpp
@@ -176,16 +176,31 @@ void ObjCache::moveToFront(int index)
unsigned int ObjCache::hash(void *addr)
{
- // Thomas Wang's 32 bit Mix Function
+ static bool isPtr64 = sizeof(addr)==8 && sizeof(long)==8;
- // TODO: what if sizeof(void*)!=4 ?
- unsigned int key = (unsigned int)addr;
- key += ~(key << 15);
- key ^= (key >> 10);
- key += (key << 3);
- key ^= (key >> 6);
- key += ~(key << 11);
- key ^= (key >> 16);
+ unsigned long key = (unsigned long)addr;
+ if (isPtr64)
+ {
+ // Thomas Wang's 64 bit Mix Function
+ key += ~(key << 32);
+ key ^= (key >> 22);
+ key += ~(key << 13);
+ key ^= (key >> 8);
+ key += (key << 3);
+ key ^= (key >> 15);
+ key += ~(key << 27);
+ key ^= (key >> 31);
+ }
+ else
+ {
+ // Thomas Wang's 32 bit Mix Function
+ key += ~(key << 15);
+ key ^= (key >> 10);
+ key += (key << 3);
+ key ^= (key >> 6);
+ key += ~(key << 11);
+ key ^= (key >> 16);
+ }
return key & (m_size-1);
}