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 #ifndef ANDROID_VINTF_SERIALIZE_FLAGS_H
18 #define ANDROID_VINTF_SERIALIZE_FLAGS_H
19 
20 #include <stdint.h>
21 
22 namespace android {
23 namespace vintf {
24 
25 namespace SerializeFlags {
26 
27 class Type {
28    public:
Type(uint32_t value)29     explicit constexpr Type(uint32_t value) : mValue(value) {}
30 
31 #define VINTF_SERIALIZE_FLAGS_FIELD(name, bit)                                  \
32     constexpr Type enable##name() const { return Type(mValue | (1 << bit)); }   \
33     constexpr Type disable##name() const { return Type(mValue & ~(1 << bit)); } \
34     constexpr bool is##name##Enabled() const { return mValue & (1 << bit); }
35 
36     VINTF_SERIALIZE_FLAGS_FIELD(Hals, 0)
37     VINTF_SERIALIZE_FLAGS_FIELD(Avb, 1)
38     VINTF_SERIALIZE_FLAGS_FIELD(Sepolicy, 2)
39     VINTF_SERIALIZE_FLAGS_FIELD(Vndk, 3)
40     VINTF_SERIALIZE_FLAGS_FIELD(Kernel, 4)
41     VINTF_SERIALIZE_FLAGS_FIELD(XmlFiles, 5)
42     VINTF_SERIALIZE_FLAGS_FIELD(Ssdk, 6)
43     VINTF_SERIALIZE_FLAGS_FIELD(Fqname, 7)
44     VINTF_SERIALIZE_FLAGS_FIELD(KernelConfigs, 8)
45     VINTF_SERIALIZE_FLAGS_FIELD(KernelMinorRevision, 9)
46     VINTF_SERIALIZE_FLAGS_FIELD(MetaVersion, 10)
47     VINTF_SERIALIZE_FLAGS_FIELD(SchemaType, 11)
48 
49 #undef VINTF_SERIALIZE_FLAGS_FIELD
50 
51    private:
52     uint32_t mValue;
53 };
54 
55 constexpr Type EVERYTHING = Type(~0);
56 constexpr Type NO_HALS = EVERYTHING.disableHals();
57 constexpr Type NO_AVB = EVERYTHING.disableAvb();
58 constexpr Type NO_SEPOLICY = EVERYTHING.disableSepolicy();
59 constexpr Type NO_VNDK = EVERYTHING.disableVndk();
60 constexpr Type NO_KERNEL = EVERYTHING.disableKernel();
61 constexpr Type NO_XMLFILES = EVERYTHING.disableXmlFiles();
62 constexpr Type NO_SSDK = EVERYTHING.disableSsdk();
63 constexpr Type NO_FQNAME = EVERYTHING.disableFqname();
64 constexpr Type NO_KERNEL_CONFIGS = EVERYTHING.disableKernelConfigs();
65 constexpr Type NO_KERNEL_MINOR_REVISION = EVERYTHING.disableKernelMinorRevision();
66 
67 constexpr Type NO_TAGS = Type(0).enableMetaVersion().enableSchemaType();
68 constexpr Type HALS_ONLY = NO_TAGS.enableHals().enableFqname();  // <hal> with <fqname>
69 constexpr Type XMLFILES_ONLY = NO_TAGS.enableXmlFiles();
70 constexpr Type SEPOLICY_ONLY = NO_TAGS.enableSepolicy();
71 constexpr Type VNDK_ONLY = NO_TAGS.enableVndk();
72 constexpr Type HALS_NO_FQNAME = NO_TAGS.enableHals();  // <hal> without <fqname>
73 constexpr Type SSDK_ONLY = NO_TAGS.enableSsdk();
74 
75 // tests
76 static_assert(EVERYTHING.isHalsEnabled(), "");
77 static_assert(EVERYTHING.isMetaVersionEnabled(), "");
78 static_assert(!NO_HALS.isHalsEnabled(), "");
79 static_assert(NO_HALS.isAvbEnabled(), "");
80 static_assert(NO_HALS.isMetaVersionEnabled(), "");
81 static_assert(!NO_TAGS.isHalsEnabled(), "");
82 static_assert(NO_TAGS.isMetaVersionEnabled(), "");
83 static_assert(HALS_ONLY.isHalsEnabled(), "");
84 static_assert(!HALS_ONLY.isAvbEnabled(), "");
85 static_assert(HALS_ONLY.isMetaVersionEnabled(), "");
86 
87 }  // namespace SerializeFlags
88 }  // namespace vintf
89 }  // namespace android
90 
91 #endif  // ANDROID_VINTF_SERIALIZE_FLAGS_H
92