regex-instance: HalInterface stores regex instances.

Parse <regex-instance> regular expression patterns using
Extended Regular Expression syntax, and store it in
HalInterface object.

Bug: 73738616
Test: libvintf_test
Test: vintf_object_test
Test: vts_treble_vintf_test

Change-Id: If0b8e3bc053a6c2ecd9048092071f52f7896bba0
Merged-In: If0b8e3bc053a6c2ecd9048092071f52f7896bba0
diff --git a/HalInterface.cpp b/HalInterface.cpp
index cec33af..b5cbd6b 100644
--- a/HalInterface.cpp
+++ b/HalInterface.cpp
@@ -35,6 +35,11 @@
             return false;
         }
     }
+    for (const auto& instance : mRegexes) {
+        if (!func(mName, instance, true /* isRegex */)) {
+            return false;
+        }
+    }
     return true;
 }
 
@@ -47,12 +52,20 @@
     return found;
 }
 
-bool HalInterface::insertInstance(const std::string& instanceOrPattern, bool /*isRegex*/) {
-    return mInstances.insert(instanceOrPattern).second;
+bool HalInterface::insertInstance(const std::string& instanceOrPattern, bool isRegex) {
+    if (isRegex) {
+        return mRegexes.insert(instanceOrPattern).second;
+    } else {
+        return mInstances.insert(instanceOrPattern).second;
+    }
 }
 
-bool HalInterface::removeInstance(const std::string& instanceOrPattern, bool /*isRegex*/) {
-    return mInstances.erase(instanceOrPattern) > 0;
+bool HalInterface::removeInstance(const std::string& instanceOrPattern, bool isRegex) {
+    if (isRegex) {
+        return mRegexes.erase(instanceOrPattern) > 0;
+    } else {
+        return mInstances.erase(instanceOrPattern) > 0;
+    }
 }
 
 } // namespace vintf