q#
This commit is contained in:
58
LGPL/PLStream/pl-table.h
Normal file
58
LGPL/PLStream/pl-table.h
Normal file
@@ -0,0 +1,58 @@
|
||||
/*****
|
||||
Hash Tables pl-table.h
|
||||
****/
|
||||
|
||||
#define LMASK_BITS 7 /* total # mask bits */
|
||||
|
||||
#define TABLE_MASK 0xf0000000UL
|
||||
|
||||
#define pointerHashValue(p, size) ((((intptr_t)(p) >> LMASK_BITS) ^ \
|
||||
((intptr_t)(p) >> (LMASK_BITS+5)) ^ \
|
||||
((intptr_t)(p))) & \
|
||||
((size)-1))
|
||||
|
||||
typedef struct symbol * Symbol; /* symbol of hash table */
|
||||
|
||||
/* hash Table + lock + scaling + enumerator */
|
||||
typedef struct table *Table;
|
||||
|
||||
typedef struct table_enum* TableEnum;
|
||||
|
||||
/* symbol table hash package */
|
||||
|
||||
struct table
|
||||
{ int buckets; /* size of hash table */
|
||||
int size; /* # symbols in the table */
|
||||
TableEnum enumerators; /* Handles for enumeration */
|
||||
#ifdef O_PLMT
|
||||
simpleMutex *mutex; /* Mutex to guard table */
|
||||
#endif
|
||||
void (*copy_symbol)(Symbol s);
|
||||
void (*free_symbol)(Symbol s);
|
||||
Symbol *entries; /* array of hash symbols */
|
||||
};
|
||||
|
||||
struct symbol
|
||||
{ Symbol next; /* next in chain */
|
||||
void * name; /* name entry of symbol */
|
||||
void * value; /* associated value with name */
|
||||
};
|
||||
|
||||
struct table_enum
|
||||
{ Table table; /* Table we are working on */
|
||||
int key; /* Index of current symbol-chain */
|
||||
Symbol current; /* The current symbol */
|
||||
TableEnum next; /* More choice points */
|
||||
};
|
||||
|
||||
extern void initTables(void);
|
||||
extern Table newHTable(int size);
|
||||
extern void destroyHTable(Table ht);
|
||||
extern Symbol lookupHTable(Table ht, void *name);
|
||||
extern Symbol addHTable(Table ht, void *name, void *value);
|
||||
extern void deleteSymbolHTable(Table ht, Symbol s);
|
||||
extern void clearHTable(Table ht);
|
||||
extern Table copyHTable(Table org);
|
||||
extern TableEnum newTableEnum(Table ht);
|
||||
extern void freeTableEnum(TableEnum e);
|
||||
extern Symbol advanceTableEnum(TableEnum e);
|
Reference in New Issue
Block a user