Skip to content

Commit 865b51a

Browse files
committed
Map fixes
1 parent 40b7ca2 commit 865b51a

File tree

3 files changed

+73
-23
lines changed

3 files changed

+73
-23
lines changed

include/map_t.h

+1
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,6 @@ map_t* map_create_simple(float load_factor, size_t key_size, comparator cmp, dto
3838
void map_put(map_t* map, void* key, void* value);
3939
void* map_get(map_t* map, void* key);
4040
void* map_delete(map_t* map, void* key);
41+
void map_destroy(map_t* map);
4142

4243
#endif

src/map_t.c

+61-21
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,41 @@ uint32_t djb2(void* key, size_t size)
3434
return hash;
3535
}
3636

37+
void map_entry_destroy(map_entry_t* entry)
38+
{
39+
if(entry != NULL) {
40+
free(entry);
41+
}
42+
}
43+
44+
void map_bucket_destroy(map_t* map, llist_t* bucket)
45+
{
46+
llist_node_t* node = NULL;
47+
map_entry_t* entry = NULL;
48+
node = bucket->head;
49+
while(node != NULL) {
50+
entry = (map_entry_t*) node->value;
51+
if(map->destructor != NULL) {
52+
map->destructor(entry->value);
53+
}
54+
map_entry_destroy(entry);
55+
node->value = NULL;
56+
node = node->next;
57+
}
58+
llist_destroy(bucket);
59+
}
60+
61+
void map_destroy(map_t* map)
62+
{
63+
int i;
64+
if(map->buckets != NULL) {
65+
for(i = 0; i < map->num_buckets; i++) {
66+
map_bucket_destroy(map, map->buckets[i]);
67+
}
68+
free(map->buckets);
69+
}
70+
free(map);
71+
}
3772

