diff --git a/glslang/Include/Common.h b/glslang/Include/Common.h index 468e56c1..88f23400 100644 --- a/glslang/Include/Common.h +++ b/glslang/Include/Common.h @@ -86,16 +86,37 @@ namespace glslang { -// -// Pool version of string. -// -typedef pool_allocator TStringAllocator; -typedef std::basic_string , TStringAllocator> TString; + // + // Pool version of string. + // + typedef pool_allocator TStringAllocator; + typedef std::basic_string , TStringAllocator> TString; + +} // end namespace glslang // Repackage the std::hash for use by unordered map/set with a TString key. -//struct TStringHash { -// size_t operator()(const TString& string) const { return std::hash()(string); } -//}; +namespace std { + + template<> struct hash { + std::size_t operator()(const glslang::TString& s) const + { + const unsigned _FNV_offset_basis = 2166136261U; + const unsigned _FNV_prime = 16777619U; + unsigned _Val = _FNV_offset_basis; + unsigned _Count = s.size(); + const char* _First = s.c_str(); + for (unsigned _Next = 0; _Next < _Count; ++_Next) + { + _Val ^= (unsigned)_First[_Next]; + _Val *= _FNV_prime; + } + + return _Val; + } + }; +} + +namespace glslang { inline TString* NewPoolTString(const char* s) { diff --git a/glslang/MachineIndependent/ParseHelper.h b/glslang/MachineIndependent/ParseHelper.h index 42ea501c..d3a1e113 100644 --- a/glslang/MachineIndependent/ParseHelper.h +++ b/glslang/MachineIndependent/ParseHelper.h @@ -306,8 +306,7 @@ protected: TInputScanner* currentScanner; int numErrors; // number of compile-time errors encountered bool parsingBuiltins; // true if parsing built-in symbols/functions -// need portable TStringHash TUnorderedMap extensionBehavior; // for each extension string, what its current behavior is set to - TMap extensionBehavior; // for each extension string, what its current behavior is set to + TUnorderedMap extensionBehavior; // for each extension string, what its current behavior is set to static const int maxSamplerIndex = EsdNumDims * (EbtNumTypes * (2 * 2 * 2)); // see computeSamplerTypeIndex() TPrecisionQualifier defaultSamplerPrecision[maxSamplerIndex]; bool afterEOF; diff --git a/glslang/MachineIndependent/preprocessor/PpContext.h b/glslang/MachineIndependent/preprocessor/PpContext.h index f35f4515..39f247e3 100644 --- a/glslang/MachineIndependent/preprocessor/PpContext.h +++ b/glslang/MachineIndependent/preprocessor/PpContext.h @@ -192,7 +192,6 @@ public: }; MemoryPool *pool; - // need portable hash typedef TUnorderedMap TSymbolMap; typedef TMap TSymbolMap; TSymbolMap symbols; // this has light use... just defined macros @@ -437,8 +436,7 @@ protected: // // From PpAtom.cpp // - // need portable TStringHash typedef TUnorderedMap TAtomMap; - typedef TMap TAtomMap; + typedef TUnorderedMap TAtomMap; typedef TVector TStringMap; TAtomMap atomMap; TStringMap stringMap;