diff --git a/glslang/MachineIndependent/Scan.cpp b/glslang/MachineIndependent/Scan.cpp index 23e5191f..71072be4 100644 --- a/glslang/MachineIndependent/Scan.cpp +++ b/glslang/MachineIndependent/Scan.cpp @@ -293,10 +293,33 @@ int yylex(YYSTYPE* glslangTokenDesc, glslang::TParseContext& parseContext) namespace { +struct str_eq +{ + bool operator()(const char* lhs, const char* rhs) const + { + return strcmp(lhs, rhs) == 0; + } +}; + +struct str_hash +{ + size_t operator()(const char* str) const + { + // djb2 + unsigned long hash = 5381; + int c; + + while (c = *str++) + hash = ((hash << 5) + hash) + c; + + return hash; + } +}; + // A single global usable by all threads, by all versions, by all languages. // After a single process-level initialization, this is read only and thread safe -std::unordered_map* KeywordMap = nullptr; -std::unordered_set* ReservedSet = nullptr; +std::unordered_map* KeywordMap = nullptr; +std::unordered_set* ReservedSet = nullptr; }; @@ -309,7 +332,7 @@ void TScanContext::fillInKeywordMap() // but, the only risk is if two threads called simultaneously return; } - KeywordMap = new std::unordered_map; + KeywordMap = new std::unordered_map; (*KeywordMap)["const"] = CONST; (*KeywordMap)["uniform"] = UNIFORM; @@ -478,7 +501,7 @@ void TScanContext::fillInKeywordMap() (*KeywordMap)["resource"] = RESOURCE; (*KeywordMap)["superp"] = SUPERP; - ReservedSet = new std::unordered_set; + ReservedSet = new std::unordered_set; ReservedSet->insert("common"); ReservedSet->insert("partition");