40 std::unordered_multimap<size_t, std::unique_ptr<Identifier>> table_{};
41#ifdef _AST_ENABLE_IDENTIFIER_TABLE_MUTEX
42 mutable std::mutex mutex_;
46 size_t compute_hash(
const char* data,
size_t length)
const {
47 return Identifier::hash(data, length);
52 Identifier* intern(
const char* data,
size_t length) {
53 size_t hash = compute_hash(data, length);
55#ifdef _AST_ENABLE_IDENTIFIER_TABLE_MUTEX
56 std::lock_guard<std::mutex> lock(mutex_);
59 auto range = table_.equal_range(hash);
60 for (
auto it = range.first; it != range.second; ++it) {
62 if (sym->length() == length &&
63 memcmp(sym->data(), data, length) == 0) {
73 size_t alloc_size =
sizeof(
Identifier) + length;
74 void* memory = ::operator
new(alloc_size);
76 memcpy(sym->data(), data, length);
77 sym->data()[length] =
'\0';
79 table_.emplace(hash, std::unique_ptr<Identifier>(sym));
85 return intern(str, strlen(str));
90 return intern(str.c_str(), str.length());
94 Identifier* lookup(
const char* data,
size_t length)
const {
95 size_t hash = compute_hash(data, length);
97#ifdef _AST_ENABLE_IDENTIFIER_TABLE_MUTEX
98 std::lock_guard<std::mutex> lock(mutex_);
100 auto range = table_.equal_range(hash);
102 for (
auto it = range.first; it != range.second; ++it) {
104 if (sym->length() == length &&
105 memcmp(sym->data(), data, length) == 0) {
114 size_t size()
const {
115#ifdef _AST_ENABLE_IDENTIFIER_TABLE_MUTEX
116 std::lock_guard<std::mutex> lock(mutex_);
118 return table_.size();
123#ifdef _AST_ENABLE_IDENTIFIER_TABLE_MUTEX
124 std::lock_guard<std::mutex> lock(mutex_);