@@ -34,6 +34,41 @@ uint32_t djb2(void* key, size_t size)
34
34
return hash ;
35
35
}
36
36
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
+ }
37
72
38
73
map_t * map_create (float load_factor ,
39
74
size_t key_size ,
@@ -50,7 +85,7 @@ map_t* map_create(float load_factor,
50
85
map_t * map = NULL ;
51
86
52
87
map = malloc (sizeof (map_t ));
53
- map -> num_buckets = DEFAULT_BUCKET_COUNT ;
88
+ map -> num_buckets = initial_bucket_count ;
54
89
map -> num_entries = 0 ;
55
90
map -> load_factor = load_factor ;
56
91
map -> key_size = key_size ;
@@ -59,21 +94,25 @@ map_t* map_create(float load_factor,
59
94
map -> destructor = destructor ;
60
95
check_mem (map );
61
96
62
- map -> buckets = calloc (DEFAULT_BUCKET_COUNT , sizeof (llist_t ));
97
+ map -> buckets = calloc (initial_bucket_count , sizeof (llist_t ));
63
98
check_mem (map -> buckets );
64
99
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 );
67
102
}
68
103
69
104
return map ;
70
105
71
106
error :
72
107
if (map != NULL ) {
73
108
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 );
77
116
}
78
117
free (map );
79
118
}
@@ -109,16 +148,16 @@ map_entry_t* map_create_entry(uint32_t hash, void* key, void* value)
109
148
return NULL ;
110
149
}
111
150
112
- void map_entry_destroy (map_entry_t * entry ) {
113
- if (entry != NULL ) {
114
- free (entry );
115
- }
116
- }
151
+
117
152
118
153
llist_t * map_get_bucket (map_t * map , void * key , uint32_t hash )
119
154
{
155
+ check (map , "Map was null" );
156
+ check (map -> buckets , "buckets was not properly assigned" );
157
+
120
158
int bucket_number = hash % map -> num_buckets ;
121
159
check (bucket_number >= 0 , "Bucket out of range" );
160
+ check (map -> buckets [bucket_number ], "Requested bucket is NULL" );
122
161
123
162
return map -> buckets [bucket_number ];
124
163
@@ -134,17 +173,12 @@ map_entry_t* map_find_entry(
134
173
{
135
174
llist_node_t * node = bucket -> head ;
136
175
map_entry_t * entry = NULL ;
137
- log_err ("Address of bucket->head: %p" , bucket -> head );
138
176
while (node != NULL ) {
139
- log_err ("iterating on node" );
140
177
entry = (map_entry_t * ) node -> value ;
141
- log_err ("attempting comparison" );
142
178
if (entry -> hash == hash &&
143
179
map -> cmp (entry -> key , key ) == 0 ) {
144
- log_err ("Found entry" );
145
180
return entry ;
146
181
}
147
- log_err ("Moving from %p to next, %p" , node , node -> next );
148
182
node = node -> next ;
149
183
}
150
184
@@ -154,8 +188,8 @@ map_entry_t* map_find_entry(
154
188
155
189
void map_put (map_t * map , void * key , void * value )
156
190
{
157
- uint64_t hash = map -> hash (key , map -> key_size );
158
191
192
+ uint32_t hash = map -> hash (key , map -> key_size );
159
193
llist_t * bucket = map_get_bucket (map , key , hash );
160
194
check (bucket , "Error obtaining hash bucket" );
161
195
@@ -176,19 +210,22 @@ void* map_get(map_t* map, void* key)
176
210
uint32_t hash = map -> hash (key , map -> key_size );
177
211
llist_t * bucket = map_get_bucket (map , key , hash );
178
212
213
+ check (bucket , "Error obtaining hash bucket" );
214
+
179
215
if (bucket == NULL ) {
180
216
log_err ("Bucket is null" );
181
217
return NULL ;
182
218
}
183
219
184
- log_err ("Bucket is not null" );
185
220
map_entry_t * entry = map_find_entry (map , bucket , key , hash );
186
221
187
222
if (entry == NULL ) {
188
223
return NULL ;
189
224
}
190
225
191
226
return entry ;
227
+ error :
228
+ return NULL ;
192
229
}
193
230
194
231
void * map_delete (map_t * map , void * key )
@@ -218,16 +255,19 @@ void* map_delete(map_t* map, void* key)
218
255
entry = (map_entry_t * ) node -> value ;
219
256
if (entry -> hash == hash &&
220
257
map -> cmp (entry -> key , key ) == 0 ) {
258
+
221
259
void * data = entry -> value ;
260
+
222
261
(* prev ) = node -> next ;
223
262
bucket -> size -- ;
263
+
224
264
llist_node_destroy (node );
225
265
map_entry_destroy (entry );
226
266
return data ;
227
267
}
228
- log_err ("no match, continuing" );
229
268
prev = & (* prev )-> next ;
230
269
node = node -> next ;
231
270
}
232
271
return NULL ;
233
- }
272
+ }
273
+
0 commit comments