bearch: Disallow passing Projs to get_irn_ops().
[libfirm] / ir / adt / pmap.c
1 /*
2  * This file is part of libFirm.
3  * Copyright (C) 2012 University of Karlsruhe.
4  */
5
6 /**
7  * @file
8  * @brief       simplified hashmap for pointer -> pointer mappings
9  * @author      Hubert Schmid
10  * @date        09.06.2002
11  */
12 #include "config.h"
13
14 #include "pmap.h"
15
16 #include <assert.h>
17 #include "set.h"
18 #include "hashptr.h"
19
20
21 struct pmap {
22         int dummy; /* dummy entry */
23 };
24
25
26 #define INITIAL_SLOTS 64
27
28 /** map a pmap into a set */
29 #define M2S(map)  (set *)(map)
30
31 /**
32  * compare the keys of two entry pairs
33  */
34 static int pmap_entry_cmp(const void *p1, const void *p2, size_t size)
35 {
36         const pmap_entry *entry1 = (const pmap_entry*) p1;
37         const pmap_entry *entry2 = (const pmap_entry*) p2;
38         (void) size;
39
40         return entry1->key != entry2->key;
41 }
42
43 /* Creates a new empty map with an initial number of slots. */
44 pmap *pmap_create_ex(size_t slots)
45 {
46         return (pmap *)new_set(pmap_entry_cmp, slots);
47 }
48
49 pmap *pmap_create(void)
50 {
51         return pmap_create_ex(INITIAL_SLOTS);
52 }
53
54 void pmap_destroy(pmap *map)
55 {
56         del_set(M2S(map));
57 }
58
59 void pmap_insert(pmap *map, const void *key, void *value)
60 {
61         pmap_entry entry, *p;
62
63         entry.key = key;
64         p = set_insert(pmap_entry, M2S(map), &entry, sizeof(pmap_entry), hash_ptr(key));
65         p->value = value;
66 }
67
68 int pmap_contains(pmap *map, const void *key)
69 {
70         return pmap_find(map, key) != NULL;
71 }
72
73 pmap_entry * pmap_find(pmap *map, const void *key)
74 {
75         pmap_entry const entry = { key, 0 };
76         return set_find(pmap_entry, M2S(map), &entry, sizeof(entry), hash_ptr(key));
77 }
78
79
80 void * (pmap_get)(pmap *map, const void *key)
81 {
82         pmap_entry * entry = pmap_find(map, key);
83         return entry == NULL ? NULL : entry->value;
84 }
85
86 size_t pmap_count(pmap *map)
87 {
88         return set_count(M2S(map));
89 }
90
91 pmap_entry *pmap_first(pmap *map)
92 {
93         return set_first(pmap_entry, M2S(map));
94 }
95
96 pmap_entry *pmap_next(pmap *map)
97 {
98         return set_next(pmap_entry, M2S(map));
99 }
100
101 void pmap_break(pmap *map)
102 {
103         set_break(M2S(map));
104 }