/*
** Copyright (C) University of Virginia, Massachusetts Institue of Technology 1994-2003.
** See ../LICENSE for license information.
**
*/
/*
** genericTable.h
*/
# ifndef GHTABLE_H
# define GHTABLE_H
/*@constant int GHBUCKET_BASESIZE; @*/
# define GHBUCKET_BASESIZE 2
/* in forwardTypes:
abst_typedef null struct _genericTable *genericTable;
*/
/*:private:*/ typedef struct
{
/*@only@*/ cstring key;
/*@only@*/ void *val;
} *ghentry;
typedef /*@only@*/ ghentry o_ghentry;
typedef /*@null@*/ struct
{
int size;
int nspace;
/*@only@*/ o_ghentry *entries;
} *ghbucket;
typedef /*@only@*/ ghbucket o_ghbucket;
struct s_genericTable
{
int size;
int nentries;
/*@only@*/ o_ghbucket *buckets;
} ;
/*@constant null genericTable genericTable_undefined; @*/
# define genericTable_undefined ((genericTable) NULL)
extern /*@falsewhennull@*/ bool genericTable_isDefined(genericTable) /*@*/ ;
# define genericTable_isDefined(p_h) ((p_h) != genericTable_undefined)
extern /*@nullwhentrue@*/ /*@unused@*/ bool genericTable_isUndefined(genericTable) /*@*/ ;
# define genericTable_isUndefined(p_h) ((p_h) == genericTable_undefined)
extern /*@only@*/ genericTable genericTable_create (int p_size);
extern int genericTable_size (genericTable p_h);
extern void genericTable_insert (genericTable p_h, /*@only@*/ cstring p_key,
/*@only@*/ void *p_value);
extern /*@null@*/ /*@exposed@*/ void *genericTable_lookup (genericTable p_h, cstring p_key);
extern bool genericTable_contains (genericTable p_h, cstring p_key) /*@*/ ;
extern /*@unused@*/ /*@only@*/ cstring genericTable_stats (genericTable p_h);
extern void genericTable_free (/*@only@*/ genericTable p_h);
extern void genericTable_remove (genericTable p_h, cstring p_key) /*@modifies p_h@*/ ;
extern /*@unused@*/ void genericTable_update (genericTable p_h, cstring p_key,
/*@only@*/ void *p_newval) /*@modifies p_h@*/ ;
/*@iter genericTable_elements (sef genericTable p_g, yield exposed cstring m_key, yield exposed void *m_el)@*/
# define genericTable_elements(p_g, m_key, m_el) \
{ int m_ind; if (genericTable_isDefined (p_g)) \
{ for (m_ind = 0 ; m_ind < (p_g)->size; m_ind++) \
{ ghbucket m_hb; m_hb = (p_g)->buckets[m_ind]; \
if (m_hb != NULL) { \
int m_j; \
for (m_j = 0; m_j < (m_hb)->size; m_j++) { \
cstring m_key; void *m_el; m_key = (m_hb)->entries[m_j]->key; \
m_el = (m_hb)->entries[m_j]->val;
# define end_genericTable_elements }}}}}
# else
# error "Multiple include"
# endif
syntax highlighted by Code2HTML, v. 0.9.1