#undef NDEBUG
#include <stdio.h>
#include <stdint.h>
#include <assert.h>
#include "hashtable.h"
typedef int mykey_t;
void mykey_init(mykey_t *k, int i)
{
*k = (i / 2) * (i / 2);
}
int mykey_hash(const mykey_t *k)
{
return *k;
}
int mykey_cmp(mykey_t *k, const mykey_t *o)
{
return *k - *o;
}
typedef struct myentry {
mykey_t key;
int value;
} myentry_t;
void myentry_init(myentry_t *e, int i)
{
mykey_init(&e->key, i);
e->value = i;
}
typedef struct mymatch {
mykey_t key;
int value;
int source;
} mymatch_t;
void mymatch_init(mymatch_t *m, int i)
{
mykey_init(&m->key, i);
m->value = 0;
m->source = i;
}
int mymatch_cmp(mymatch_t *m, const myentry_t *e)
{
int ans = mykey_cmp(&m->key, &e->key);
if (ans == 0) {
if (m->value != m->source)
m->value = m->source;
ans = m->value - e->value;
}
return ans;
}
#define ENTRY mykey
#include "hashtable.h"
#define ENTRY myentry
#define KEY mykey
#define MATCH mymatch
#define NAME myhashtable
#include "hashtable.h"
int main(int argc, char **argv)
{
hashtable_t *kt;
int ki;
mykey_t k1, k2;
mykey_init(&k1, 1);
mykey_init(&k2, 2);
assert((kt = mykey_hashtable_new(16)) != NULL);
assert(mykey_hashtable_add(kt, &k1) == &k1);
assert(mykey_hashtable_find(kt, &k1) == &k1);
assert(mykey_hashtable_find(kt, &k2) == NULL);
assert(mykey_hashtable_iter(kt, &ki) == &k1);
assert(mykey_hashtable_next(kt, &ki) == NULL);
hashtable_t *t;
myentry_t entry[256];
myentry_t e;
mymatch_t m;
int i;
myentry_init(&e, 0);
for (i = 0; i < 256; i++)
myentry_init(&entry[i], i);
t = myhashtable_new(256);
assert(t->size == 512);
assert(t->count == 0);
assert(t->etable != NULL);
assert(t->ktable != NULL);
assert(myhashtable_add(t, &e) == &e);
assert(myhashtable_add(t, &entry[0]) == &entry[0]);
for (i = 0; i < 256; i++)
assert(myhashtable_add(t, &entry[i]) == &entry[i]);
assert(t->count == 258);
mymatch_init(&m, 0);
assert(myhashtable_find(t, &m) == &e);
assert(m.value == m.source);
for (i = 1; i < 256; i++) {
mymatch_init(&m, i);
assert(myhashtable_find(t, &m) == &entry[i]);
assert(m.value == m.source);
}
mymatch_init(&m, 256);
assert(myhashtable_find(t, &m) == NULL);
assert(m.value == 0);
#ifndef HASHTABLE_NSTATS
assert(t->find_count == 257);
assert(t->match_count == 256);
assert(t->hashcmp_count >= 256);
assert(t->entrycmp_count >= 256);
myhashtable_stats_init(t);
assert(t->find_count == 0);
assert(t->match_count == 0);
assert(t->hashcmp_count == 0);
assert(t->entrycmp_count == 0);
#endif
myentry_t *p;
int iter;
int count = 0;
for (p = myhashtable_iter(t, &iter); p != NULL;
p = myhashtable_next(t, &iter)) {
assert(p == &e || (&entry[0] <= p && p <= &entry[255]));
count++;
}
assert(count == 258);
myhashtable_free(t);
return 0;
}