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 18*70a7ec85SAndroid Build Coastguard Worker #ifndef ANDROID_VINTF_VERSION_H 19*70a7ec85SAndroid Build Coastguard Worker #define ANDROID_VINTF_VERSION_H 20*70a7ec85SAndroid Build Coastguard Worker 21*70a7ec85SAndroid Build Coastguard Worker #include <stdint.h> 22*70a7ec85SAndroid Build Coastguard Worker #include <optional> 23*70a7ec85SAndroid Build Coastguard Worker #include <string> 24*70a7ec85SAndroid Build Coastguard Worker #include <utility> 25*70a7ec85SAndroid Build Coastguard Worker 26*70a7ec85SAndroid Build Coastguard Worker namespace android { 27*70a7ec85SAndroid Build Coastguard Worker namespace vintf { 28*70a7ec85SAndroid Build Coastguard Worker 29*70a7ec85SAndroid Build Coastguard Worker struct Version { 30*70a7ec85SAndroid Build Coastguard Worker VersionVersion31*70a7ec85SAndroid Build Coastguard Worker constexpr Version() : Version(0u, 0u) {} VersionVersion32*70a7ec85SAndroid Build Coastguard Worker constexpr Version(size_t mj, size_t mi) : majorVer(mj), minorVer(mi) {} VersionVersion33*70a7ec85SAndroid Build Coastguard Worker constexpr Version(const std::pair<size_t, size_t>& pair) 34*70a7ec85SAndroid Build Coastguard Worker : majorVer(pair.first), minorVer(pair.second) {} 35*70a7ec85SAndroid Build Coastguard Worker 36*70a7ec85SAndroid Build Coastguard Worker size_t majorVer; 37*70a7ec85SAndroid Build Coastguard Worker size_t minorVer; 38*70a7ec85SAndroid Build Coastguard Worker 39*70a7ec85SAndroid Build Coastguard Worker inline bool operator==(const Version &other) const { 40*70a7ec85SAndroid Build Coastguard Worker return majorVer == other.majorVer && minorVer == other.minorVer; 41*70a7ec85SAndroid Build Coastguard Worker } 42*70a7ec85SAndroid Build Coastguard Worker inline bool operator!=(const Version &other) const { 43*70a7ec85SAndroid Build Coastguard Worker return !((*this) == other); 44*70a7ec85SAndroid Build Coastguard Worker } 45*70a7ec85SAndroid Build Coastguard Worker inline bool operator<(const Version &other) const { 46*70a7ec85SAndroid Build Coastguard Worker if (majorVer < other.majorVer) 47*70a7ec85SAndroid Build Coastguard Worker return true; 48*70a7ec85SAndroid Build Coastguard Worker if (majorVer > other.majorVer) 49*70a7ec85SAndroid Build Coastguard Worker return false; 50*70a7ec85SAndroid Build Coastguard Worker return minorVer < other.minorVer; 51*70a7ec85SAndroid Build Coastguard Worker } 52*70a7ec85SAndroid Build Coastguard Worker inline bool operator>(const Version &other) const { 53*70a7ec85SAndroid Build Coastguard Worker return other < (*this); 54*70a7ec85SAndroid Build Coastguard Worker } 55*70a7ec85SAndroid Build Coastguard Worker inline bool operator<=(const Version &other) const { 56*70a7ec85SAndroid Build Coastguard Worker return !((*this) > other); 57*70a7ec85SAndroid Build Coastguard Worker } 58*70a7ec85SAndroid Build Coastguard Worker inline bool operator>=(const Version &other) const { 59*70a7ec85SAndroid Build Coastguard Worker return !((*this) < other); 60*70a7ec85SAndroid Build Coastguard Worker } 61*70a7ec85SAndroid Build Coastguard Worker // Version(2, 1).minorAtLeast(Version(1, 0)) == false 62*70a7ec85SAndroid Build Coastguard Worker // Version(2, 1).minorAtLeast(Version(2, 0)) == true 63*70a7ec85SAndroid Build Coastguard Worker // Version(2, 1).minorAtLeast(Version(2, 1)) == true 64*70a7ec85SAndroid Build Coastguard Worker // Version(2, 1).minorAtLeast(Version(2, 2)) == false minorAtLeastVersion65*70a7ec85SAndroid Build Coastguard Worker inline bool minorAtLeast(const Version& other) const { 66*70a7ec85SAndroid Build Coastguard Worker return majorVer == other.majorVer && minorVer >= other.minorVer; 67*70a7ec85SAndroid Build Coastguard Worker } 68*70a7ec85SAndroid Build Coastguard Worker withMinorVersion69*70a7ec85SAndroid Build Coastguard Worker inline Version withMinor(size_t mi) { return Version(majorVer, mi); } 70*70a7ec85SAndroid Build Coastguard Worker }; 71*70a7ec85SAndroid Build Coastguard Worker 72*70a7ec85SAndroid Build Coastguard Worker struct SepolicyVersion { SepolicyVersionSepolicyVersion73*70a7ec85SAndroid Build Coastguard Worker constexpr SepolicyVersion() : SepolicyVersion(0u, std::nullopt) {} SepolicyVersionSepolicyVersion74*70a7ec85SAndroid Build Coastguard Worker constexpr SepolicyVersion(size_t mj, std::optional<size_t> mi) : majorVer(mj), minorVer(mi) {} 75*70a7ec85SAndroid Build Coastguard Worker 76*70a7ec85SAndroid Build Coastguard Worker size_t majorVer; 77*70a7ec85SAndroid Build Coastguard Worker std::optional<size_t> minorVer; 78*70a7ec85SAndroid Build Coastguard Worker 79*70a7ec85SAndroid Build Coastguard Worker bool operator==(const SepolicyVersion& other) const = default; 80*70a7ec85SAndroid Build Coastguard Worker bool operator!=(const SepolicyVersion& other) const = default; 81*70a7ec85SAndroid Build Coastguard Worker inline bool operator<(const SepolicyVersion& other) const { 82*70a7ec85SAndroid Build Coastguard Worker return std::pair(majorVer, minorVer) < std::pair(other.majorVer, other.minorVer); 83*70a7ec85SAndroid Build Coastguard Worker } 84*70a7ec85SAndroid Build Coastguard Worker inline bool operator>(const SepolicyVersion& other) const { return other < *this; } 85*70a7ec85SAndroid Build Coastguard Worker inline bool operator<=(const SepolicyVersion& other) const { return !((*this) > other); } 86*70a7ec85SAndroid Build Coastguard Worker inline bool operator>=(const SepolicyVersion& other) const { return !((*this) < other); } 87*70a7ec85SAndroid Build Coastguard Worker }; 88*70a7ec85SAndroid Build Coastguard Worker 89*70a7ec85SAndroid Build Coastguard Worker struct KernelVersion { 90*70a7ec85SAndroid Build Coastguard Worker KernelVersionKernelVersion91*70a7ec85SAndroid Build Coastguard Worker constexpr KernelVersion() : KernelVersion(0u, 0u, 0u) {} KernelVersionKernelVersion92*70a7ec85SAndroid Build Coastguard Worker constexpr KernelVersion(size_t v, size_t mj, size_t mi) : 93*70a7ec85SAndroid Build Coastguard Worker version(v), majorRev(mj), minorRev(mi) {} 94*70a7ec85SAndroid Build Coastguard Worker 95*70a7ec85SAndroid Build Coastguard Worker size_t version; 96*70a7ec85SAndroid Build Coastguard Worker size_t majorRev; 97*70a7ec85SAndroid Build Coastguard Worker size_t minorRev; 98*70a7ec85SAndroid Build Coastguard Worker 99*70a7ec85SAndroid Build Coastguard Worker inline bool operator==(const KernelVersion &other) const { 100*70a7ec85SAndroid Build Coastguard Worker return version == other.version 101*70a7ec85SAndroid Build Coastguard Worker && majorRev == other.majorRev 102*70a7ec85SAndroid Build Coastguard Worker && minorRev == other.minorRev; 103*70a7ec85SAndroid Build Coastguard Worker } 104*70a7ec85SAndroid Build Coastguard Worker inline bool operator!=(const KernelVersion &other) const { 105*70a7ec85SAndroid Build Coastguard Worker return !((*this) == other); 106*70a7ec85SAndroid Build Coastguard Worker } 107*70a7ec85SAndroid Build Coastguard Worker 108*70a7ec85SAndroid Build Coastguard Worker inline bool operator<(const KernelVersion& other) const { 109*70a7ec85SAndroid Build Coastguard Worker if (version < other.version) return true; 110*70a7ec85SAndroid Build Coastguard Worker if (version > other.version) return false; 111*70a7ec85SAndroid Build Coastguard Worker if (majorRev < other.majorRev) return true; 112*70a7ec85SAndroid Build Coastguard Worker if (majorRev > other.majorRev) return false; 113*70a7ec85SAndroid Build Coastguard Worker return minorRev < other.minorRev; 114*70a7ec85SAndroid Build Coastguard Worker } 115*70a7ec85SAndroid Build Coastguard Worker inline bool operator>(const KernelVersion& other) const { return other < (*this); } 116*70a7ec85SAndroid Build Coastguard Worker inline bool operator<=(const KernelVersion& other) const { return !((*this) > other); } 117*70a7ec85SAndroid Build Coastguard Worker inline bool operator>=(const KernelVersion& other) const { return !((*this) < other); } 118*70a7ec85SAndroid Build Coastguard Worker dropMinorKernelVersion119*70a7ec85SAndroid Build Coastguard Worker inline constexpr Version dropMinor() const { return Version{version, majorRev}; } 120*70a7ec85SAndroid Build Coastguard Worker }; 121*70a7ec85SAndroid Build Coastguard Worker 122*70a7ec85SAndroid Build Coastguard Worker } // namespace vintf 123*70a7ec85SAndroid Build Coastguard Worker } // namespace android 124*70a7ec85SAndroid Build Coastguard Worker 125*70a7ec85SAndroid Build Coastguard Worker #endif // ANDROID_VINTF_VERSION_H 126