mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-10 16:26:18 +02:00
76 lines
1.5 KiB
C++
76 lines
1.5 KiB
C++
|
#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 */
|