xref: /aosp_15_r20/system/libvintf/include/vintf/MatrixKernel.h (revision 70a7ec852fcefd15a4fb57f8f183a8b1c3aacb08)
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_KERNEL_H
18*70a7ec85SAndroid Build Coastguard Worker #define ANDROID_VINTF_MATRIX_KERNEL_H
19*70a7ec85SAndroid Build Coastguard Worker 
20*70a7ec85SAndroid Build Coastguard Worker #include <string>
21*70a7ec85SAndroid Build Coastguard Worker #include <vector>
22*70a7ec85SAndroid Build Coastguard Worker #include <utility>
23*70a7ec85SAndroid Build Coastguard Worker 
24*70a7ec85SAndroid Build Coastguard Worker #include "KernelConfigTypedValue.h"
25*70a7ec85SAndroid Build Coastguard Worker #include "Level.h"
26*70a7ec85SAndroid Build Coastguard Worker #include "Version.h"
27*70a7ec85SAndroid Build Coastguard Worker 
28*70a7ec85SAndroid Build Coastguard Worker namespace android {
29*70a7ec85SAndroid Build Coastguard Worker namespace vintf {
30*70a7ec85SAndroid Build Coastguard Worker 
31*70a7ec85SAndroid Build Coastguard Worker struct KernelConfigKey : public std::string {
KernelConfigKeyKernelConfigKey32*70a7ec85SAndroid Build Coastguard Worker     KernelConfigKey() : std::string() {}
KernelConfigKeyKernelConfigKey33*70a7ec85SAndroid Build Coastguard Worker     KernelConfigKey(const std::string &other) : std::string(other) {}
KernelConfigKeyKernelConfigKey34*70a7ec85SAndroid Build Coastguard Worker     KernelConfigKey(std::string &&other) : std::string(std::forward<std::string>(other)) {}
35*70a7ec85SAndroid Build Coastguard Worker };
36*70a7ec85SAndroid Build Coastguard Worker 
37*70a7ec85SAndroid Build Coastguard Worker using KernelConfig = std::pair<KernelConfigKey, KernelConfigTypedValue>;
38*70a7ec85SAndroid Build Coastguard Worker 
39*70a7ec85SAndroid Build Coastguard Worker // A <kernel> entry to a compatibility matrix represents a fragment of kernel
40*70a7ec85SAndroid Build Coastguard Worker // config requirements.
41*70a7ec85SAndroid Build Coastguard Worker struct MatrixKernel {
42*70a7ec85SAndroid Build Coastguard Worker 
MatrixKernelMatrixKernel43*70a7ec85SAndroid Build Coastguard Worker     MatrixKernel() {}
MatrixKernelMatrixKernel44*70a7ec85SAndroid Build Coastguard Worker     MatrixKernel(KernelVersion &&minLts, std::vector<KernelConfig> &&configs)
45*70a7ec85SAndroid Build Coastguard Worker             : mMinLts(std::move(minLts)), mConfigs(std::move(configs)) {}
46*70a7ec85SAndroid Build Coastguard Worker 
47*70a7ec85SAndroid Build Coastguard Worker     bool operator==(const MatrixKernel &other) const;
48*70a7ec85SAndroid Build Coastguard Worker 
minLtsMatrixKernel49*70a7ec85SAndroid Build Coastguard Worker     inline const KernelVersion &minLts() const { return mMinLts; }
50*70a7ec85SAndroid Build Coastguard Worker 
51*70a7ec85SAndroid Build Coastguard Worker     // Return an iterable on all kernel configs. Use it as follows:
52*70a7ec85SAndroid Build Coastguard Worker     // for (const KernelConfig &config : kernel.configs()) {...}
configsMatrixKernel53*70a7ec85SAndroid Build Coastguard Worker     const std::vector<KernelConfig> &configs() const { return mConfigs; }
54*70a7ec85SAndroid Build Coastguard Worker 
55*70a7ec85SAndroid Build Coastguard Worker     // Return an iterable on all kernel config conditions. Use it as follows:
56*70a7ec85SAndroid Build Coastguard Worker     // for (const KernelConfig &config : kernel.conditions()) {...}
conditionsMatrixKernel57*70a7ec85SAndroid Build Coastguard Worker     const std::vector<KernelConfig>& conditions() const { return mConditions; }
58*70a7ec85SAndroid Build Coastguard Worker 
59*70a7ec85SAndroid Build Coastguard Worker    private:
60*70a7ec85SAndroid Build Coastguard Worker     friend struct MatrixKernelConverter;
61*70a7ec85SAndroid Build Coastguard Worker     friend struct MatrixKernelConditionsConverter;
62*70a7ec85SAndroid Build Coastguard Worker     friend struct CompatibilityMatrix;
63*70a7ec85SAndroid Build Coastguard Worker     friend class AssembleVintfImpl;
64*70a7ec85SAndroid Build Coastguard Worker     friend class KernelInfo;
65*70a7ec85SAndroid Build Coastguard Worker 
66*70a7ec85SAndroid Build Coastguard Worker     void setSourceMatrixLevel(Level level);
67*70a7ec85SAndroid Build Coastguard Worker     Level getSourceMatrixLevel() const;
68*70a7ec85SAndroid Build Coastguard Worker 
69*70a7ec85SAndroid Build Coastguard Worker     KernelVersion mMinLts;
70*70a7ec85SAndroid Build Coastguard Worker     std::vector<KernelConfig> mConfigs;
71*70a7ec85SAndroid Build Coastguard Worker     std::vector<KernelConfig> mConditions;
72*70a7ec85SAndroid Build Coastguard Worker 
73*70a7ec85SAndroid Build Coastguard Worker     // The "level" field of compatibility matrix that this <kernel> tag is
74*70a7ec85SAndroid Build Coastguard Worker     // originally from.
75*70a7ec85SAndroid Build Coastguard Worker     // If UNSPECIFIED, this value should be retrieved from the parent
76*70a7ec85SAndroid Build Coastguard Worker     // CompatibilityMatrix object.
77*70a7ec85SAndroid Build Coastguard Worker     Level mSourceMatrixLevel = Level::UNSPECIFIED;
78*70a7ec85SAndroid Build Coastguard Worker };
79*70a7ec85SAndroid Build Coastguard Worker 
80*70a7ec85SAndroid Build Coastguard Worker } // namespace vintf
81*70a7ec85SAndroid Build Coastguard Worker } // namespace android
82*70a7ec85SAndroid Build Coastguard Worker 
83*70a7ec85SAndroid Build Coastguard Worker #endif // ANDROID_VINTF_MATRIX_KERNEL_H
84