1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===- VersionTuple.h - Version Number Handling -----------------*- C++ -*-===// 2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// The LLVM Compiler Infrastructure 4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// This file is distributed under the University of Illinois Open Source 6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// License. See LICENSE.TXT for details. 7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot// 8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \file 11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \brief Defines the clang::VersionTuple class, which represents a version in 12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// the form major[.minor[.subminor]]. 13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// 14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot//===----------------------------------------------------------------------===// 15f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#ifndef LLVM_CLANG_BASIC_VERSIONTUPLE_H 16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#define LLVM_CLANG_BASIC_VERSIONTUPLE_H 17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "clang/Basic/LLVM.h" 19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include "llvm/ADT/Optional.h" 20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <string> 21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#include <tuple> 22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotnamespace clang { 24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \brief Represents a version number in the form major[.minor[.subminor[.build]]]. 26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotclass VersionTuple { 27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Major : 31; 28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned UsesUnderscores : 1; 30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Minor : 31; 32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned HasMinor : 1; 33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Subminor : 31; 35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned HasSubminor : 1; 36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Build : 31; 38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned HasBuild : 1; 39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotpublic: 41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot VersionTuple() 42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : Major(0), UsesUnderscores(false), Minor(0), HasMinor(false), 43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Subminor(0), HasSubminor(false), Build(0), HasBuild(false) {} 44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot explicit VersionTuple(unsigned Major) 46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : Major(Major), UsesUnderscores(false), Minor(0), HasMinor(false), 47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Subminor(0), HasSubminor(false), Build(0), HasBuild(false) {} 48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot explicit VersionTuple(unsigned Major, unsigned Minor, 50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool UsesUnderscores = false) 51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : Major(Major), UsesUnderscores(UsesUnderscores), Minor(Minor), 52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HasMinor(true), Subminor(0), HasSubminor(false), Build(0), 53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HasBuild(false) {} 54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot explicit VersionTuple(unsigned Major, unsigned Minor, unsigned Subminor, 56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool UsesUnderscores = false) 57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : Major(Major), UsesUnderscores(UsesUnderscores), Minor(Minor), 58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HasMinor(true), Subminor(Subminor), HasSubminor(true), Build(0), 59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HasBuild(false) {} 60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot explicit VersionTuple(unsigned Major, unsigned Minor, unsigned Subminor, 62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned Build, bool UsesUnderscores = false) 63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot : Major(Major), UsesUnderscores(UsesUnderscores), Minor(Minor), 64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HasMinor(true), Subminor(Subminor), HasSubminor(true), Build(Build), 65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot HasBuild(true) {} 66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Determine whether this version information is empty 68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// (e.g., all version components are zero). 69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool empty() const { 70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Major == 0 && Minor == 0 && Subminor == 0 && Build == 0; 71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Retrieve the major version number. 74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot unsigned getMajor() const { return Major; } 75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Retrieve the minor version number, if provided. 77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Optional<unsigned> getMinor() const { 78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (!HasMinor) 79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return None; 80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Minor; 81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Retrieve the subminor version number, if provided. 84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Optional<unsigned> getSubminor() const { 85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (!HasSubminor) 86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return None; 87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Subminor; 88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Retrieve the build version number, if provided. 91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot Optional<unsigned> getBuild() const { 92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if (!HasBuild) 93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return None; 94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Build; 95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool usesUnderscores() const { 98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return UsesUnderscores; 99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot void UseDotAsSeparator() { 102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot UsesUnderscores = false; 103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Determine if two version numbers are equivalent. If not 106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// provided, minor and subminor version numbers are considered to be zero. 107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot friend bool operator==(const VersionTuple& X, const VersionTuple &Y) { 108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return X.Major == Y.Major && X.Minor == Y.Minor && 109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot X.Subminor == Y.Subminor && X.Build == Y.Build; 110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Determine if two version numbers are not equivalent. 113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// If not provided, minor and subminor version numbers are considered to be 115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// zero. 116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot friend bool operator!=(const VersionTuple &X, const VersionTuple &Y) { 117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return !(X == Y); 118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Determine whether one version number precedes another. 121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// If not provided, minor and subminor version numbers are considered to be 123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// zero. 124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot friend bool operator<(const VersionTuple &X, const VersionTuple &Y) { 125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return std::tie(X.Major, X.Minor, X.Subminor, X.Build) < 126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::tie(Y.Major, Y.Minor, Y.Subminor, Y.Build); 127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Determine whether one version number follows another. 130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// If not provided, minor and subminor version numbers are considered to be 132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// zero. 133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot friend bool operator>(const VersionTuple &X, const VersionTuple &Y) { 134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return Y < X; 135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Determine whether one version number precedes or is 138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// equivalent to another. 139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// If not provided, minor and subminor version numbers are considered to be 141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// zero. 142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot friend bool operator<=(const VersionTuple &X, const VersionTuple &Y) { 143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return !(Y < X); 144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Determine whether one version number follows or is 147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// equivalent to another. 148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// 149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// If not provided, minor and subminor version numbers are considered to be 150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// zero. 151f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot friend bool operator>=(const VersionTuple &X, const VersionTuple &Y) { 152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot return !(X < Y); 153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot } 154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Retrieve a string representation of the version number. 156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot std::string getAsString() const; 157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \brief Try to parse the given string as a version number. 159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// \returns \c true if the string does not match the regular expression 160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot /// [0-9]+(\.[0-9]+){0,3} 161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot bool tryParse(StringRef string); 162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot}; 163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot/// \brief Print a version number. 165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotraw_ostream& operator<<(raw_ostream &Out, const VersionTuple &V); 166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} // end namespace clang 168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#endif // LLVM_CLANG_BASIC_VERSIONTUPLE_H 169