Avoid creation of temporary std::string when looking up keywords and reserved words

This commit is contained in:
Maxime Coste 2015-11-11 17:38:31 +00:00
parent 1c77f3a8d2
commit 29051bd148

View File

@ -293,10 +293,33 @@ int yylex(YYSTYPE* glslangTokenDesc, glslang::TParseContext& parseContext)
namespace { 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. // 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 // After a single process-level initialization, this is read only and thread safe
std::unordered_map<std::string, int>* KeywordMap = nullptr; std::unordered_map<const char*, int, str_hash, str_eq>* KeywordMap = nullptr;
std::unordered_set<std::string>* ReservedSet = nullptr; std::unordered_set<const char*, str_hash, str_eq>* ReservedSet = nullptr;
}; };
@ -309,7 +332,7 @@ void TScanContext::fillInKeywordMap()
// but, the only risk is if two threads called simultaneously // but, the only risk is if two threads called simultaneously
return; return;
} }
KeywordMap = new std::unordered_map<std::string, int>; KeywordMap = new std::unordered_map<const char*, int, str_hash, str_eq>;
(*KeywordMap)["const"] = CONST; (*KeywordMap)["const"] = CONST;
(*KeywordMap)["uniform"] = UNIFORM; (*KeywordMap)["uniform"] = UNIFORM;
@ -478,7 +501,7 @@ void TScanContext::fillInKeywordMap()
(*KeywordMap)["resource"] = RESOURCE; (*KeywordMap)["resource"] = RESOURCE;
(*KeywordMap)["superp"] = SUPERP; (*KeywordMap)["superp"] = SUPERP;
ReservedSet = new std::unordered_set<std::string>; ReservedSet = new std::unordered_set<const char*, str_hash, str_eq>;
ReservedSet->insert("common"); ReservedSet->insert("common");
ReservedSet->insert("partition"); ReservedSet->insert("partition");