src/kv_list.c

changeset 1429
6e0c3a8a914a
parent 1419
e46406fd1b3c
equal deleted inserted replaced
1428:0ac4aa1737fd 1429:6e0c3a8a914a
150 static int cx_kvl_insert_iter( 150 static int cx_kvl_insert_iter(
151 struct cx_iterator_s *iter, 151 struct cx_iterator_s *iter,
152 const void *elem, 152 const void *elem,
153 int prepend 153 int prepend
154 ) { 154 ) {
155 cx_kv_list *kv_list = iter->src_handle.m; 155 cx_kv_list *kv_list = iter->src_handle;
156 return kv_list->list_methods->insert_iter(iter, elem, prepend); 156 return kv_list->list_methods->insert_iter(iter, elem, prepend);
157 } 157 }
158 158
159 static size_t cx_kvl_remove( 159 static size_t cx_kvl_remove(
160 struct cx_list_s *list, 160 struct cx_list_s *list,
257 257
258 static void cx_kvl_list_iter_next(void *it) { 258 static void cx_kvl_list_iter_next(void *it) {
259 struct cx_iterator_s *iter = it; 259 struct cx_iterator_s *iter = it;
260 if (iter->base.remove) { 260 if (iter->base.remove) {
261 // remove the assigned key from the map before calling the actual function 261 // remove the assigned key from the map before calling the actual function
262 cx_kv_list *kv_list = iter->src_handle.m; 262 cx_kv_list *kv_list = iter->src_handle;
263 cx_kv_list_update_destructors(kv_list); 263 cx_kv_list_update_destructors(kv_list);
264 char *node = iter->elem_handle; 264 char *node = iter->elem_handle;
265 CxHashKey *key = cx_kv_list_loc_key(kv_list, node + kv_list->list.loc_data); 265 CxHashKey *key = cx_kv_list_loc_key(kv_list, node + kv_list->list.loc_data);
266 if (key->hash != 0) { 266 if (key->hash != 0) {
267 kv_list->map_methods->remove(&kv_list->map->map_base.base, *key, NULL); 267 kv_list->map_methods->remove(&kv_list->map->map_base.base, *key, NULL);
268 } 268 }
269 } 269 }
270 // note that we do not clear the remove flag, because the next_impl will do that
270 iter->base.next_impl(it); 271 iter->base.next_impl(it);
271 } 272 }
272 273
273 static struct cx_iterator_s cx_kvl_iterator( 274 static struct cx_iterator_s cx_kvl_iterator(
274 const struct cx_list_s *list, 275 const struct cx_list_s *list,
395 return entry->value; 396 return entry->value;
396 } 397 }
397 398
398 static void cx_kvl_iter_next(void *it) { 399 static void cx_kvl_iter_next(void *it) {
399 CxMapIterator *iter = it; 400 CxMapIterator *iter = it;
400 cx_kv_list *kv_list = ((struct cx_kv_list_map_s*)iter->map.m)->list; 401 cx_kv_list *kv_list = ((struct cx_kv_list_map_s*)iter->map)->list;
401 402
402 // find the next list entry that has a key assigned 403 // find the next list entry that has a key assigned
403 CxHashKey *key = NULL; 404 CxHashKey *key = NULL;
404 char *next = iter->elem; 405 char *next = iter->elem;
405 while (true) { 406 while (true) {
456 457
457 CxMapIterator cx_kvl_map_iterator(const CxMap *map, enum cx_map_iterator_type type) { 458 CxMapIterator cx_kvl_map_iterator(const CxMap *map, enum cx_map_iterator_type type) {
458 CxMapIterator iter = {0}; 459 CxMapIterator iter = {0};
459 460
460 iter.type = type; 461 iter.type = type;
461 iter.map.c = map; 462 iter.map = (CxMap*)map;
462 // although we iterate over the list, we only report that many elements that have a key in the map 463 // although we iterate over the list, we only report that many elements that have a key in the map
463 iter.elem_count = map->collection.size; 464 iter.elem_count = map->collection.size;
464 465
465 switch (type) { 466 switch (type) {
466 case CX_MAP_ITERATOR_PAIRS: 467 case CX_MAP_ITERATOR_PAIRS:
477 break; 478 break;
478 default: 479 default:
479 assert(false); // LCOV_EXCL_LINE 480 assert(false); // LCOV_EXCL_LINE
480 } 481 }
481 482
483 iter.base.allow_remove = true;
482 iter.base.next = cx_kvl_iter_next; 484 iter.base.next = cx_kvl_iter_next;
483 iter.base.valid = cx_kvl_iter_valid; 485 iter.base.valid = cx_kvl_iter_valid;
484 486
485 // find the first list entry that has a key assigned 487 // find the first list entry that has a key assigned
486 cx_kv_list *kv_list = ((struct cx_kv_list_map_s*)map)->list; 488 cx_kv_list *kv_list = ((struct cx_kv_list_map_s*)map)->list;

mercurial