add pkgconfig stuff, always build libfirm_xmalloc separately
[libfirm] / ir / adt / cpset.h
1 /*
2  * Copyright (C) 1995-2007 University of Karlsruhe.  All right reserved.
3  *
4  * This file is part of libFirm.
5  *
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.
10  *
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.
14  *
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
17  * PURPOSE.
18  */
19
20 /**
21  * @file
22  * @date    16.03.2007
23  * @brief   a set of pointers with a custom compare function
24  * @author  Matthias Braun
25  * @version $Id$
26  */
27 #ifndef FIRM_ADT_CPSET_H
28 #define FIRM_ADT_CPSET_H
29
30 /**
31  * The type of a cpset compare function.
32  *
33  * @param p1   pointer to an element
34  * @param p2   pointer to another element
35  *
36  * @return  1 if the elements are identically, zero else
37  */
38 typedef int (*cpset_cmp_function) (const void *p1, const void *p2);
39
40 /**
41  * The type of a cpset hash function.
42  *
43  * @param p1   pointer to an element
44  * @param p2   pointer to another element
45  *
46  * @return  1 if the elements are identically, zero else
47  */
48 typedef unsigned (*cpset_hash_function) (const void *obj);
49
50 #define HashSet          cpset_t
51 #define HashSetIterator  cpset_iterator_t
52 #define HashSetEntry     cpset_hashset_entry_t
53 #define ValueType        void*
54 #define ADDITIONAL_DATA  cpset_cmp_function cmp_function; cpset_hash_function hash_function;
55 #include "hashset.h"
56 #undef ADDITIONAL_DATA
57 #undef ValueType
58 #undef HashSetEntry
59 #undef HashSetIterator
60 #undef HashSet
61
62 /**
63  * Initializes a cpset
64  *
65  * @param cpset        Pointer to allocated space for the cpset
66  * @param cmp_function The compare function to use
67  */
68 void cpset_init(cpset_t *cpset, cpset_hash_function hash_function,
69                 cpset_cmp_function cmp_function);
70
71 /**
72  * Initializes a cpset
73  *
74  * @param cpset               Pointer to allocated space for the cpset
75  * @param cmp_function        The compare function to use
76  * @param expected_elements   Number of elements expected in the cpset (roughly)
77  */
78 void cpset_init_size(cpset_t *cpset, cpset_hash_function hash_function,
79                      cpset_cmp_function cmp_function,
80                      size_t expected_elements);
81
82 /**
83  * Destroys a cpset and frees the memory allocated for hashtable. The memory of
84  * the cpset itself is not freed.
85  *
86  * @param cpset   Pointer to the cpset
87  */
88 void cpset_destroy(cpset_t *cpset);
89
90 /**
91  * Inserts an element into a cpset.
92  *
93  * @param cpset   Pointer to the cpset
94  * @param obj     Element to insert into the cpset
95  * @returns       The element itself or a pointer to an existing element
96  */
97 void* cpset_insert(cpset_t *cpset, void *obj);
98
99 /**
100  * Removes an element from a cpset. Does nothing if the cpset doesn't contain the
101  * element.
102  *
103  * @param cpset   Pointer to the cpset
104  * @param obj     Pointer to remove from the cpset
105  */
106 void cpset_remove(cpset_t *cpset, const void *obj);
107
108 /**
109  * Tests whether a cpset contains a pointer
110  *
111  * @param cpset   Pointer to the cpset
112  * @param obj     The pointer to find
113  * @returns       An equivalent object to @p obj or NULL
114  */
115 void *cpset_find(const cpset_t *cpset, const void *obj);
116
117 /**
118  * Returns the number of pointers contained in the cpset
119  *
120  * @param cpset   Pointer to the cpset
121  * @returns       Number of pointers contained in the cpset
122  */
123 size_t cpset_size(const cpset_t *cpset);
124
125 /**
126  * Initializes a cpset iterator. Sets the iterator before the first element in
127  * the cpset.
128  *
129  * @param iterator   Pointer to already allocated iterator memory
130  * @param cpset       Pointer to the cpset
131  */
132 void cpset_iterator_init(cpset_iterator_t *iterator, const cpset_t *cpset);
133
134 /**
135  * Advances the iterator and returns the current element or NULL if all elements
136  * in the cpset have been processed.
137  * @attention It is not allowed to use cpset_insert or cpset_remove while
138  *            iterating over a cpset.
139  *
140  * @param iterator  Pointer to the cpset iterator.
141  * @returns         Next element in the cpset or NULL
142  */
143 void *cpset_iterator_next(cpset_iterator_t *iterator);
144
145 /**
146  * Removed the element the iterator currently points to
147  *
148  * @param cpset     Pointer to the cpset
149  * @param iterator  Pointer to the cpset iterator.
150  */
151 void cpset_remove_iterator(cpset_t *cpset, const cpset_iterator_t *iterator);
152
153 #endif /* FIRM_ADT_CPSET_H */