libvintf: use toFQNameString

Centralize the hard-coded "@" "::" "/".

Test: builds
Test: libvintf_test
Test: vintf_object_test
Change-Id: I1942441865585b11801e7d9b38c0c57b5c5ebe17
diff --git a/parse_string.cpp b/parse_string.cpp
index beca23b..2aa3c1b 100644
--- a/parse_string.cpp
+++ b/parse_string.cpp
@@ -401,7 +401,7 @@
     for (const auto& interface : iterateValues(req.interfaces)) {
         for (const auto& instance : interface.instances) {
             if (!first) s += " AND ";
-            s += "@" + to_string(vr) + "::" + interface.name + "/" + instance;
+            s += toFQNameString(vr, interface.name, instance);
             first = false;
         }
     }
@@ -470,5 +470,40 @@
     return oss.str();
 }
 
+std::string toFQNameString(const std::string& package, const std::string& version,
+                           const std::string& interface, const std::string& instance) {
+    std::stringstream ss;
+    ss << package << "@" << version;
+    if (!interface.empty()) {
+        ss << "::" << interface;
+        if (!instance.empty()) {
+            ss << "/" << instance;
+        }
+    }
+    return ss.str();
+}
+
+std::string toFQNameString(const std::string& package, const Version& version,
+                           const std::string& interface, const std::string& instance) {
+    return toFQNameString(package, to_string(version), interface, instance);
+}
+
+std::string toFQNameString(const Version& version, const std::string& interface,
+                           const std::string& instance) {
+    return toFQNameString("", version, interface, instance);
+}
+
+// android.hardware.foo@1.0-1::IFoo/default.
+// Note that the format is extended to support a range of versions.
+std::string toFQNameString(const std::string& package, const VersionRange& range,
+                           const std::string& interface, const std::string& instance) {
+    return toFQNameString(package, to_string(range), interface, instance);
+}
+
+std::string toFQNameString(const VersionRange& range, const std::string& interface,
+                           const std::string& instance) {
+    return toFQNameString("", range, interface, instance);
+}
+
 } // namespace vintf
 } // namespace android