예제 #1
0
int main()
{
	String * myKey, *myKey2, *myValue, *tmpString;
	List * keys; 
	ListIterator * iterator;
	HashTable * table = HashTable_create(500);

	myKey = String_create("Mia");
	myKey2 = String_create("Russell");
	myValue = String_create("shrug");

	HashTable_setValue(table, myKey, String_copy(myValue));
	HashTable_setValue(table, myKey2, String_copy(myValue));

	String_destroy(myValue);

	keys = HashTable_getKeys(table);

	iterator = ListIterator_create(keys);
	tmpString = ListIterator_seekToFirst(iterator);

	while(tmpString != NULL)
	{
		myValue = HashTable_removeValue(table, tmpString);
		printf("Removed -> %s\n", String_c(myValue));
		String_destroy(myValue);
		tmpString = ListIterator_seekToFirst(iterator);
	}

	ListIterator_destroy(iterator);

	String_destroy(myKey);
	String_destroy(myKey2);

	HashTable_destroy(table);
	return 0;
}
예제 #2
0
void testHashTable() {
    typedef struct {
        uint64 key;
        uint64 data;
    } TestData;

    int initialCapacity = 1000;
    int numEntries = 5000;

    // make hash table
    HashTable htb = HashTable_make(sizeof(uint64), sizeof(uint64), initialCapacity);

    // insert data, and some duplicates
    TestData entries[numEntries];
    int i;
    for (i = 0; i < numEntries; i++) {
        entries[i].key = rand();
        entries[i].data = rand();
        HashTable_insert(&htb, &(entries[i].key), &(entries[i].data));
        
        // insert a previous duplicate
        if (i > 10) {
            HashTable_insert(&htb, &(entries[i-10].key), &(entries[i-10].data));
        }

        assert(HashTable_size(&htb) == i+1);
        assert(HashTable_capacity(&htb) > i);
    }

    // check data
    for (i = 0; i < numEntries; i++) {
        uint64 *data = (uint64*)HashTable_get(&htb, &(entries[i].key));
        assert(data != NULL);
        assert(*data == entries[i].data);
    }
    assert(HashTable_size(&htb) == numEntries);
    assert(HashTable_capacity(&htb) >= numEntries);

    // remove and re-insert some elements
    int numRemoved = 0;
    for (i = 0; i < numEntries; i = i + 2) {
        HashTable_delete(&htb, &(entries[i].key));
        numRemoved++;
        assert(HashTable_size(&htb) == numEntries - numRemoved);
        assert(HashTable_get(&htb, &(entries[i].key)) == NULL);
    }
    for (i = 0; i < numEntries; i = i + 2) {
        HashTable_insert(&htb, &(entries[i].key), &(entries[i].data));
        numRemoved--;
        assert(HashTable_size(&htb) == numEntries - numRemoved);
        assert(HashTable_get(&htb, &(entries[i].key)) != NULL);
    }

    // save to file, destroy, and recreate from file
    char *filename = "/tmp/roomyTestHashTable";
    HashTable_fileSave(&htb, filename);
    HashTable_destroy(&htb);
    htb = HashTable_makeFromFiles(filename);
    for (i = 0; i < numEntries; i++) {
        uint64 *data = (uint64*)HashTable_get(&htb, &(entries[i].key));
        assert(data != NULL);
        assert(*data == entries[i].data);
    }
    assert(HashTable_size(&htb) == numEntries);
    assert(HashTable_capacity(&htb) >= numEntries);
    HashTable_destroy(&htb);

    // make using mmap
    htb = HashTable_makeMapped(filename);
    for (i = 0; i < numEntries; i++) {
        uint64 *data = (uint64*)HashTable_get(&htb, &(entries[i].key));
        assert(data != NULL);
        assert(*data == entries[i].data);
    }
    assert(HashTable_size(&htb) == numEntries);
    assert(HashTable_capacity(&htb) >= numEntries);
    HashTable_destroy(&htb);
    assert(HashTable_removeFiles(filename) == 0);

    printf("HASH TABLE PASSED TESTS\n");
}