1*70a7ec85SAndroid Build Coastguard Worker /* 2*70a7ec85SAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project 3*70a7ec85SAndroid Build Coastguard Worker * 4*70a7ec85SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*70a7ec85SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*70a7ec85SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*70a7ec85SAndroid Build Coastguard Worker * 8*70a7ec85SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*70a7ec85SAndroid Build Coastguard Worker * 10*70a7ec85SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*70a7ec85SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*70a7ec85SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*70a7ec85SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*70a7ec85SAndroid Build Coastguard Worker * limitations under the License. 15*70a7ec85SAndroid Build Coastguard Worker */ 16*70a7ec85SAndroid Build Coastguard Worker 17*70a7ec85SAndroid Build Coastguard Worker #ifndef ANDROID_VINTF_MATRIX_HAL_H 18*70a7ec85SAndroid Build Coastguard Worker #define ANDROID_VINTF_MATRIX_HAL_H 19*70a7ec85SAndroid Build Coastguard Worker 20*70a7ec85SAndroid Build Coastguard Worker #include <map> 21*70a7ec85SAndroid Build Coastguard Worker #include <set> 22*70a7ec85SAndroid Build Coastguard Worker #include <string> 23*70a7ec85SAndroid Build Coastguard Worker #include <vector> 24*70a7ec85SAndroid Build Coastguard Worker 25*70a7ec85SAndroid Build Coastguard Worker #include "ExclusiveTo.h" 26*70a7ec85SAndroid Build Coastguard Worker #include "HalFormat.h" 27*70a7ec85SAndroid Build Coastguard Worker #include "HalInterface.h" 28*70a7ec85SAndroid Build Coastguard Worker #include "MatrixInstance.h" 29*70a7ec85SAndroid Build Coastguard Worker #include "VersionRange.h" 30*70a7ec85SAndroid Build Coastguard Worker 31*70a7ec85SAndroid Build Coastguard Worker namespace android { 32*70a7ec85SAndroid Build Coastguard Worker namespace vintf { 33*70a7ec85SAndroid Build Coastguard Worker 34*70a7ec85SAndroid Build Coastguard Worker // A HAL entry to a compatibility matrix 35*70a7ec85SAndroid Build Coastguard Worker struct MatrixHal { 36*70a7ec85SAndroid Build Coastguard Worker using InstanceType = MatrixInstance; 37*70a7ec85SAndroid Build Coastguard Worker 38*70a7ec85SAndroid Build Coastguard Worker bool operator==(const MatrixHal &other) const; 39*70a7ec85SAndroid Build Coastguard Worker // Check whether the MatrixHal contains the given version. 40*70a7ec85SAndroid Build Coastguard Worker bool containsVersion(const Version& version) const; 41*70a7ec85SAndroid Build Coastguard Worker 42*70a7ec85SAndroid Build Coastguard Worker HalFormat format = HalFormat::HIDL; 43*70a7ec85SAndroid Build Coastguard Worker std::string name; 44*70a7ec85SAndroid Build Coastguard Worker std::vector<VersionRange> versionRanges; 45*70a7ec85SAndroid Build Coastguard Worker bool optional = false; 46*70a7ec85SAndroid Build Coastguard Worker ExclusiveTo exclusiveTo = ExclusiveTo::EMPTY; 47*70a7ec85SAndroid Build Coastguard Worker bool updatableViaApex = false; 48*70a7ec85SAndroid Build Coastguard Worker std::map<std::string, HalInterface> interfaces; 49*70a7ec85SAndroid Build Coastguard Worker getNameMatrixHal50*70a7ec85SAndroid Build Coastguard Worker inline const std::string& getName() const { return name; } 51*70a7ec85SAndroid Build Coastguard Worker 52*70a7ec85SAndroid Build Coastguard Worker // Assumes isValid(). 53*70a7ec85SAndroid Build Coastguard Worker bool forEachInstance(const std::function<bool(const MatrixInstance&)>& func) const; 54*70a7ec85SAndroid Build Coastguard Worker 55*70a7ec85SAndroid Build Coastguard Worker private: 56*70a7ec85SAndroid Build Coastguard Worker friend struct HalManifest; 57*70a7ec85SAndroid Build Coastguard Worker friend struct CompatibilityMatrix; 58*70a7ec85SAndroid Build Coastguard Worker friend struct MatrixHalConverter; 59*70a7ec85SAndroid Build Coastguard Worker 60*70a7ec85SAndroid Build Coastguard Worker // Whether this hal is a valid one. Note that an empty MatrixHal 61*70a7ec85SAndroid Build Coastguard Worker // (constructed via MatrixHal()) is valid. 62*70a7ec85SAndroid Build Coastguard Worker [[nodiscard]] bool isValid(std::string* error = nullptr) const; 63*70a7ec85SAndroid Build Coastguard Worker 64*70a7ec85SAndroid Build Coastguard Worker friend std::string expandInstances(const MatrixHal& req, const VersionRange& vr, bool brace); 65*70a7ec85SAndroid Build Coastguard Worker friend std::vector<std::string> expandInstances(const MatrixHal& req); 66*70a7ec85SAndroid Build Coastguard Worker 67*70a7ec85SAndroid Build Coastguard Worker // Loop over interface/instance for a specific VersionRange. 68*70a7ec85SAndroid Build Coastguard Worker // Assumes isValid(). 69*70a7ec85SAndroid Build Coastguard Worker bool forEachInstance(const VersionRange& vr, 70*70a7ec85SAndroid Build Coastguard Worker const std::function<bool(const MatrixInstance&)>& func) const; 71*70a7ec85SAndroid Build Coastguard Worker // Loop over interface/instance. VersionRange is supplied to the function as a vector. 72*70a7ec85SAndroid Build Coastguard Worker // Assumes isValid(). 73*70a7ec85SAndroid Build Coastguard Worker bool forEachInstance( 74*70a7ec85SAndroid Build Coastguard Worker const std::function<bool(const std::vector<VersionRange>&, const std::string&, 75*70a7ec85SAndroid Build Coastguard Worker const std::string& instanceOrPattern, bool isRegex)>& func) const; 76*70a7ec85SAndroid Build Coastguard Worker 77*70a7ec85SAndroid Build Coastguard Worker bool isCompatible(const std::set<FqInstance>& providedInstances, 78*70a7ec85SAndroid Build Coastguard Worker const std::set<Version>& providedVersions) const; 79*70a7ec85SAndroid Build Coastguard Worker bool isCompatible(const VersionRange& vr, const std::set<FqInstance>& providedInstances, 80*70a7ec85SAndroid Build Coastguard Worker const std::set<Version>& providedVersions) const; 81*70a7ec85SAndroid Build Coastguard Worker 82*70a7ec85SAndroid Build Coastguard Worker void setOptional(bool o); 83*70a7ec85SAndroid Build Coastguard Worker void insertVersionRanges(const std::vector<VersionRange>& other); 84*70a7ec85SAndroid Build Coastguard Worker // Return size of all interface/instance pairs. 85*70a7ec85SAndroid Build Coastguard Worker size_t instancesCount() const; 86*70a7ec85SAndroid Build Coastguard Worker void insertInstance(const std::string& interface, const std::string& instance, bool isRegex); 87*70a7ec85SAndroid Build Coastguard Worker // Remove a specific interface/instances. Return true if removed, false otherwise. 88*70a7ec85SAndroid Build Coastguard Worker bool removeInstance(const std::string& interface, const std::string& instance, bool isRegex); 89*70a7ec85SAndroid Build Coastguard Worker // Remove all <interface> tags. 90*70a7ec85SAndroid Build Coastguard Worker void clearInstances(); 91*70a7ec85SAndroid Build Coastguard Worker }; 92*70a7ec85SAndroid Build Coastguard Worker 93*70a7ec85SAndroid Build Coastguard Worker } // namespace vintf 94*70a7ec85SAndroid Build Coastguard Worker } // namespace android 95*70a7ec85SAndroid Build Coastguard Worker 96*70a7ec85SAndroid Build Coastguard Worker #endif // ANDROID_VINTF_MATRIX_HAL_H 97