spirv-reader: add namer::IsRegistered
Change-Id: I014132f9a655c7f52ebce4b141f6ea5235e828f1
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/49140
Auto-Submit: David Neto <dneto@google.com>
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/reader/spirv/namer.cc b/src/reader/spirv/namer.cc
index d23a0c3..9c5385f 100644
--- a/src/reader/spirv/namer.cc
+++ b/src/reader/spirv/namer.cc
@@ -105,17 +105,16 @@
std::string Namer::FindUnusedDerivedName(const std::string& base_name) const {
// Ensure uniqueness among names.
std::string derived_name;
- for (int i = 0;; i++) {
+ int i = 0;
+ do {
std::stringstream new_name_stream;
new_name_stream << base_name;
if (i > 0) {
new_name_stream << "_" << i;
}
+ i++;
derived_name = new_name_stream.str();
- if (name_to_id_.count(derived_name) == 0) {
- break;
- }
- }
+ } while (IsRegistered(derived_name));
return derived_name;
}
diff --git a/src/reader/spirv/namer.h b/src/reader/spirv/namer.h
index c889e83..5957ae5 100644
--- a/src/reader/spirv/namer.h
+++ b/src/reader/spirv/namer.h
@@ -57,6 +57,12 @@
return id_to_name_.find(id) != id_to_name_.end();
}
+ /// @param name a string
+ /// @returns true if the string has been registered as a name.
+ bool IsRegistered(const std::string& name) const {
+ return name_to_id_.find(name) != name_to_id_.end();
+ }
+
/// @param id the SPIR-V ID
/// @returns the name for the ID. It must have been registered.
const std::string& GetName(uint32_t id) const {
diff --git a/src/reader/spirv/namer_test.cc b/src/reader/spirv/namer_test.cc
index 027223a..52e38e1 100644
--- a/src/reader/spirv/namer_test.cc
+++ b/src/reader/spirv/namer_test.cc
@@ -100,6 +100,24 @@
EXPECT_THAT(namer.FindUnusedDerivedName("rigby"), Eq("rigby_2"));
}
+TEST_F(SpvNamerTest, IsRegistered_NoRecordedName) {
+ Namer namer(fail_stream_);
+ EXPECT_FALSE(namer.IsRegistered("abbey"));
+}
+
+TEST_F(SpvNamerTest, IsRegistered_RegisteredById) {
+ Namer namer(fail_stream_);
+ namer.SaveName(1, "abbey");
+ EXPECT_TRUE(namer.IsRegistered("abbey"));
+}
+
+TEST_F(SpvNamerTest, IsRegistered_RegisteredByDerivation) {
+ Namer namer(fail_stream_);
+ const auto got = namer.MakeDerivedName("abbey");
+ EXPECT_TRUE(namer.IsRegistered("abbey"));
+ EXPECT_EQ(got, "abbey");
+}
+
TEST_F(SpvNamerTest, MakeDerivedName_NoRecordedName) {
Namer namer(fail_stream_);
EXPECT_THAT(namer.MakeDerivedName("eleanor"), Eq("eleanor"));