// Copyright (c) 2023, Marvin Borner // SPDX-License-Identifier: MIT #include #include #include #include static struct hashmap *all_terms; static void hashmap_free_term(void *item) { struct term *term = *(struct term **)item; free(term); } struct term *map_get(hash_t hash) { struct term **handle = hashmap_get(all_terms, hash); if (!handle) return 0; return *handle; } void map_set(struct term *term, hash_t hash) { hashmap_set(all_terms, &term, hash); } void map_initialize(void) { all_terms = hashmap_new(sizeof(struct term *), 0, hashmap_free_term); } void map_destroy(void) { hashmap_free(all_terms); } struct pqueue *map_to_pqueue(pqueue_cmp_pri_f cmppri, pqueue_get_pri_f getpri, pqueue_set_pos_f setpos) { size_t size = hashmap_count(all_terms) + 42; struct pqueue *queue = pqueue_init(size, cmppri, getpri, setpos); size_t iter = 0; void *iter_val; while (hashmap_iter(all_terms, &iter, &iter_val)) { struct term *term = *(struct term **)iter_val; if (term->type == APP) { pqueue_insert(queue, term); } } return queue; }