mirror of
https://github.com/YosysHQ/yosys
synced 2025-08-04 10:20:24 +00:00
Make const lookup methods take a lookup path that never rehashes the table.
This avoids the need to cast away `const` and makes these methods thread-compatible.
This commit is contained in:
parent
e57a2b9442
commit
cf9720ecab
1 changed files with 20 additions and 7 deletions
|
@ -451,16 +451,21 @@ class dict {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_lookup(const K &key, Hasher::hash_t &hash) const
|
int do_lookup(const K &key, Hasher::hash_t &hash)
|
||||||
{
|
{
|
||||||
if (hashtable.empty())
|
if (hashtable.empty())
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (entries.size() * hashtable_size_trigger > hashtable.size()) {
|
if (entries.size() * hashtable_size_trigger > hashtable.size()) {
|
||||||
((dict*)this)->do_rehash();
|
do_rehash();
|
||||||
hash = do_hash(key);
|
hash = do_hash(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return do_lookup_internal(key, hash);
|
||||||
|
}
|
||||||
|
|
||||||
|
int do_lookup_internal(const K &key, Hasher::hash_t hash) const
|
||||||
|
{
|
||||||
int index = hashtable[hash];
|
int index = hashtable[hash];
|
||||||
|
|
||||||
while (index >= 0 && !ops.cmp(entries[index].udata.first, key)) {
|
while (index >= 0 && !ops.cmp(entries[index].udata.first, key)) {
|
||||||
|
@ -471,6 +476,14 @@ class dict {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int do_lookup_no_rehash(const K &key, Hasher::hash_t hash) const
|
||||||
|
{
|
||||||
|
if (hashtable.empty())
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return do_lookup_internal(key, hash);
|
||||||
|
}
|
||||||
|
|
||||||
int do_insert(const K &key, Hasher::hash_t &hash)
|
int do_insert(const K &key, Hasher::hash_t &hash)
|
||||||
{
|
{
|
||||||
if (hashtable.empty()) {
|
if (hashtable.empty()) {
|
||||||
|
@ -694,14 +707,14 @@ public:
|
||||||
int count(const K &key) const
|
int count(const K &key) const
|
||||||
{
|
{
|
||||||
Hasher::hash_t hash = do_hash(key);
|
Hasher::hash_t hash = do_hash(key);
|
||||||
int i = do_lookup(key, hash);
|
int i = do_lookup_no_rehash(key, hash);
|
||||||
return i < 0 ? 0 : 1;
|
return i < 0 ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int count(const K &key, const_iterator it) const
|
int count(const K &key, const_iterator it) const
|
||||||
{
|
{
|
||||||
Hasher::hash_t hash = do_hash(key);
|
Hasher::hash_t hash = do_hash(key);
|
||||||
int i = do_lookup(key, hash);
|
int i = do_lookup_no_rehash(key, hash);
|
||||||
return i < 0 || i > it.index ? 0 : 1;
|
return i < 0 || i > it.index ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -717,7 +730,7 @@ public:
|
||||||
const_iterator find(const K &key) const
|
const_iterator find(const K &key) const
|
||||||
{
|
{
|
||||||
Hasher::hash_t hash = do_hash(key);
|
Hasher::hash_t hash = do_hash(key);
|
||||||
int i = do_lookup(key, hash);
|
int i = do_lookup_no_rehash(key, hash);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
return end();
|
return end();
|
||||||
return const_iterator(this, i);
|
return const_iterator(this, i);
|
||||||
|
@ -735,7 +748,7 @@ public:
|
||||||
const T& at(const K &key) const
|
const T& at(const K &key) const
|
||||||
{
|
{
|
||||||
Hasher::hash_t hash = do_hash(key);
|
Hasher::hash_t hash = do_hash(key);
|
||||||
int i = do_lookup(key, hash);
|
int i = do_lookup_no_rehash(key, hash);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
throw std::out_of_range("dict::at()");
|
throw std::out_of_range("dict::at()");
|
||||||
return entries[i].udata.second;
|
return entries[i].udata.second;
|
||||||
|
@ -744,7 +757,7 @@ public:
|
||||||
const T& at(const K &key, const T &defval) const
|
const T& at(const K &key, const T &defval) const
|
||||||
{
|
{
|
||||||
Hasher::hash_t hash = do_hash(key);
|
Hasher::hash_t hash = do_hash(key);
|
||||||
int i = do_lookup(key, hash);
|
int i = do_lookup_no_rehash(key, hash);
|
||||||
if (i < 0)
|
if (i < 0)
|
||||||
return defval;
|
return defval;
|
||||||
return entries[i].udata.second;
|
return entries[i].udata.second;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue