2 ** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2001.
3 ** See ../LICENSE for license information.
13 /*@constant int GHBUCKET_BASESIZE; @*/
14 # define GHBUCKET_BASESIZE 2
17 abst_typedef null struct _genericTable *genericTable;
20 /*@private@*/ typedef struct
22 /*@only@*/ cstring key;
26 typedef /*@only@*/ ghentry o_ghentry;
28 typedef /*@null@*/ struct
32 /*@only@*/ o_ghentry *entries;
35 typedef /*@only@*/ ghbucket o_ghbucket;
41 /*@only@*/ o_ghbucket *buckets;
44 /*@constant null genericTable genericTable_undefined; @*/
45 # define genericTable_undefined ((genericTable) NULL)
47 extern /*@falsenull@*/ bool genericTable_isDefined(genericTable) /*@*/ ;
48 # define genericTable_isDefined(p_h) ((p_h) != genericTable_undefined)
50 extern /*@truenull@*/ /*@unused@*/ bool genericTable_isUndefined(genericTable) /*@*/ ;
51 # define genericTable_isUndefined(p_h) ((p_h) == genericTable_undefined)
53 extern /*@only@*/ genericTable genericTable_create (int p_size);
55 extern int genericTable_size (genericTable p_h);
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);
61 extern bool genericTable_contains (genericTable p_h, cstring p_key) /*@*/ ;
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@*/ ;
67 extern /*@unused@*/ void genericTable_update (genericTable p_h, cstring p_key,
68 /*@only@*/ void *p_newval) /*@modifies p_h@*/ ;
70 /*@iter genericTable_elements (sef genericTable p_g, yield exposed cstring m_key, yield exposed void *m_el)@*/
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]; \
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 }}}}}
85 # error "Multiple include"