39 std::unordered_multimap<size_t, std::unique_ptr<Identifier>> table_;
40#ifdef _AST_ENABLE_IDENTIFIER_TABLE_MUTEX
41 mutable std::mutex mutex_;
45 size_t compute_hash(
const char* data,
size_t length)
const {
46 return Identifier::hash(data, length);
51 Identifier* intern(
const char* data,
size_t length) {
52 size_t hash = compute_hash(data, length);
54#ifdef _AST_ENABLE_IDENTIFIER_TABLE_MUTEX
55 std::lock_guard<std::mutex> lock(mutex_);
58 auto range = table_.equal_range(hash);
59 for (
auto it = range.first; it != range.second; ++it) {
61 if (sym->length() == length &&
62 memcmp(sym->data(), data, length) == 0) {
69 size_t alloc_size =
sizeof(
Identifier) + length;
70 char* memory =
new char[alloc_size];
72 memcpy(sym->data(), data, length);
73 sym->data()[length] =
'\0';
75 table_.emplace(hash, std::unique_ptr<Identifier>(sym));
81 return intern(str, strlen(str));
86 return intern(str.c_str(), str.length());
90 Identifier* lookup(
const char* data,
size_t length)
const {
91 size_t hash = compute_hash(data, length);
93#ifdef _AST_ENABLE_IDENTIFIER_TABLE_MUTEX
94 std::lock_guard<std::mutex> lock(mutex_);
96 auto range = table_.equal_range(hash);
98 for (
auto it = range.first; it != range.second; ++it) {
100 if (sym->length() == length &&
101 memcmp(sym->data(), data, length) == 0) {
110 size_t size()
const {
111#ifdef _AST_ENABLE_IDENTIFIER_TABLE_MUTEX
112 std::lock_guard<std::mutex> lock(mutex_);
114 return table_.size();
119#ifdef _AST_ENABLE_IDENTIFIER_TABLE_MUTEX
120 std::lock_guard<std::mutex> lock(mutex_);