Initial revision
[libfirm] / ir / adt / set.h
1 /* Declarations for set.
2    Copyright (C) 1995, 1996 Markus Armbruster */
3
4 #ifndef _SET_H
5 #define _SET_H
6
7 #include <stddef.h>
8
9 typedef struct set set;
10
11 typedef struct set_entry {
12   unsigned hash;
13   size_t size;
14   int dptr[1];                  /* data copied in must not need more
15                                    alignment than this */
16 } set_entry;
17
18
19 typedef int (*set_cmp_fun) (const void *elt, const void *key, size_t size);
20
21 set *new_set (set_cmp_fun, int slots);
22 void del_set (set *);
23
24 void *set_find (set *, const void *key, size_t, unsigned hash);
25 void *set_insert (set *, const void *key, size_t, unsigned hash);
26 set_entry *set_hinsert (set *, const void *key, size_t, unsigned hash);
27
28 void *set_first (set *);
29 void *set_next (set *);
30 void set_break (set *);
31
32 #define new_set(cmp, slots) (SET_TRACE (new_set) ((cmp), (slots)))
33 #define set_find(set, key, size, hash) \
34   _set_search ((set), (key), (size), (hash), _set_find)
35 #define set_insert(set, key, size, hash) \
36   _set_search ((set), (key), (size), (hash), _set_insert)
37 #define set_hinsert(set, key, size, hash) \
38   ((set_entry *)_set_search ((set), (key), (size), (hash), _set_hinsert))
39
40 #define SET_VRFY(set) (void)0
41
42 #ifdef STATS
43 void set_stats (set *);
44 #else
45 # define set_stats(s) ((void)0)
46 #endif
47
48 #ifdef DEBUG
49 void set_describe (set *);
50 #endif
51
52
53 /* Private */
54
55 typedef enum { _set_find, _set_insert, _set_hinsert } _set_action;
56
57 void *_set_search (set *, const void *, size_t, unsigned, _set_action);
58
59 #if defined(DEBUG) && defined(HAVE_GNU_MALLOC)
60 extern const char *set_tag;
61 # ifdef SET_ID
62 #   define SET_TRACE set_tag = SET_ID,
63 # else
64 #   define SET_TRACE set_tag = __FILE__,
65 # endif
66 #else /* !(DEBUG && HAVE_GNU_MALLOC) */
67 #   define SET_TRACE
68 #endif /* !(DEBUG && HAVE_GNU_MALLOC) */
69
70 #endif