#include <symbol.hh>
Public Member Functions | |
ostream & | print (ostream &fout) const |
print a symbol on a stream | |
Private Member Functions | |
Symbol (const char *str, unsigned int hsh, Symbol *nxt) | |
Constructs a new symbol ready to be placed in the hash table. | |
~Symbol () | |
The Destructor is never used. | |
bool | equiv (unsigned int hash, const char *str) const |
Check if the name of the symbol is equal to string str . | |
Static Private Member Functions | |
static unsigned int | calcHashKey (const char *str) |
Compute the 32-bits hash key of string str . | |
static Symbol * | get (const string &str) |
Get the symbol of name str . | |
static Symbol * | get (const char *str) |
Get the symbol of name str . | |
static Symbol * | prefix (const char *str) |
Creates a new symbol of name prefixed by str . | |
static bool | isnew (const char *str) |
Returns true if no symbol of name str exists. | |
Private Attributes | |
char * | fName |
Name of the symbol. | |
unsigned int | fHash |
Hash key computed from the name and used to determine the hash table entry. | |
Symbol * | fNext |
Next symbol in the hash table entry. | |
void * | fData |
Field to user disposal to store additional data. | |
Static Private Attributes | |
static const int | kHashTableSize = 511 |
Size of the hash table (a prime number is recommended). | |
static Symbol * | gSymbolTable [kHashTableSize] |
Hash table used to store the symbols. | |
Friends | |
Symbol * | symbol (const char *str) |
Returns (and creates if new) the symbol of name str . | |
Symbol * | symbol (const string &str) |
Returns (and creates if new) the symbol of name str . | |
Symbol * | unique (const char *str) |
Returns a new unique symbol of name strxxx. | |
const char * | name (Symbol *sym) |
Returns the name of a symbol. | |
void * | getUserData (Symbol *sym) |
Returns user data. | |
void | setUserData (Symbol *sym, void *d) |
Set user data. |
Definition at line 52 of file symbol.hh.
Symbol::Symbol | ( | const char * | str, | |
unsigned int | hsh, | |||
Symbol * | nxt | |||
) | [private] |
Constructs a new symbol ready to be placed in the hash table.
Constructs a symbol ready to be placed in the hash table.
It makes a private copy of its name.
str | the name of the symbol | |
hsh | the hash key of the symbol | |
nxt | a pointer to the next symbol in the hash table entry |
Definition at line 151 of file symbol.cpp.
References fData, fHash, fName, and fNext.
00152 { 00153 int len = strlen(str); 00154 00155 fName = new char [len+1]; 00156 memcpy(fName, str, len+1); 00157 fHash = hsh; 00158 fNext = nxt; 00159 fData = 0; 00160 }
unsigned int Symbol::calcHashKey | ( | const char * | str | ) | [static, private] |
Compute the 32-bits hash key of string str
.
str | the string |
Definition at line 133 of file symbol.cpp.
Referenced by get(), and isnew().
00134 { 00135 unsigned int h = 0; 00136 00137 while (*str) h = (h << 1) ^ (h >> 20) ^ (*str++); 00138 return h; 00139 }
bool Symbol::equiv | ( | unsigned int | hash, | |
const char * | str | |||
) | const [private] |
Check if the name of the symbol is equal to string str
.
Check if the name of the symbol is equal to string str
This method is used by isnew() and make() when searching the hashtable for an existing symbol.
hash | the hash key of the string (used to speedup the comparison) | |
str | the string to compare |
true
if the name of the symbol and str
are the same Definition at line 120 of file symbol.cpp.
Referenced by get(), and isnew().
Symbol * Symbol::get | ( | const char * | str | ) | [static, private] |
Get the symbol of name str
.
Search the hash table for the symbol of name str
or returns a new one.
str | the name of the symbol |
Definition at line 63 of file symbol.cpp.
References calcHashKey(), equiv(), fNext, gSymbolTable, and kHashTableSize.
00064 { 00065 unsigned int hsh = calcHashKey(str); 00066 int bckt = hsh % kHashTableSize; 00067 Symbol* item = gSymbolTable[bckt]; 00068 00069 while ( item && !item->equiv(hsh,str) ) item = item->fNext; 00070 Symbol* r = item ? item : gSymbolTable[bckt] = new Symbol(str, hsh, gSymbolTable[bckt]); 00071 return r; 00072 }
Symbol * Symbol::get | ( | const string & | str | ) | [static, private] |
Get the symbol of name str
.
Search the hash table for the symbol of name str
or returns a new one.
str | the name of the symbol |
Definition at line 42 of file symbol.cpp.
Referenced by symbol().
00043 { 00044 char buf[1024]; 00045 int i; 00046 int n = str.length(); 00047 00048 if (n>1023) n = 1023; 00049 for (i = 0; i < n; i++) { buf[i] = str[i]; } 00050 buf[i] = 0; 00051 00052 return Symbol::get(buf); 00053 }
bool Symbol::isnew | ( | const char * | str | ) | [static, private] |
Returns true if no symbol of name str
exists.
Static method that searches the symbol table for a string.
str | string to search |
Definition at line 81 of file symbol.cpp.
References calcHashKey(), equiv(), fNext, gSymbolTable, and kHashTableSize.
Referenced by prefix().
00082 { 00083 unsigned int hsh = calcHashKey(str); 00084 int bckt = hsh % kHashTableSize; 00085 Symbol* item = gSymbolTable[bckt]; 00086 00087 while ( item && !item->equiv(hsh,str) ) item = item->fNext; 00088 return item == 0; 00089 }
Symbol * Symbol::prefix | ( | const char * | str | ) | [static, private] |
Creates a new symbol of name prefixed by str
.
Creates a new symbol with a name obtained by concatenating the str
prefix with a number in order to make it unique.
str | the prefix of the name |
prefix++n
Definition at line 98 of file symbol.cpp.
Referenced by unique().
00099 { 00100 char name[256]; 00101 00102 for (int n = 0; n<10000; n++) { 00103 snprintf(name, 256, "%s%d", str, n); 00104 if (isnew(name)) return get(name); 00105 } 00106 return get("UNIQUEOVERFLOW"); 00107 }
ostream & Symbol::print | ( | ostream & | fout | ) | const |
print a symbol on a stream
< print a symbol on a stream
Definition at line 164 of file symbol.cpp.
00165 { 00166 return fout << fName; 00167 }