3873
map_t* map_create(float load_factor,
3974
size_t key_size,
@@ -50,7 +85,7 @@ map_t* map_create(float load_factor,
5085
map_t* map = NULL;
5186

5287
map = malloc(sizeof(map_t));
53-
map->num_buckets = DEFAULT_BUCKET_COUNT;
88+
map->num_buckets = initial_bucket_count;
5489
map->num_entries = 0;
5590
map->load_factor = load_factor;
5691
map->key_size = key_size;
@@ -59,21 +94,25 @@ map_t* map_create(float load_factor,
5994
map->destructor = destructor;
6095
check_mem(map);
6196

62-
map->buckets = calloc(DEFAULT_BUCKET_COUNT, sizeof(llist_t));
97+
map->buckets = calloc(initial_bucket_count, sizeof(llist_t));
6398
check_mem(map->buckets);
6499

65-
for(int i = 0; i < DEFAULT_BUCKET_COUNT; i++) {
66-
map->buckets[i] = llist_create(map->destructor);
100+
for(int i = 0; i < initial_bucket_count; i++) {
101+
map->buckets[i] = llist_create(NULL);
67102
}
68103

69104
return map;
70105

71106
error:
72107
if(map != NULL) {
73108
if(map->buckets != NULL) {
74-
for(int i = 0; i < DEFAULT_BUCKET_COUNT; i++) {
75-
llist_destroy(map->buckets[i]);
76-
}
109+
int i;
110+
for(i = 0; i < initial_bucket_count; i++) {
111+
if(map->buckets[i] != NULL) {
112+
llist_destroy(map->buckets[i]);
113+
}
114+
}
115+
free(map->buckets);
77116
}
78117
free(map);
79118
}
@@ -109,16 +148,16 @@ map_entry_t* map_create_entry(uint32_t hash, void* key, void* value)
109148
return NULL;
110149
}
111150

112-
void map_entry_destroy(map_entry_t* entry) {
113-
if(entry != NULL) {
114-
free(entry);
115-
}
116-
}
151+
117152

118153
llist_t* map_get_bucket(map_t* map, void* key, uint32_t hash)
119154
{
155+
check(map, "Map was null");
156+
check(map->buckets, "buckets was not properly assigned");
157+
120158
int bucket_number = hash % map->num_buckets;
121159
check(bucket_number >= 0, "Bucket out of range");
160+
check(map->buckets[bucket_number], "Requested bucket is NULL");
122161

123162
return map->buckets[bucket_number];
124163

@@ -134,17 +173,12 @@ map_entry_t* map_find_entry(
134173
{
135174
llist_node_t* node = bucket->head;
136175
map_entry_t* entry = NULL;
137-
log_err("Address of bucket->head: %p", bucket->head);
138176
while(node != NULL) {
139-
log_err("iterating on node");
140177
entry = (map_entry_t*) node->value;
141-
log_err("attempting comparison");
142178
if(entry->hash == hash &&
143179
map->cmp(entry->key, key) == 0) {
144-
log_err("Found entry");
145180
return entry;
146181
}
147-
log_err("Moving from %p to next, %p", node, node->next);
148182
node = node->next;
149183
}
150184

@@ -154,8 +188,8 @@ map_entry_t* map_find_entry(
154188

155189
void map_put(map_t* map, void* key, void* value)
156190
{
157-
uint64_t hash = map->hash(key, map->key_size);
158191

192+
uint32_t hash = map->hash(key, map->key_size);
159193
llist_t* bucket = map_get_bucket(map, key, hash);
160194
check(bucket, "Error obtaining hash bucket");
161195

@@ -176,19 +210,22 @@ void* map_get(map_t* map, void* key)
176210
uint32_t hash = map->hash(key, map->key_size);
177211
llist_t* bucket = map_get_bucket(map, key, hash);
178212

213+
check(bucket, "Error obtaining hash bucket");
214+
179215
if(bucket == NULL) {
180216
log_err("Bucket is null");
181217
return NULL;
182218
}
183219

184-
log_err("Bucket is not null");
185220
map_entry_t* entry = map_find_entry(map, bucket, key, hash);
186221

187222
if(entry == NULL) {
188223
return NULL;
189224
}
190225

191226
return entry;
227+
error:
228+
return NULL;
192229
}
193230

194231
void* map_delete(map_t* map, void* key)
@@ -218,16 +255,19 @@ void* map_delete(map_t* map, void* key)
218255
entry = (map_entry_t*) node->value;
219256
if(entry->hash == hash &&
220257
map->cmp(entry->key, key) == 0) {
258+
221259
void* data = entry->value;
260+
222261
(*prev) = node->next;
223262
bucket->size--;
263+
224264
llist_node_destroy(node);
225265
map_entry_destroy(entry);
226266
return data;
227267
}
228-
log_err("no match, continuing");
229268
prev = &(*prev)->next;
230269
node = node->next;
231270
}
232271
return NULL;
233-
}
272+
}
273+

tests/map_t_tests.c

+11-2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ char* test_create() {
4242

4343
mu_assert(map != NULL, "Map is NULL");
4444

45+
map_destroy(map);
46+
4547
return NULL;
4648
}
4749

@@ -74,7 +76,7 @@ char* test_default_hasher() {
7476
h2 = map->hash(str2, strlen(str2));
7577
mu_assert(h1 != h2, "strings: Hash one and hash two were equal");
7678
}
77-
79+
map_destroy(map);
7880
return NULL;
7981
}
8082

@@ -83,12 +85,17 @@ char* test_set_get() {
8385
int key = 1234;
8486
char value[] = "Foo";
8587

88+
int key2 = 5678;
89+
char value2[] = "bar123";
90+
8691
map_put(map, (void*) &key, (void*) value);
92+
map_put(map, (void*) &key2, (void*) value2);
8793

8894
char* out_value = (char*) map_get(map, &key);
8995

9096
debug("Out value: %s", out_value);
9197

98+
map_destroy(map);
9299
return NULL;
93100
}
94101

@@ -122,7 +129,9 @@ char* test_delete()
122129
mu_assert(*retval2 == val2, "Return val 2 does not match initial value 2");
123130

124131
mu_assert(should_be_null == NULL, "Item was not successfully deleted from map");
125-
log_err("At end of tests");
132+
133+
map_destroy(map);
134+
126135
return NULL;
127136
}
128137

0 commit comments

Comments
 (0)