New directory tree, with preprocessor/ inside interpretor/.
[Faustine.git] / interpretor / preprocessor / faust-0.9.47mr3 / compiler / tlib / symbol.hh
diff --git a/interpretor/preprocessor/faust-0.9.47mr3/compiler/tlib/symbol.hh b/interpretor/preprocessor/faust-0.9.47mr3/compiler/tlib/symbol.hh
new file mode 100644 (file)
index 0000000..5a24a74
--- /dev/null
@@ -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.
+ * 
+ *  <b>API:</b>
+ *
+ *   - Sym q = symbol("abcd");     <i>returns the symbol of name "abcd"</i>
+ *   - const char* s = name(q);    <i>returns the name of symbol q</i>
+ *   - Sym q = unique("TOTO");    <i>returns a new unique symbol of name "TOTOnnn"</i>  
+ *
+ *  <b>Properties:</b>
+ *
+ *     If p and q are two symbols then : 
+ *        p != q  <=>  name(p) != name(q)
+ *
+ */ 
+
+#ifndef     __SYMBOL__
+#define     __SYMBOL__
+
+#include <string>
+#include <map>
+
+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