bearch: Disallow passing Projs to get_irn_ops().
[libfirm] / ir / ir / irnodehashmap.c
1 /*
2  * This file is part of libFirm.
3  * Copyright (C) 2012 University of Karlsruhe.
4  */
5
6 /**
7  * @file
8  * @author    Matthias Braun
9  * @date      30.03.2007
10  * @brief     A nodemap. This should be preferred over a simple pset, because
11  *            it guarantees deterministic behavior when iterating of the
12  *            hashmap
13  */
14 #include "config.h"
15
16 #include "irnodehashmap.h"
17 #include "irnode_t.h"
18 #include "hashptr.h"
19
20 static ir_nodehashmap_entry_t null_nodehashmap_entry = { NULL, NULL };
21
22 #define DO_REHASH
23 #define HashSet                   ir_nodehashmap_t
24 #define HashSetIterator           ir_nodehashmap_iterator_t
25 #define ValueType                 ir_nodehashmap_entry_t
26 #define NullValue                 null_nodehashmap_entry
27 #define KeyType                   ir_node*
28 #define ConstKeyType              const ir_node*
29 #define GetKey(value)             (value).node
30 #define InitData(self,value,key)  (value).node = (key)
31 #define Hash(self,key)            ((unsigned)((key)->node_nr))
32 #define KeysEqual(self,key1,key2) (key1) == (key2)
33 #define SetRangeEmpty(ptr,size)   memset(ptr, 0, (size) * sizeof((ptr)[0]))
34 #define EntrySetEmpty(value)      (value).node = NULL
35 #define EntrySetDeleted(value)    (value).node = (ir_node*) -1
36 #define EntryIsEmpty(value)       ((value).node == NULL)
37 #define EntryIsDeleted(value)     ((value).node == (ir_node*)-1)
38
39 void ir_nodehashmap_init_(ir_nodehashmap_t *self);
40 #define hashset_init            ir_nodehashmap_init_
41 #define hashset_init_size       ir_nodehashmap_init_size
42 #define hashset_destroy         ir_nodehashmap_destroy
43 ir_nodehashmap_entry_t *ir_nodehashmap_insert_(ir_nodehashmap_t *self,
44                                                ir_node *node);
45 #define hashset_insert          ir_nodehashmap_insert_
46 #define hashset_remove          ir_nodehashmap_remove
47 ir_nodehashmap_entry_t *ir_nodehashmap_find_(const ir_nodehashmap_t *self,
48                                              const ir_node *node);
49 #define hashset_find            ir_nodehashmap_find_
50 #define hashset_size            ir_nodehashmap_size
51 #define hashset_iterator_init   ir_nodehashmap_iterator_init
52 #define hashset_iterator_next   ir_nodehashmap_iterator_next
53 #define hashset_remove_iterator ir_nodehashmap_remove_iterator
54
55 #include "hashset.c.inl"
56
57 void ir_nodehashmap_init(ir_nodehashmap_t *nodehashmap)
58 {
59         ir_nodehashmap_init_size(nodehashmap, 16);
60 }
61
62 void *(ir_nodehashmap_get)(const ir_nodehashmap_t *self, const ir_node *node)
63 {
64         ir_nodehashmap_entry_t *entry = ir_nodehashmap_find_(self, node);
65         return entry->data;
66 }
67
68 void ir_nodehashmap_insert(ir_nodehashmap_t *self, ir_node *node, void *data)
69 {
70         ir_nodehashmap_entry_t *entry = ir_nodehashmap_insert_(self, node);
71         entry->data                   = data;
72 }