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; }
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"); }