summaryrefslogtreecommitdiff
path: root/src/gallium/state_trackers/d3d1x/d3d1xstutil
diff options
context:
space:
mode:
authorLuca Barbieri <luca@luca-barbieri.com>2010-09-21 22:08:37 +0200
committerLuca Barbieri <luca@luca-barbieri.com>2010-09-21 22:16:52 +0200
commit82c346673a78e6cc32e7a1451f2b127128246ef3 (patch)
treead34065ad55bbe5cc445ec421f594a6ed7f8f94f /src/gallium/state_trackers/d3d1x/d3d1xstutil
parent1bcdc504d10b7776cc96d63efd9e9432a66a2a90 (diff)
d3d1x: fix build with compilers other than GCC 4.5
There was some libstdc++-specific code that would only build with GCC 4.5 Now it should be much more compatible, at the price of reimplementing the generic hash function.
Diffstat (limited to 'src/gallium/state_trackers/d3d1x/d3d1xstutil')
-rw-r--r--src/gallium/state_trackers/d3d1x/d3d1xstutil/include/d3d1xstutil.h40
1 files changed, 33 insertions, 7 deletions
diff --git a/src/gallium/state_trackers/d3d1x/d3d1xstutil/include/d3d1xstutil.h b/src/gallium/state_trackers/d3d1x/d3d1xstutil/include/d3d1xstutil.h
index f79cc72a5d..ab195f1af8 100644
--- a/src/gallium/state_trackers/d3d1x/d3d1xstutil/include/d3d1xstutil.h
+++ b/src/gallium/state_trackers/d3d1x/d3d1xstutil/include/d3d1xstutil.h
@@ -748,21 +748,48 @@ static inline bool operator !=(const c_string& a, const c_string& b)
return strcmp(a.p, b.p);
}
-#ifdef __GLIBCXX__
+static inline size_t raw_hash(const char* p, size_t size)
+{
+ size_t res;
+ if(sizeof(size_t) >= 8)
+ res = (size_t)14695981039346656037ULL;
+ else
+ res = (size_t)2166136261UL;
+ const char* end = p + size;
+ for(; p != end; ++p)
+ {
+ res ^= (size_t)*p++;
+ if(sizeof(size_t) >= 8)
+ res *= (size_t)1099511628211ULL;
+ else
+ res *= (size_t)16777619UL;
+ }
+ return res;
+};
+
+template<typename T>
+static inline size_t raw_hash(const T& t)
+{
+ return raw_hash((const char*)&t, sizeof(t));
+}
+
+// TODO: only tested with the gcc libstdc++, might not work elsewhere
namespace std
{
+#ifndef _MSC_VER
namespace tr1
{
+#endif
template<>
inline size_t hash<GUID>::operator()(GUID __val) const
{
- return _Fnv_hash::hash(__val);
+ return raw_hash(__val);
}
template<>
inline size_t hash<c_string>::operator()(c_string __val) const
{
- return _Fnv_hash::hash(__val.p, strlen(__val.p));
+ return raw_hash(__val.p, strlen(__val.p));
}
template<typename T, typename U>
@@ -777,13 +804,12 @@ namespace std
std::pair<size_t, size_t> p;
p.first = hash<T>()(__val.first);
p.second = hash<U>()(__val.second);
- return _Fnv_hash::hash(p);
+ return raw_hash(p);
}
+#ifndef _MSC_VER
}
-}
-#else
-#warning "You probably need to add a pair, C string and GUID hash implementation for your C++ library"
#endif
+}
template<typename Base, typename RefCnt = refcnt_t>
struct GalliumPrivateDataComObject : public GalliumComObject<Base, RefCnt>