Added interprocedural view
[libfirm] / ir / adt / eset.c
1 /* -------------------------------------------------------------------
2  * $Id$
3  * -------------------------------------------------------------------
4  * Datentyp: Vereinfachte Menge (hash-set) zum Speichern von
5  * Zeigern/Adressen.
6  *
7  * Erstellt: Hubert Schmid, 09.06.2002
8  * ---------------------------------------------------------------- */
9
10
11 #include "eset.h"
12
13 #include "set.h"
14
15
16 struct eset {
17   int dummy; /* dummy entry */
18 };
19
20
21 static const int INITIAL_SLOTS = 64;
22
23
24 static int pcmp(const void * * p1, const void * * p2, size_t size) {
25   return *p1 == *p2 ? 0 : 1;
26 }
27
28
29 eset * eset_create(void) {
30   return (eset *) new_set((set_cmp_fun) pcmp, INITIAL_SLOTS);
31 }
32
33
34 eset * eset_copy(eset * source) {
35   eset * ret = eset_create();
36   void * p;
37   for (p = eset_first(source); p; p = eset_next(source)) {
38     eset_insert(ret, p);
39   }
40   return ret;
41 }
42
43
44 void eset_destroy(eset * s) {
45   del_set((set *) s);
46 }
47
48
49 void eset_insert(eset * s, void * p) {
50   if (!eset_contains(s, p)) {
51     set_insert((set *) s, &p, sizeof(void *), (unsigned) p);
52   }
53 }
54
55
56 bool eset_contains(eset * s, void * p) {
57   return set_find((set *) s, &p, sizeof(void *), (unsigned) p) != NULL;
58 }
59
60
61 void * eset_first(eset * s) {
62   void * p = set_first((set *) s);
63   return p == NULL ? NULL : *((void * *) p);
64 }
65
66
67 void * eset_next(eset *s) {
68   void * p = set_next((set *) s);
69   return p == NULL ? NULL : *((void * *) p);
70 }
71
72
73 void eset_insert_all(eset * target, eset * source) {
74   void * p;
75   for (p = eset_first(source); p; p = eset_next(source)) {
76     eset_insert(target, p);
77   }
78 }