]>
Commit | Line | Data |
---|---|---|
28bf4b0b | 1 | /* |
2 | ** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2001. | |
3 | ** See ../LICENSE for license information. | |
4 | ** | |
5 | */ | |
6 | /* | |
7 | ** genericTable.h | |
8 | */ | |
9 | ||
10 | # ifndef GHTABLE_H | |
11 | # define GHTABLE_H | |
12 | ||
13 | /*@constant int GHBUCKET_BASESIZE; @*/ | |
14 | # define GHBUCKET_BASESIZE 2 | |
15 | ||
16 | /* in forwardTypes: | |
17 | abst_typedef null struct _genericTable *genericTable; | |
18 | */ | |
19 | ||
20 | /*@private@*/ typedef struct | |
21 | { | |
22 | /*@only@*/ cstring key; | |
23 | /*@only@*/ void *val; | |
24 | } *ghentry; | |
25 | ||
26 | typedef /*@only@*/ ghentry o_ghentry; | |
27 | ||
28 | typedef /*@null@*/ struct | |
29 | { | |
30 | int size; | |
31 | int nspace; | |
32 | /*@only@*/ o_ghentry *entries; | |
33 | } *ghbucket; | |
34 | ||
35 | typedef /*@only@*/ ghbucket o_ghbucket; | |
36 | ||
37 | struct s_genericTable | |
38 | { | |
39 | int size; | |
40 | int nentries; | |
41 | /*@only@*/ o_ghbucket *buckets; | |
42 | } ; | |
43 | ||
44 | /*@constant null genericTable genericTable_undefined; @*/ | |
45 | # define genericTable_undefined ((genericTable) NULL) | |
46 | ||
47 | extern /*@falsenull@*/ bool genericTable_isDefined(genericTable) /*@*/ ; | |
48 | # define genericTable_isDefined(p_h) ((p_h) != genericTable_undefined) | |
49 | ||
50 | extern /*@truenull@*/ /*@unused@*/ bool genericTable_isUndefined(genericTable) /*@*/ ; | |
51 | # define genericTable_isUndefined(p_h) ((p_h) == genericTable_undefined) | |
52 | ||
53 | extern /*@only@*/ genericTable genericTable_create (int p_size); | |
54 | ||
55 | extern int genericTable_size (genericTable p_h); | |
56 | ||
57 | extern void genericTable_insert (genericTable p_h, /*@only@*/ cstring p_key, | |
58 | /*@only@*/ void *p_value); | |
59 | extern /*@null@*/ /*@exposed@*/ void *genericTable_lookup (genericTable p_h, cstring p_key); | |
60 | ||
61 | extern bool genericTable_contains (genericTable p_h, cstring p_key) /*@*/ ; | |
62 | ||
63 | extern /*@unused@*/ /*@only@*/ cstring genericTable_stats (genericTable p_h); | |
64 | extern void genericTable_free (/*@only@*/ genericTable p_h); | |
65 | extern void genericTable_remove (genericTable p_h, cstring p_key) /*@modifies p_h@*/ ; | |
66 | ||
67 | extern /*@unused@*/ void genericTable_update (genericTable p_h, cstring p_key, | |
68 | /*@only@*/ void *p_newval) /*@modifies p_h@*/ ; | |
69 | ||
70 | /*@iter genericTable_elements (sef genericTable p_g, yield exposed cstring m_key, yield exposed void *m_el)@*/ | |
71 | ||
72 | # define genericTable_elements(p_g, m_key, m_el) \ | |
73 | { int m_ind; if (genericTable_isDefined (p_g)) \ | |
74 | { for (m_ind = 0 ; m_ind < (p_g)->size; m_ind++) \ | |
75 | { ghbucket m_hb; m_hb = (p_g)->buckets[m_ind]; \ | |
76 | if (m_hb != NULL) { \ | |
77 | int m_j; \ | |
78 | for (m_j = 0; m_j < (m_hb)->size; m_j++) { \ | |
79 | cstring m_key; void *m_el; m_key = (m_hb)->entries[m_j]->key; \ | |
80 | m_el = (m_hb)->entries[m_j]->val; | |
81 | # define end_genericTable_elements }}}}} | |
82 | ||
83 | ||
84 | # else | |
85 | # error "Multiple include" | |
86 | # endif | |
87 | ||
88 | ||
89 | ||
90 | ||
91 | ||
92 | ||
93 | ||
94 | ||
95 | ||
96 | ||
97 | ||
98 | ||
99 |