diff options
author | Vincent Ambo <tazjin@google.com> | 2020-05-21T03·53+0100 |
---|---|---|
committer | Vincent Ambo <tazjin@google.com> | 2020-05-21T04·09+0100 |
commit | 97e85f94e5ee7e6c8340011757a71222b8091cda (patch) | |
tree | eb46a1e2a1b06508a30f7b46aa050bc51b24d2b6 /third_party/nix/src/libexpr/symbol-table.hh | |
parent | 00017ace042d183400be78269e99e2952746cce1 (diff) |
refactor(3p/nix/libexpr): Use absl::node_hash_set in SymbolTable r/794
This replaces the previous use of std::unordered_set with absl::node_hash_set. This type was chosen because the current implementation requires pointer stability. This does not yet touch the 'Attr' struct. As a bonus, the implementation of the SymbolTable struct is now consolidated into a single header/implementation file pair.
Diffstat (limited to 'third_party/nix/src/libexpr/symbol-table.hh')
-rw-r--r-- | third_party/nix/src/libexpr/symbol-table.hh | 37 |
1 files changed, 15 insertions, 22 deletions
diff --git a/third_party/nix/src/libexpr/symbol-table.hh b/third_party/nix/src/libexpr/symbol-table.hh index 8c27cf8ec723..62c0b48a173b 100644 --- a/third_party/nix/src/libexpr/symbol-table.hh +++ b/third_party/nix/src/libexpr/symbol-table.hh @@ -1,11 +1,11 @@ #pragma once -#include <map> -#include <unordered_set> +#include <absl/container/node_hash_set.h> +#include <absl/strings/string_view.h> #include "types.hh" -namespace nix { +namespace nix { // TODO(tazjin): ::expr /* Symbol table used by the parser and evaluator to represent and look up identifiers and attributes efficiently. SymbolTable::create() @@ -15,8 +15,8 @@ namespace nix { class Symbol { private: - const string* s; // pointer into SymbolTable - Symbol(const string* s) : s(s){}; + const std::string* s; // pointer into SymbolTable + Symbol(const std::string* s) : s(s){}; friend class SymbolTable; public: @@ -28,7 +28,7 @@ class Symbol { bool operator<(const Symbol& s2) const { return s < s2.s; } - operator const string&() const { return *s; } + operator const std::string&() const { return *s; } bool set() const { return s; } @@ -38,26 +38,19 @@ class Symbol { }; class SymbolTable { - private: - typedef std::unordered_set<string> Symbols; - Symbols symbols; - public: - Symbol create(const string& s) { - std::pair<Symbols::iterator, bool> res = symbols.insert(s); - return Symbol(&*res.first); - } + Symbol Create(absl::string_view sym); - size_t size() const { return symbols.size(); } + // TODO(tazjin): two of these? + size_t Size() const; - size_t totalSize() const; + // Return the total size (in bytes) + size_t TotalSize() const; - template <typename T> - void dump(T callback) { - for (auto& s : symbols) { - callback(s); - } - } + private: + // flat_hash_set does not retain pointer stability on rehashing, + // hence "interned" strings/symbols are stored on the heap. + absl::node_hash_set<std::string> symbols_; }; } // namespace nix |