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
23 * @brief hashset containing pointers
24 * @author Matthias Braun
26 * @note This has been named pset_new_new for now until all code has been
27 * changed to use this instead of the old deprecated pset_new functions!
28 * This version performs better than pset in terms of speed and memory
29 * usage and allows multiple iterators over the set
31 #ifndef FIRM_ADT_PSET_NEW_H
32 #define FIRM_ADT_PSET_NEW_H
38 #define HashSet pset_new_t
39 #define HashSetIterator pset_new_iterator_t
40 #define ValueType void*
45 #undef HashSetIterator
50 /** a pointer (hash)set */
51 typedef struct pset_new_t pset_new_t;
52 /** iterator over a pointer set.
54 typedef struct pset_new_iterator_t pset_new_iterator_t;
57 * Initializes a pset_new
59 * @param pset_new Pointer to allocated space for the pset_new
61 FIRM_API void pset_new_init(pset_new_t *pset_new);
64 * Initializes a pset_new
66 * @param pset_new Pointer to allocated space for the pset_new
67 * @param expected_elements Number of elements expected in the pset_new (roughly)
69 FIRM_API void pset_new_init_size(pset_new_t *pset_new, size_t expected_elements);
72 * Destroys a pset_new and frees the memory allocated for hashtable. The memory of
73 * the pset_new itself is not freed.
75 * @param pset_new Pointer to the pset_new
77 FIRM_API void pset_new_destroy(pset_new_t *pset_new);
80 * Inserts an element into a pset_new.
82 * @param pset_new Pointer to the pset_new
83 * @param ptr Pointer to insert into the pset_new
84 * @returns 1 if the pointer was inserted, 0 if it was already there
86 FIRM_API int pset_new_insert(pset_new_t *pset_new, void *ptr);
89 * Removes an element from a pset_new. Does nothing if the pset_new doesn't contain the
92 * @param pset_new Pointer to the pset_new
93 * @param ptr Pointer to remove from the pset_new
95 FIRM_API void pset_new_remove(pset_new_t *pset_new, const void *ptr);
98 * Tests whether a pset_new contains a pointer
100 * @param pset_new Pointer to the pset_new
101 * @param ptr The pointer to test
102 * @returns 1 @p pset_new contains the @p ptr, 0 otherwise
104 FIRM_API int pset_new_contains(const pset_new_t *pset_new, const void *ptr);
107 * Returns the number of pointers contained in the pset_new
109 * @param pset_new Pointer to the pset_new
110 * @returns Number of pointers contained in the pset_new
112 FIRM_API size_t pset_new_size(const pset_new_t *pset_new);
115 * Initializes a pset_new iterator. Sets the iterator before the first element in
118 * @param iterator Pointer to already allocated iterator memory
119 * @param pset_new Pointer to the pset_new
121 FIRM_API void pset_new_iterator_init(pset_new_iterator_t *iterator, const pset_new_t *pset_new);
124 * Advances the iterator and returns the current element or NULL if all elements
125 * in the pset_new have been processed.
126 * @attention It is not allowed to use pset_new_insert or pset_new_remove while
127 * iterating over a pset_new; pset_new_remove_iter is allowed.
129 * @param iterator Pointer to the pset_new iterator.
130 * @returns Next element in the pset_new or NULL
132 FIRM_API void* pset_new_iterator_next(pset_new_iterator_t *iterator);
135 * Removes the element that the iterator currently points to from the hashset.
137 * @param pset_new Pointer to the pset_new
138 * @param iterator Pointer to the iterator
140 FIRM_API void pset_new_remove_iterator(pset_new_t *pset_new, const pset_new_iterator_t *iterator);
143 * Convenience macro for iterating over a pset_new.
145 #define foreach_pset_new(pset_new, type, ptr, iter) \
146 for(pset_new_iterator_init(&iter, pset_new), \
147 ptr = (type) pset_new_iterator_next(&iter); \
148 ptr != NULL; ptr = (type) pset_new_iterator_next(&iter))