2 * This file is part of libFirm.
3 * Copyright (C) 2012 University of Karlsruhe.
8 * @author Matthias Braun
10 * @brief A nodemap. This should be preferred over a simple pset, because
11 * it guarantees deterministic behavior when iterating of the
16 #include "irnodehashmap.h"
20 static ir_nodehashmap_entry_t null_nodehashmap_entry = { NULL, NULL };
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)
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,
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,
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
55 #include "hashset.c.inl"
57 void ir_nodehashmap_init(ir_nodehashmap_t *nodehashmap)
59 ir_nodehashmap_init_size(nodehashmap, 16);
62 void *(ir_nodehashmap_get)(const ir_nodehashmap_t *self, const ir_node *node)
64 ir_nodehashmap_entry_t *entry = ir_nodehashmap_find_(self, node);
68 void ir_nodehashmap_insert(ir_nodehashmap_t *self, ir_node *node, void *data)
70 ir_nodehashmap_entry_t *entry = ir_nodehashmap_insert_(self, node);