Remove hashtable

FossilOrigin-Name: 67c14216600680678ab5dc15b2b1edaef586067c22b784b4bcea6b4221883d50
This commit is contained in:
Jonathan Schleifer 2025-03-04 01:01:30 +00:00
parent e45c8234e8
commit 7259232e13

View file

@ -317,71 +317,6 @@ template <class T> struct vector {
} else \ } else \
for (int i = (v).length() - 1; i >= 0; i--) for (int i = (v).length() - 1; i >= 0; i--)
template <class T> struct hashtable {
struct chain {
chain *next;
const char *key;
T data;
};
int size;
int numelems;
chain **table;
pool *parent;
chain *enumc;
hashtable()
{
this->size = 1 << 10;
this->parent = gp();
numelems = 0;
table = (chain **)parent->alloc(size * sizeof(T));
for (int i = 0; i < size; i++)
table[i] = NULL;
};
hashtable(hashtable<T> &v);
void operator=(hashtable<T> &v);
T *
access(const char *key, T *data = NULL)
{
unsigned int h = 5381;
for (int i = 0, k; k = key[i]; i++)
h = ((h << 5) + h) ^ k; // bernstein k=33 xor
h = h & (size - 1); // primes not much of an advantage
for (chain *c = table[h]; c; c = c->next) {
char ch;
for (const char *p1 = key, *p2 = c->key;
(ch = *p1++) == *p2++;)
if (!ch) // if(strcmp(key,c->key)==0)
{
T *d = &c->data;
if (data)
c->data = *data;
return d;
}
}
if (data) {
chain *c = (chain *)parent->alloc(sizeof(chain));
c->data = *data;
c->key = key;
c->next = table[h];
table[h] = c;
numelems++;
}
return NULL;
}
};
#define enumerate(ht, t, e, b) \
loopi(ht->size) for (ht->enumc = ht->table[i]; ht->enumc; \
ht->enumc = ht->enumc->next) \
{ \
t e = &ht->enumc->data; \
b; \
}
inline char * inline char *
newstring(const char *s) newstring(const char *s)
{ {