You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
1.7 KiB
C
98 lines
1.7 KiB
C
#include <assert.h>
|
|
#include <stdint.h>
|
|
|
|
static int compare(const void *i1, uint32_t i2)
|
|
{
|
|
return ((uint32_t)(uintptr_t)i1) == i2;
|
|
}
|
|
|
|
static uint32_t hash_int(uint32_t i)
|
|
{
|
|
return i;
|
|
}
|
|
static uint32_t hash_key(const void *i)
|
|
{
|
|
return hash_int((uint32_t)(uintptr_t)i);
|
|
}
|
|
|
|
static int is_null(uint32_t i)
|
|
{
|
|
return i == 0;
|
|
}
|
|
|
|
#define MAP_TABLE_NAME test
|
|
#define MAP_TABLE_COMPARE_FUNCTION compare
|
|
#define MAP_TABLE_VALUE_TYPE uint32_t
|
|
#define MAP_TABLE_VALUE_PLACEHOLDER 0
|
|
#define MAP_TABLE_VALUE_NULL is_null
|
|
#define MAP_TABLE_HASH_KEY hash_key
|
|
#define MAP_TABLE_HASH_VALUE hash_int
|
|
#define MAP_TABLE_SINGLE_THREAD 1
|
|
#define MAP_TABLE_NO_LOCK 1
|
|
|
|
#include "../hash_table.h"
|
|
|
|
static test_table *table;
|
|
|
|
|
|
void check_table()
|
|
{
|
|
int count = 0;
|
|
for (int i=0 ; i<table->table_size ; i++)
|
|
{
|
|
struct test_table_cell_struct *s = &table->table[i];
|
|
uint32_t v = ((uint32_t)s->value);
|
|
if (v != 0)
|
|
{
|
|
count++;
|
|
assert(v == test_table_get(table, (void*)(uintptr_t)v));
|
|
}
|
|
else
|
|
{
|
|
assert(s->secondMaps == 0);
|
|
}
|
|
}
|
|
assert(count == table->table_used);
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
test_initialize(&table, 128);
|
|
const int step = 2;
|
|
// 10 iterations was enough to hit the failing case previously. For
|
|
// extra paranoia, we can run this test a lot.
|
|
const int max =
|
|
#ifdef SLOW_TESTS
|
|
8096;
|
|
#else
|
|
10;
|
|
#endif
|
|
for (int seed = 0 ; seed < max ; seed++)
|
|
{
|
|
fprintf(stderr, "Seed: %d\n", seed);
|
|
srand(seed);
|
|
for (uint32_t i=1 ; i<5000 ; i+=step)
|
|
{
|
|
int x = rand();
|
|
if (x == 0)
|
|
{
|
|
continue;
|
|
}
|
|
test_insert(table, x);
|
|
check_table();
|
|
}
|
|
srand(seed);
|
|
for (uint32_t i=1 ; i<5000 ; i+=step)
|
|
{
|
|
int x = rand();
|
|
if (x == 0)
|
|
{
|
|
continue;
|
|
}
|
|
test_remove(table, (void*)(uintptr_t)x);
|
|
check_table();
|
|
}
|
|
assert(table->table_used == 0);
|
|
}
|
|
}
|