diff --git a/src/tint/symbol.cc b/src/tint/symbol.cc index b64947f43a..7e69b5dad1 100644 --- a/src/tint/symbol.cc +++ b/src/tint/symbol.cc @@ -52,6 +52,10 @@ std::string Symbol::to_str() const { return "$" + std::to_string(val_); } +std::string_view Symbol::NameView() const { + return name_; +} + std::string Symbol::Name() const { return std::string(name_); } diff --git a/src/tint/symbol.h b/src/tint/symbol.h index a31388d9ba..16d8409373 100644 --- a/src/tint/symbol.h +++ b/src/tint/symbol.h @@ -76,6 +76,10 @@ class Symbol { /// @return the string representation of the symbol std::string to_str() const; + /// Converts the symbol to the registered name + /// @returns the string_view representing the name of the symbol + std::string_view NameView() const; + /// Converts the symbol to the registered name /// @returns the string representing the name of the symbol std::string Name() const; diff --git a/src/tint/symbol_table.cc b/src/tint/symbol_table.cc index aae76ffb75..cdea0a488f 100644 --- a/src/tint/symbol_table.cc +++ b/src/tint/symbol_table.cc @@ -26,14 +26,17 @@ SymbolTable::~SymbolTable() = default; SymbolTable& SymbolTable::operator=(SymbolTable&&) = default; -Symbol SymbolTable::Register(const std::string& name) { +Symbol SymbolTable::Register(std::string_view name) { TINT_ASSERT(Symbol, !name.empty()); auto it = name_to_symbol_.Find(name); if (it) { return *it; } + return RegisterInternal(name); +} +Symbol SymbolTable::RegisterInternal(std::string_view name) { char* name_mem = name_allocator_.Allocate(name.length() + 1); if (name_mem == nullptr) { return Symbol(); @@ -43,26 +46,28 @@ Symbol SymbolTable::Register(const std::string& name) { std::string_view nv(name_mem, name.length()); Symbol sym(next_symbol_, program_id_, nv); - ++next_symbol_; - - name_to_symbol_.Add(name_mem, sym); + name_to_symbol_.Add(sym.NameView(), sym); return sym; } -Symbol SymbolTable::Get(const std::string& name) const { +Symbol SymbolTable::Get(std::string_view name) const { auto it = name_to_symbol_.Find(name); return it ? *it : Symbol(); } -Symbol SymbolTable::New(std::string prefix /* = "" */) { - if (prefix.empty()) { +Symbol SymbolTable::New(std::string_view prefix_view /* = "" */) { + std::string prefix; + if (prefix_view.empty()) { prefix = "tint_symbol"; + } else { + prefix = std::string(prefix_view); } + auto it = name_to_symbol_.Find(prefix); if (!it) { - return Register(prefix); + return RegisterInternal(prefix); } size_t i = 0; @@ -77,13 +82,13 @@ Symbol SymbolTable::New(std::string prefix /* = "" */) { name = prefix + "_" + std::to_string(i); } while (name_to_symbol_.Contains(name)); + auto sym = RegisterInternal(name); if (last_prefix) { *last_prefix = i; } else { last_prefix_to_index_.Add(prefix, i); } - - return Register(name); + return sym; } } // namespace tint diff --git a/src/tint/symbol_table.h b/src/tint/symbol_table.h index 5eeaec2452..723b81b249 100644 --- a/src/tint/symbol_table.h +++ b/src/tint/symbol_table.h @@ -56,12 +56,12 @@ class SymbolTable { /// Registers a name into the symbol table, returning the Symbol. /// @param name the name to register /// @returns the symbol representing the given name - Symbol Register(const std::string& name); + Symbol Register(std::string_view name); /// Returns the symbol for the given `name` /// @param name the name to lookup /// @returns the symbol for the name or Symbol() if not found. - Symbol Get(const std::string& name) const; + Symbol Get(std::string_view name) const; /// Returns a new unique symbol with the given name, possibly suffixed with a /// unique number. @@ -69,7 +69,7 @@ class SymbolTable { /// @returns a new, unnamed symbol with the given name. If the name is already /// taken then this will be suffixed with an underscore and a unique numerical /// value - Symbol New(std::string name = ""); + Symbol New(std::string_view name = ""); /// Foreach calls the callback function `F` for each symbol in the table. /// @param callback must be a function or function-like object with the @@ -88,6 +88,8 @@ class SymbolTable { SymbolTable(const SymbolTable&) = delete; SymbolTable& operator=(const SymbolTable& other) = delete; + Symbol RegisterInternal(std::string_view name); + // The value to be associated to the next registered symbol table entry. uint32_t next_symbol_ = 1;