|
FAUST compiler
0.9.9.6b8
|
Symbols are unique objects with a name stored in a hash table. More...
#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. | |
Symbols are unique objects with a name stored in a hash table.
| 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 158 of file symbol.cpp.
References len().
{
int len = strlen(str);
fName = new char [len+1];
memcpy(fName, str, len+1);
fHash = hsh;
fNext = nxt;
fData = 0;
}

| Symbol::~Symbol | ( | ) | [private] |
| unsigned int Symbol::calcHashKey | ( | const char * | str | ) | [static, private] |
Compute the 32-bits hash key of string str.
| str | the string |
Definition at line 140 of file symbol.cpp.
{
unsigned int h = 0;
while (*str) h = (h << 1) ^ (h >> 20) ^ (*str++);
return h;
}
| 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 127 of file symbol.cpp.
Referenced by get(), and isnew().

| 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 46 of file symbol.cpp.
Referenced by symbol().
{
char buf[1024];
int i;
int n = str.length();
if (n>1023) n = 1023;
for (i = 0; i < n; i++) { buf[i] = str[i]; }
buf[i] = 0;
return Symbol::get(buf);
}

| 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 67 of file symbol.cpp.
References equiv(), and fNext.
{
unsigned int hsh = calcHashKey(str);
int bckt = hsh % kHashTableSize;
Symbol* item = gSymbolTable[bckt];
while ( item && !item->equiv(hsh,str) ) item = item->fNext;
Symbol* r = item ? item : gSymbolTable[bckt] = new Symbol(str, hsh, gSymbolTable[bckt]);
return r;
}

| 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 85 of file symbol.cpp.
References equiv(), and fNext.
{
unsigned int hsh = calcHashKey(str);
int bckt = hsh % kHashTableSize;
Symbol* item = gSymbolTable[bckt];
while ( item && !item->equiv(hsh,str) ) item = item->fNext;
return item == 0;
}

| 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 102 of file symbol.cpp.
References name().
Referenced by unique().
{
char name[256];
static map<const char*, unsigned int> gPrefixCounters;
for (int n = 0; n<10000; n++) {
snprintf(name, 256, "%s%d", str, gPrefixCounters[str]++);
if (isnew(name)) return get(name);
}
assert(false);
return get("UNIQUEOVERFLOW");
}


| ostream & Symbol::print | ( | ostream & | fout | ) | const |
print a symbol on a stream
< print a symbol on a stream
Definition at line 174 of file symbol.cpp.
Referenced by operator<<().
{
return fout << fName;
}

| void* getUserData | ( | Symbol * | sym | ) | [friend] |
| void setUserData | ( | Symbol * | sym, |
| void * | d | ||
| ) | [friend] |
void* Symbol::fData [private] |
Field to user disposal to store additional data.
Definition at line 66 of file symbol.hh.
Referenced by getUserData(), and setUserData().
unsigned int Symbol::fHash [private] |
char* Symbol::fName [private] |
Symbol* Symbol::fNext [private] |
Symbol * Symbol::gSymbolTable [static, private] |
const int Symbol::kHashTableSize = 511 [static, private] |
1.8.0