* Use a symbol table to represent identifiers and attribute names
efficiently. The symbol table ensures that there is only one copy of each symbol, thus allowing symbols to be compared efficiently using a pointer equality test.
This commit is contained in:
		
							parent
							
								
									10e8b1fd15
								
							
						
					
					
						commit
						ac1e8f40d4
					
				
					 15 changed files with 228 additions and 101 deletions
				
			
		
							
								
								
									
										75
									
								
								src/libexpr/symbol-table.hh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								src/libexpr/symbol-table.hh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,75 @@ | |||
| #ifndef __SYMBOL_TABLE_H | ||||
| #define __SYMBOL_TABLE_H | ||||
| 
 | ||||
| #include <map> | ||||
| 
 | ||||
| #include "types.hh" | ||||
| 
 | ||||
| namespace nix { | ||||
| 
 | ||||
| /* Symbol table used by the parser and evaluator to represent and look
 | ||||
|    up identifiers and attribute sets efficiently. | ||||
|    SymbolTable::create() converts a string into a symbol.  Symbols | ||||
|    have the property that they can be compared efficiently (using a | ||||
|    pointer equality test), because the symbol table stores only one | ||||
|    copy of each string. */ | ||||
| 
 | ||||
| class Symbol | ||||
| { | ||||
| private: | ||||
|     const string * s; // pointer into SymbolTable
 | ||||
|     Symbol(const string * s) : s(s) { }; | ||||
|     friend class SymbolTable; | ||||
| 
 | ||||
| public: | ||||
|     bool operator == (const Symbol & s2) const | ||||
|     { | ||||
|         return s == s2.s; | ||||
|     } | ||||
|      | ||||
|     bool operator != (const Symbol & s2) const | ||||
|     { | ||||
|         return s != s2.s; | ||||
|     } | ||||
|      | ||||
|     bool operator < (const Symbol & s2) const | ||||
|     { | ||||
|         return s < s2.s; | ||||
|     } | ||||
| 
 | ||||
|     operator const string & () const | ||||
|     { | ||||
|         return *s; | ||||
|     } | ||||
| 
 | ||||
|     bool empty() const | ||||
|     { | ||||
|         return s->empty(); | ||||
|     } | ||||
| 
 | ||||
|     friend std::ostream & operator << (std::ostream & str, const Symbol & sym); | ||||
| }; | ||||
| 
 | ||||
| inline std::ostream & operator << (std::ostream & str, const Symbol & sym) | ||||
| { | ||||
|     str << *sym.s; | ||||
|     return str; | ||||
| } | ||||
| 
 | ||||
| class SymbolTable | ||||
| { | ||||
| private: | ||||
|     typedef std::set<string> Symbols; | ||||
|     Symbols symbols; | ||||
| 
 | ||||
| public: | ||||
|     Symbol create(const string & s) | ||||
|     { | ||||
|         std::pair<Symbols::iterator, bool> res = symbols.insert(s); | ||||
|         return Symbol(&*res.first); | ||||
|     } | ||||
| }; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| #endif /* !__SYMBOL_TABLE_H */ | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue