X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/1059e1cc0c2ecfa237406949aa26155b6a5b9154..66f23d4fabf89ad09adbd4dfc15ac6b5b2b7da83:/interpreter/preprocessor/faust-0.9.47mr3/compiler/headers/symbol.hh diff --git a/interpreter/preprocessor/faust-0.9.47mr3/compiler/headers/symbol.hh b/interpreter/preprocessor/faust-0.9.47mr3/compiler/headers/symbol.hh new file mode 100644 index 0000000..5a24a74 --- /dev/null +++ b/interpreter/preprocessor/faust-0.9.47mr3/compiler/headers/symbol.hh @@ -0,0 +1,108 @@ +/************************************************************************ + ************************************************************************ + FAUST compiler + Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale + --------------------------------------------------------------------- + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + ************************************************************************ + ************************************************************************/ + +/** \file symbol.hh + * A library to create and manipulate symbols with a unique name. + * A library of functions to create and manipulate symbols with a unique name. + * + * API: + * + * - Sym q = symbol("abcd"); returns the symbol of name "abcd" + * - const char* s = name(q); returns the name of symbol q + * - Sym q = unique("TOTO"); returns a new unique symbol of name "TOTOnnn" + * + * Properties: + * + * If p and q are two symbols then : + * p != q <=> name(p) != name(q) + * + */ + + +#ifndef __SYMBOL__ +#define __SYMBOL__ + +#include +#include + +using namespace std; + +//--------------------------------SYMBOL------------------------------------- + +/** + * Symbols are unique objects with a name stored in a hash table. + */ +class Symbol +{ + + private: + + 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 + + + // Fields + 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 + + // Constructors & destructors + 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 + + // Others + bool equiv (unsigned int hash, const char* str) const ; ///< Check if the name of the symbol is equal to string \p str + static unsigned int calcHashKey (const char* str); ///< Compute the 32-bits hash key of string \p str + + // Static methods + static Symbol* get (const string& str); ///< Get the symbol of name \p str + static Symbol* get (const char* str); ///< Get the symbol of name \p str + static Symbol* prefix (const char* str); ///< Creates a new symbol of name prefixed by \p str + static bool isnew (const char* str); ///< Returns \b true if no symbol of name \p str exists + + public: + ostream& print (ostream& fout) const; ///< print a symbol on a stream + + friend Symbol* symbol (const char* str); + friend Symbol* symbol (const string& str); + friend Symbol* unique (const char* str); + friend const char* name (Symbol* sym); + + friend void* getUserData (Symbol* sym); + friend void setUserData (Symbol* sym, void* d); + +}; + +inline Symbol* symbol (const char* str) { return Symbol::get(str); } ///< Returns (and creates if new) the symbol of name \p str +inline Symbol* symbol (const string& str) { return Symbol::get(str); } ///< Returns (and creates if new) the symbol of name \p str +inline Symbol* unique (const char* str) { return Symbol::prefix(str);} ///< Returns a new unique symbol of name strxxx +inline const char* name (Symbol* sym) { return sym->fName; } ///< Returns the name of a symbol + +inline void* getUserData (Symbol* sym) { return sym->fData; } ///< Returns user data +inline void setUserData (Symbol* sym, void* d) { sym->fData=d; } ///< Set user data + +inline ostream& operator << (ostream& s, const Symbol& n) { return n.print(s); } + + +typedef Symbol* Sym; + +#endif