Avoid creation of temporary std::string when looking up keywords and reserved words
This commit is contained in:
parent
1c77f3a8d2
commit
29051bd148
@ -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");
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user