1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <set>
18 #include <string>
19 
20 #include "HalInterface.h"
21 
22 namespace android {
23 namespace vintf {
24 
operator ==(const HalInterface & lft,const HalInterface & rgt)25 bool operator==(const HalInterface& lft, const HalInterface& rgt) {
26     if (lft.mName != rgt.mName) return false;
27     if (lft.mInstances != rgt.mInstances) return false;
28     return true;
29 }
30 
forEachInstance(const std::function<bool (const std::string &,const std::string &,bool isRegex)> & func) const31 bool HalInterface::forEachInstance(
32     const std::function<bool(const std::string&, const std::string&, bool isRegex)>& func) const {
33     for (const auto& instance : mInstances) {
34         if (!func(mName, instance, false /* isRegex */)) {
35             return false;
36         }
37     }
38     for (const auto& instance : mRegexes) {
39         if (!func(mName, instance, true /* isRegex */)) {
40             return false;
41         }
42     }
43     return true;
44 }
45 
hasAnyInstance() const46 bool HalInterface::hasAnyInstance() const {
47     bool found = false;
48     forEachInstance([&found](const auto&, const auto&, bool) {
49         found = true;
50         return false;  // break;
51     });
52     return found;
53 }
54 
insertInstance(const std::string & instanceOrPattern,bool isRegex)55 bool HalInterface::insertInstance(const std::string& instanceOrPattern, bool isRegex) {
56     if (isRegex) {
57         return mRegexes.insert(instanceOrPattern).second;
58     } else {
59         return mInstances.insert(instanceOrPattern).second;
60     }
61 }
62 
removeInstance(const std::string & instanceOrPattern,bool isRegex)63 bool HalInterface::removeInstance(const std::string& instanceOrPattern, bool isRegex) {
64     if (isRegex) {
65         return mRegexes.erase(instanceOrPattern) > 0;
66     } else {
67         return mInstances.erase(instanceOrPattern) > 0;
68     }
69 }
70 
71 } // namespace vintf
72 } // namespace android
73