1 /*
2  * stringCopyright (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 "KernelConfigTypedValue.h"
18 
19 #include "parse_string.h"
20 
21 #include <android-base/logging.h>
22 
23 namespace android {
24 namespace vintf {
25 
26 // static
27 const KernelConfigTypedValue KernelConfigTypedValue::gMissingConfig{Tristate::NO};
28 
29 KernelConfigTypedValue::KernelConfigTypedValue()
30         : KernelConfigTypedValue("") {
31 }
32 
33 KernelConfigTypedValue::KernelConfigTypedValue(std::string &&s){
34     mType = KernelConfigType::STRING;
35     std::swap(mStringValue, s);
36 }
37 
38 KernelConfigTypedValue::KernelConfigTypedValue(KernelConfigIntValue v){
39     mType = KernelConfigType::INTEGER;
40     mIntegerValue = v;
41 }
42 
43 KernelConfigTypedValue::KernelConfigTypedValue(KernelConfigRangeValue &&v){
44     mType = KernelConfigType::RANGE;
45     std::swap(mRangeValue, v);
46 }
47 
48 KernelConfigTypedValue::KernelConfigTypedValue(Tristate t){
49     mType = KernelConfigType::TRISTATE;
50     mTristateValue = t;
51 }
52 
53 bool KernelConfigTypedValue::operator==(const KernelConfigTypedValue &other) const {
54     if (mType != other.mType) {
55         return false;
56     }
57     switch(mType) {
58         case KernelConfigType::STRING:
59             return mStringValue == other.mStringValue;
60         case KernelConfigType::INTEGER:
61             return mIntegerValue == other.mIntegerValue;
62         case KernelConfigType::RANGE:
63             return mRangeValue == other.mRangeValue;
64         case KernelConfigType::TRISTATE:
65             return mTristateValue == other.mTristateValue;
66     }
67 }
68 
69 
70 bool KernelConfigTypedValue::matchValue(const std::string &s) const {
71     switch(mType) {
72         case KernelConfigType::STRING:
73             return ("\"" + mStringValue + "\"") == s;
74         case KernelConfigType::INTEGER: {
75             KernelConfigIntValue iv;
76             return parseKernelConfigInt(s, &iv) && iv == mIntegerValue;
77         }
78         case KernelConfigType::RANGE: {
79             KernelConfigRangeValue range;
80             return parseRange(s, &range) && range == mRangeValue;
81         }
82         case KernelConfigType::TRISTATE: {
83             Tristate tristate;
84             return parse(s, &tristate) && tristate == mTristateValue;
85         }
86     }
87 }
88 
89 } // namespace vintf
90 } // namespace android
91