revised all sets/maps hashing pointers to use the HASHPTR macro
[libfirm] / ir / adt / eset.c
1 /*
2  * Project:     libFIRM
3  * File name:   ir/adt/eset.c
4  * Purpose:     Datentyp: Vereinfachte Menge (hash-set) zum Speichern von
5  *              Zeigern/Adressen.
6  * Author:      Hubert Schmid
7  * Modified by:
8  * Created:     09.06.2002
9  * CVS-ID:      $Id$
10  * Copyright:   (c) 2002 Universität Karlsruhe
11  * Licence:     This file protected by GPL -  GNU GENERAL PUBLIC LICENSE.
12  */
13
14 #include "eset.h"
15 #include "set.h"
16 #include "hashptr.h"
17
18 struct eset {
19   int dummy; /* dummy entry */
20 };
21
22
23 #define INITIAL_SLOTS 64
24
25 static int pcmp(const void *p1, const void *p2, size_t size) {
26   const void **q1 = (const void **)p1;
27   const void **q2 = (const void **)p2;
28
29   return *q1 != *q2;
30 }
31
32
33 eset * eset_create(void) {
34   return (eset *) new_set(pcmp, INITIAL_SLOTS);
35 }
36
37
38 eset * eset_copy(eset *source) {
39   eset * ret = eset_create();
40   void * p;
41   for (p = eset_first(source); p; p = eset_next(source)) {
42     eset_insert(ret, p);
43   }
44   return ret;
45 }
46
47
48 void eset_destroy(eset *s) {
49   del_set((set *)s);
50 }
51
52
53 void eset_insert(eset *s, void *p) {
54   if (!eset_contains(s, p)) {
55     set_insert((set *)s, &p, sizeof(p), HASH_PTR(p));
56   }
57 }
58
59
60 bool eset_contains(eset *s, void *p) {
61   return set_find((set *)s, &p, sizeof(p), HASH_PTR(p)) != NULL;
62 }
63
64
65 void * eset_first(eset *s) {
66   void * p = set_first((set *) s);
67   return p == NULL ? NULL : *((void **)p);
68 }
69
70
71 void * eset_next(eset *s) {
72   void *p = set_next((set *) s);
73   return p == NULL ? NULL : *((void **)p);
74 }
75
76
77 void eset_insert_all(eset *target, eset *source) {
78   void *p;
79   for (p = eset_first(source); p; p = eset_next(source)) {
80     eset_insert(target, p);
81   }
82 }