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
23namespace android {
24namespace vintf {
25
26// static
27const KernelConfigTypedValue KernelConfigTypedValue::gMissingConfig{Tristate::NO};
28
29KernelConfigTypedValue::KernelConfigTypedValue()
30        : KernelConfigTypedValue("") {
31}
32
33KernelConfigTypedValue::KernelConfigTypedValue(std::string &&s){
34    mType = KernelConfigType::STRING;
35    std::swap(mStringValue, s);
36}
37
38KernelConfigTypedValue::KernelConfigTypedValue(KernelConfigIntValue v){
39    mType = KernelConfigType::INTEGER;
40    mIntegerValue = v;
41}
42
43KernelConfigTypedValue::KernelConfigTypedValue(KernelConfigRangeValue &&v){
44    mType = KernelConfigType::RANGE;
45    std::swap(mRangeValue, v);
46}
47
48KernelConfigTypedValue::KernelConfigTypedValue(Tristate t){
49    mType = KernelConfigType::TRISTATE;
50    mTristateValue = t;
51}
52
53bool 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
70bool 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