Instance is the smallest unit of manifests/matrices.

Introduce forEachInstance on HalManifest and CompatibilityMatrix,
because <hal> are no longer the smallest unit of tests, but
rather a ManifestInstance / MatrixInstance object.

Bug: 73556059
Bug: 74247301

Test: libvintf_test
Test: vintf_object_test

Change-Id: If7186617db52acd67f255ac6e6c99f34a7570206
Merged-In: If7186617db52acd67f255ac6e6c99f34a7570206
diff --git a/CompatibilityMatrix.cpp b/CompatibilityMatrix.cpp
index deb1fa1..bf83a98 100644
--- a/CompatibilityMatrix.cpp
+++ b/CompatibilityMatrix.cpp
@@ -312,20 +312,19 @@
     return matrix;
 }
 
-void CompatibilityMatrix::forEachInstance(
-    const std::function<void(const std::string&, const VersionRange&, const std::string&,
-                             const std::string&, bool, bool*)>& f) const {
-    bool stop = false;
-    for (const auto& hal : getHals()) {
-        for (const auto& v : hal.versionRanges) {
-            for (const auto& intf : iterateValues(hal.interfaces)) {
-                for (const auto& instance : intf.instances) {
-                    f(hal.name, v, intf.name, instance, hal.optional, &stop);
-                    if (stop) break;
-                }
+bool CompatibilityMatrix::forEachInstanceOfVersion(
+    const std::string& package, const Version& expectVersion,
+    const std::function<bool(const MatrixInstance&)>& func) const {
+    for (const MatrixHal* hal : getHals(package)) {
+        bool cont = hal->forEachInstance([&](const MatrixInstance& matrixInstance) {
+            if (matrixInstance.versionRange().contains(expectVersion)) {
+                return func(matrixInstance);
             }
-        }
+            return true;
+        });
+        if (!cont) return false;
     }
+    return true;
 }
 
 } // namespace vintf