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_RANGE_H 19*70a7ec85SAndroid Build Coastguard Worker #define ANDROID_VINTF_VERSION_RANGE_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 <tuple> 25*70a7ec85SAndroid Build Coastguard Worker #include <utility> 26*70a7ec85SAndroid Build Coastguard Worker 27*70a7ec85SAndroid Build Coastguard Worker #include "Version.h" 28*70a7ec85SAndroid Build Coastguard Worker 29*70a7ec85SAndroid Build Coastguard Worker namespace android { 30*70a7ec85SAndroid Build Coastguard Worker namespace vintf { 31*70a7ec85SAndroid Build Coastguard Worker 32*70a7ec85SAndroid Build Coastguard Worker // A version range with the same major version, e.g. 2.3-7 33*70a7ec85SAndroid Build Coastguard Worker struct VersionRange { VersionRangeVersionRange34*70a7ec85SAndroid Build Coastguard Worker constexpr VersionRange() : VersionRange(0u, 0u, 0u) {} VersionRangeVersionRange35*70a7ec85SAndroid Build Coastguard Worker constexpr VersionRange(size_t mjV, size_t miV) : VersionRange(mjV, miV, miV) {} VersionRangeVersionRange36*70a7ec85SAndroid Build Coastguard Worker constexpr VersionRange(size_t mjV, size_t miM, size_t mxM) 37*70a7ec85SAndroid Build Coastguard Worker : majorVer(mjV), minMinor(miM), maxMinor(mxM) {} minVerVersionRange38*70a7ec85SAndroid Build Coastguard Worker constexpr inline Version minVer() const { return Version(majorVer, minMinor); } maxVerVersionRange39*70a7ec85SAndroid Build Coastguard Worker constexpr inline Version maxVer() const { return Version(majorVer, maxMinor); } isSingleVersionVersionRange40*70a7ec85SAndroid Build Coastguard Worker inline bool isSingleVersion() const { return minMinor == maxMinor; } 41*70a7ec85SAndroid Build Coastguard Worker 42*70a7ec85SAndroid Build Coastguard Worker inline bool operator==(const VersionRange &other) const { 43*70a7ec85SAndroid Build Coastguard Worker return majorVer == other.majorVer 44*70a7ec85SAndroid Build Coastguard Worker && minMinor == other.minMinor 45*70a7ec85SAndroid Build Coastguard Worker && maxMinor == other.maxMinor; 46*70a7ec85SAndroid Build Coastguard Worker } 47*70a7ec85SAndroid Build Coastguard Worker 48*70a7ec85SAndroid Build Coastguard Worker inline bool operator!=(const VersionRange& other) const { return !(*this == other); } 49*70a7ec85SAndroid Build Coastguard Worker containsVersionRange50*70a7ec85SAndroid Build Coastguard Worker inline bool contains(const Version &ver) const { 51*70a7ec85SAndroid Build Coastguard Worker return minVer() <= ver && ver <= maxVer(); 52*70a7ec85SAndroid Build Coastguard Worker } 53*70a7ec85SAndroid Build Coastguard Worker 54*70a7ec85SAndroid Build Coastguard Worker // If this == 2.3-7, 55*70a7ec85SAndroid Build Coastguard Worker // ver == 2.2: false 56*70a7ec85SAndroid Build Coastguard Worker // ver == 2.3: true 57*70a7ec85SAndroid Build Coastguard Worker // ver == 2.7: true 58*70a7ec85SAndroid Build Coastguard Worker // ver == 2.8: true supportedByVersionRange59*70a7ec85SAndroid Build Coastguard Worker inline bool supportedBy(const Version &ver) const { 60*70a7ec85SAndroid Build Coastguard Worker return majorVer == ver.majorVer && minMinor <= ver.minorVer; 61*70a7ec85SAndroid Build Coastguard Worker } 62*70a7ec85SAndroid Build Coastguard Worker 63*70a7ec85SAndroid Build Coastguard Worker // If a.overlaps(b) then b.overlaps(a). 64*70a7ec85SAndroid Build Coastguard Worker // 1.2-4 and 2.2-4: false 65*70a7ec85SAndroid Build Coastguard Worker // 1.2-4 and 1.4-5: true 66*70a7ec85SAndroid Build Coastguard Worker // 1.2-4 and 1.0-1: false overlapsVersionRange67*70a7ec85SAndroid Build Coastguard Worker inline bool overlaps(const VersionRange& other) const { 68*70a7ec85SAndroid Build Coastguard Worker return majorVer == other.majorVer && minMinor <= other.maxMinor && 69*70a7ec85SAndroid Build Coastguard Worker other.minMinor <= maxMinor; 70*70a7ec85SAndroid Build Coastguard Worker } 71*70a7ec85SAndroid Build Coastguard Worker 72*70a7ec85SAndroid Build Coastguard Worker size_t majorVer; 73*70a7ec85SAndroid Build Coastguard Worker size_t minMinor; 74*70a7ec85SAndroid Build Coastguard Worker size_t maxMinor; 75*70a7ec85SAndroid Build Coastguard Worker }; 76*70a7ec85SAndroid Build Coastguard Worker 77*70a7ec85SAndroid Build Coastguard Worker struct SepolicyVersionRange { 78*70a7ec85SAndroid Build Coastguard Worker size_t majorVer; 79*70a7ec85SAndroid Build Coastguard Worker std::optional<size_t> minMinor; 80*70a7ec85SAndroid Build Coastguard Worker std::optional<size_t> maxMinor; 81*70a7ec85SAndroid Build Coastguard Worker SepolicyVersionRangeSepolicyVersionRange82*70a7ec85SAndroid Build Coastguard Worker constexpr SepolicyVersionRange() : SepolicyVersionRange(0u, std::nullopt, std::nullopt) {} SepolicyVersionRangeSepolicyVersionRange83*70a7ec85SAndroid Build Coastguard Worker constexpr SepolicyVersionRange(size_t mjV, std::optional<size_t> miV) 84*70a7ec85SAndroid Build Coastguard Worker : SepolicyVersionRange(mjV, miV, miV) {} SepolicyVersionRangeSepolicyVersionRange85*70a7ec85SAndroid Build Coastguard Worker constexpr SepolicyVersionRange(size_t mjV, std::optional<size_t> miM, std::optional<size_t> mxM) 86*70a7ec85SAndroid Build Coastguard Worker : majorVer(mjV), minMinor(miM), maxMinor(mxM) {} minVerSepolicyVersionRange87*70a7ec85SAndroid Build Coastguard Worker constexpr inline SepolicyVersion minVer() const { return SepolicyVersion(majorVer, minMinor); } maxVerSepolicyVersionRange88*70a7ec85SAndroid Build Coastguard Worker constexpr inline SepolicyVersion maxVer() const { return SepolicyVersion(majorVer, maxMinor); } isSingleVersionSepolicyVersionRange89*70a7ec85SAndroid Build Coastguard Worker inline bool isSingleVersion() const { return minMinor == maxMinor; } 90*70a7ec85SAndroid Build Coastguard Worker 91*70a7ec85SAndroid Build Coastguard Worker bool operator==(const SepolicyVersionRange& other) const = default; 92*70a7ec85SAndroid Build Coastguard Worker bool operator!=(const SepolicyVersionRange& other) const = default; 93*70a7ec85SAndroid Build Coastguard Worker 94*70a7ec85SAndroid Build Coastguard Worker // If this == 2.3-7, 95*70a7ec85SAndroid Build Coastguard Worker // ver == 2.2: false 96*70a7ec85SAndroid Build Coastguard Worker // ver == 2.3: true 97*70a7ec85SAndroid Build Coastguard Worker // ver == 2.7: true 98*70a7ec85SAndroid Build Coastguard Worker // ver == 2.8: true supportedBySepolicyVersionRange99*70a7ec85SAndroid Build Coastguard Worker inline bool supportedBy(const SepolicyVersion& ver) const { 100*70a7ec85SAndroid Build Coastguard Worker return majorVer == ver.majorVer && minMinor <= ver.minorVer; 101*70a7ec85SAndroid Build Coastguard Worker } 102*70a7ec85SAndroid Build Coastguard Worker }; 103*70a7ec85SAndroid Build Coastguard Worker 104*70a7ec85SAndroid Build Coastguard Worker } // namespace vintf 105*70a7ec85SAndroid Build Coastguard Worker } // namespace android 106*70a7ec85SAndroid Build Coastguard Worker 107*70a7ec85SAndroid Build Coastguard Worker #endif // ANDROID_VINTF_VERSION_RANGE_H 108