65
65
s_map_item_free (SMapItem * self,
67
67
FreeFunc free_value) {
69
free_value (self->value);
68
s_dbg_print ("Freeing Item!");
73
free_value (self->value);
79
_internal_s_map_free_buckets (SLinkedList * self);
76
82
s_map_new (CompFunc comp_func,
77
83
HashFunc key_hash_func,
79
85
FreeFunc free_value) {
86
s_dbg_print ("Freeing SMap");
80
87
SMap * self = malloc (sizeof (SMap));
83
90
self->is_equal = comp_func;
85
92
/* free_* functions need to be checked if they are null and set the pointer
86
93
* to free or s_base_object_free ()... Have to decide which...?
89
self->free_key = free_key;
91
self->free_key = FREEFUNC(free);
94
self->free_value = free_value;
96
self->free_value = FREEFUNC(free);
100
/* if no func is set we have to use some other metod of
95
self->free_key = free_key;
96
self->free_value = free_value;
98
/* if no func is set we have to use some other metod of
102
100
if (key_hash_func == NULL){
103
101
self->key_hash_func = s_hash_object;
105
103
self->key_hash_func = key_hash_func;
108
106
self->array = s_dynamic_array_new (S_MAP_DEFAULT_NUMBER_OF_BUCKETS,
109
FREEFUNC(s_linked_list_free));
107
FREEFUNC(_internal_s_map_free_buckets));
124
122
s_map_add (SMap * self, spointer key, spointer value) {
125
123
SDynamicArray * array = self->array;
126
124
SMapItem * item = s_map_item_new (key, value);
128
126
/* We have to generate a key to use as an index in the DynamicArray. */
129
127
HashFunc hash_func = self->key_hash_func;
130
128
hash_t hash = hash_func (key);
131
129
/* We need to mod it with the max size of the array. */
132
130
hash = hash % S_MAP_DEFAULT_NUMBER_OF_BUCKETS;
134
132
if (self->len == 0) {
135
133
/* Since we know that there are no items in the array we can skip the
136
134
* check if the new place is taken. and just and an array to it.
138
SLinkedList * bucket = s_linked_list_new (NULL);
136
s_dbg_print ("Adding bucket to bucket array");
137
SLinkedList * bucket = s_linked_list_new (FREEFUNC(_s_map_internal_free_map_items_for_each));
138
s_dbg_print ("1) Appending item to linked list");
139
139
s_dynamic_array_set (array, hash, bucket);
140
140
s_linked_list_append (bucket, item);
142
s_dbg_print ("SMap size in more than zero.");
143
143
/* Figure out if the bucket exists. */
144
144
SLinkedList * bucket = _s_map_internal_find_bucket (self, key);
146
146
if (bucket == NULL) {
147
bucket = s_linked_list_new (NULL);
147
s_dbg_print ("Bucket does not exist");
148
bucket = s_linked_list_new (FREEFUNC(_s_map_internal_free_map_items_for_each));
150
151
if (_s_map_internal_find_item_in_bucket (self, bucket, key)) {
151
152
s_warn_print ("Key already exists in SMap\n");
155
s_dbg_print ("2) Appending item to linked list");
154
156
s_linked_list_append (bucket, item);
160
162
s_map_get (SMap * self, spointer key) {
161
163
spointer ret_val = NULL;
163
165
SLinkedList * bucket = _s_map_internal_find_bucket (self, key);
165
167
SMapItem * item = _s_map_internal_find_item_in_bucket (self, bucket, key);
191
193
s_map_for_each (SMap * self, ForEachFunc foreach_func, spointer user_data) {
194
s_dbg_print ("Running For Each on SMap");
192
195
for (size_t i = 0; i <= s_dynamic_array_last_item (self->array); i++) {
193
196
SLinkedList * bucket = s_dynamic_array_get (self->array, i);
198
s_dbg_print ("Found bucket");
195
199
s_linked_list_head (bucket);
200
s_dbg_print ("No of items in list: %zd.", s_linked_list_len (bucket));
197
202
SMapItem * item = s_linked_list_get_current (bucket);
198
203
foreach_func (self, item, user_data);
205
210
_s_map_internal_find_bucket (SMap * self,
212
s_dbg_print ("Looking for bucket");
207
213
SLinkedList * ret_val = NULL;
209
215
HashFunc hash_func = self->key_hash_func;
210
hash_t hash = hash_func (key);
216
hash_t hash = hash_func (key) % S_MAP_DEFAULT_NUMBER_OF_BUCKETS;
212
218
ret_val = s_dynamic_array_get (self->array, hash);
219
225
_s_map_internal_find_item_in_bucket (SMap * self,
220
226
SLinkedList * bucket,
228
s_dbg_print ("Looking for item in bucket");
222
229
s_linked_list_head (bucket);
224
231
SMapItem * item = SMAPITEM (s_linked_list_get_current (bucket));
225
233
if (item && self->is_equal (item->key, key)) {
234
s_dbg_print ("Found Item in Bucket.");
228
237
} while (s_linked_list_next (bucket));
246
255
_s_map_internal_free_map_items_for_each (SMap * map,
248
sboolean * free_data) {
257
sboolean free_data) {
258
s_dbg_print ("runnnig: _s_map_internal_free_map_items_for_each");
260
s_dbg_print ("Freeing K:V pair");
250
261
s_map_item_free (item, map->free_key, map->free_value);
268
_internal_s_map_free_buckets (SLinkedList * self) {
269
s_dbg_print ("Freeing bucket.");
270
s_linked_list_free (self, TRUE);