2 * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
6 * This file may be distributed and/or modified under the terms of the
7 * GNU General Public License version 2 as published by the Free Software
8 * Foundation and appearing in the file LICENSE.GPL included in the
9 * packaging of this file.
11 * Licensees holding valid libFirm Professional Edition licenses may use
12 * this file in accordance with the libFirm Commercial License.
13 * Agreement provided with the Software.
15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * @author Michael Beck
23 * @brief A value set, containing expression for values.
26 #ifndef _FIRM_VALUESET_H_
27 #define _FIRM_VALUESET_H_
29 #include "firm_config.h"
31 #include "firm_types.h"
35 typedef struct ir_valueset_entry_t {
36 ir_node *value; /**< the represented value */
37 ir_node *expr; /**< the leader expression for the value in the current set */
38 list_head list; /**< link field for the list iterator */
39 } ir_valueset_entry_t;
41 #define HashSet ir_valueset_t
42 #define HashSetIterator ir_valueset_iterator_t
43 #define ValueType ir_valueset_entry_t
44 #define ADDITIONAL_DATA list_head elem_list; list_head all_iters;
51 #undef ADDITIONAL_DATA
53 #undef HashSetIterator
56 typedef struct ir_valueset_t ir_valueset_t;
57 typedef struct ir_valueset_iterator_t {
58 list_head *iter; /**< points to the list head of the last element */
59 const ir_valueset_t *valueset; /**< the value set of this iterator. */
60 } ir_valueset_iterator_t;
63 * Initializes a value set with default size.
65 * @param valueset Pointer to allocated space for the value set
67 void ir_valueset_init(ir_valueset_t *valueset);
70 * Initializes a value set.
72 * @param valueset Pointer to allocated space for the value set
73 * @param expected_elements Number of elements expected in the value set (roughly)
75 void ir_valueset_init_size(ir_valueset_t *valueset, size_t expected_elements);
78 * Destroys a value set and frees the memory allocated for hashtable. The memory of
79 * the value set itself is not freed.
81 * @param valueset Pointer to the value set
83 void ir_valueset_destroy(ir_valueset_t *valueset);
86 * Allocates memory for a value set and initializes it.
88 * @param expected_elements Number of elements expected in the value set (roughly)
89 * @return The initialized value set
91 static INLINE ir_valueset_t *ir_valueset_new(size_t expected_elements) {
92 ir_valueset_t *res = xmalloc(sizeof(*res));
93 ir_valueset_init_size(res, expected_elements);
98 * Destroys a value set and frees the memory of the set itself.
100 static INLINE void ir_valueset_del(ir_valueset_t *valueset) {
101 ir_valueset_destroy(valueset);
106 * Inserts a (value, expression) pair into a valueset if the value is not already
107 * known, else does nothing.
109 * @param valueset Pointer to the value set
110 * @param value the value to insert into the value set
111 * @param expr the expression to associate with the value
112 * @returns 1 if the value has been inserted,
113 * 0 if it was already there
115 int ir_valueset_insert(ir_valueset_t *valueset, ir_node *value, ir_node *expr);
118 * Inserts a (value, expression) pair into a valueset if the value is not already
119 * known, else replace the expression for the given value.
121 * @param valueset Pointer to the value set
122 * @param value the value to insert into the value set
123 * @param expr the expression to associate with the value
124 * @returns 1 if the value has been inserted,
125 * 0 if it was already there
127 int ir_valueset_replace(ir_valueset_t *valueset, ir_node *value, ir_node *expr);
130 * Get the leader expression of a specific value from the value set.
132 * @param valueset Pointer to the value set
133 * @param value The value to find
134 * @returns the associated expression of the value or NULL
136 void *ir_valueset_lookup(const ir_valueset_t *valueset, const ir_node *value);
139 * Removes a value from a value set. Does nothing if the value set doesn't contain
142 * @param valueset Pointer to the value set
143 * @param value value to remove from the values et
145 void ir_valueset_remove(ir_valueset_t *valueset, const ir_node *value);
148 * Returns the number of values contained in the value set.
150 * @param valueset Pointer to the value set
151 * @returns Number of values contained in the value set
153 size_t ir_valueset_size(const ir_valueset_t *valueset);
156 * Initializes a value set iterator. Sets the iterator before the first element in
159 * @param iterator Pointer to already allocated iterator memory
160 * @param valueset Pointer to the value set
162 void ir_valueset_iterator_init(ir_valueset_iterator_t *iterator,
163 const ir_valueset_t *valueset);
166 * Advances the iterator and returns the current element or NULL if all elements
167 * in the value set have been processed.
168 * @note It is not allowed to use ir_valueset_insert() or ir_valueset_remove() while
169 * iterating over a nodemap.
171 * @param iterator Pointer to the value set iterator.
172 * @param expr After return contains the associated expression for the value or NULL
173 * @returns Next element in the value set or NULL
175 ir_node *ir_valueset_iterator_next(ir_valueset_iterator_t *iterator, ir_node **expr);
178 * Removes the element the iterator currently points to.
180 * @param valueset Pointer to the value set
181 * @param iterator Pointer to the value set iterator.
183 void ir_valueset_remove_iterator(ir_valueset_t *valueset, ir_valueset_iterator_t *iterator);
185 #define foreach_valueset(valueset, value, expr, iter) \
186 for (ir_valueset_iterator_init(&iter, valueset), \
187 value = ir_valueset_iterator_next(&iter, &expr); \
188 value != NULL; value = ir_valueset_iterator_next(&iter, &expr))