1177633Sdfr//===- VersionTuple.h - Version Number Handling -----------------*- C++ -*-===// 2177633Sdfr// 3177633Sdfr// The LLVM Compiler Infrastructure 4177633Sdfr// 5177633Sdfr// This file is distributed under the University of Illinois Open Source 6177633Sdfr// License. See LICENSE.TXT for details. 7177633Sdfr// 8177633Sdfr//===----------------------------------------------------------------------===// 9177633Sdfr/// 10177633Sdfr/// \file 11177633Sdfr/// \brief Defines the clang::VersionTuple class, which represents a version in 12177633Sdfr/// the form major[.minor[.subminor]]. 13177633Sdfr/// 14177633Sdfr//===----------------------------------------------------------------------===// 15177633Sdfr#ifndef LLVM_CLANG_BASIC_VERSIONTUPLE_H 16177633Sdfr#define LLVM_CLANG_BASIC_VERSIONTUPLE_H 17177633Sdfr 18177633Sdfr#include "clang/Basic/LLVM.h" 19177633Sdfr#include "llvm/ADT/Optional.h" 20177633Sdfr#include <string> 21177633Sdfr 22177633Sdfrnamespace clang { 23177633Sdfr 24177633Sdfr/// \brief Represents a version number in the form major[.minor[.subminor]]. 25177633Sdfrclass VersionTuple { 26177633Sdfr unsigned Major; 27177633Sdfr unsigned Minor : 31; 28177633Sdfr unsigned Subminor : 31; 29177633Sdfr unsigned HasMinor : 1; 30177633Sdfr unsigned HasSubminor : 1; 31177685Sdfr 32177685Sdfrpublic: 33177633Sdfr VersionTuple() 34177633Sdfr : Major(0), Minor(0), Subminor(0), HasMinor(false), HasSubminor(false) { } 35177633Sdfr 36177633Sdfr explicit VersionTuple(unsigned Major) 37177633Sdfr : Major(Major), Minor(0), Subminor(0), HasMinor(false), HasSubminor(false) 38177633Sdfr { } 39177633Sdfr 40177633Sdfr explicit VersionTuple(unsigned Major, unsigned Minor) 41177633Sdfr : Major(Major), Minor(Minor), Subminor(0), HasMinor(true), 42177633Sdfr HasSubminor(false) 43177633Sdfr { } 44177633Sdfr 45177633Sdfr explicit VersionTuple(unsigned Major, unsigned Minor, unsigned Subminor) 46177633Sdfr : Major(Major), Minor(Minor), Subminor(Subminor), HasMinor(true), 47177633Sdfr HasSubminor(true) 48177633Sdfr { } 49177633Sdfr 50177633Sdfr /// \brief Determine whether this version information is empty 51177633Sdfr /// (e.g., all version components are zero). 52177633Sdfr bool empty() const { return Major == 0 && Minor == 0 && Subminor == 0; } 53177633Sdfr 54177633Sdfr /// \brief Retrieve the major version number. 55177633Sdfr unsigned getMajor() const { return Major; } 56177633Sdfr 57177633Sdfr /// \brief Retrieve the minor version number, if provided. 58177633Sdfr Optional<unsigned> getMinor() const { 59177633Sdfr if (!HasMinor) 60184588Sdfr return None; 61177633Sdfr return Minor; 62184588Sdfr } 63177633Sdfr 64177633Sdfr /// \brief Retrieve the subminor version number, if provided. 65177633Sdfr Optional<unsigned> getSubminor() const { 66177633Sdfr if (!HasSubminor) 67177633Sdfr return None; 68177633Sdfr return Subminor; 69177633Sdfr } 70177633Sdfr 71177633Sdfr /// \brief Determine if two version numbers are equivalent. If not 72184588Sdfr /// provided, minor and subminor version numbers are considered to be zero. 73184588Sdfr friend bool operator==(const VersionTuple& X, const VersionTuple &Y) { 74177633Sdfr return X.Major == Y.Major && X.Minor == Y.Minor && X.Subminor == Y.Subminor; 75177633Sdfr } 76177633Sdfr 77184588Sdfr /// \brief Determine if two version numbers are not equivalent. 78184588Sdfr /// 79184588Sdfr /// If not provided, minor and subminor version numbers are considered to be 80177633Sdfr /// zero. 81177633Sdfr friend bool operator!=(const VersionTuple &X, const VersionTuple &Y) { 82177633Sdfr return !(X == Y); 83184588Sdfr } 84184588Sdfr 85177633Sdfr /// \brief Determine whether one version number precedes another. 86184588Sdfr /// 87177633Sdfr /// If not provided, minor and subminor version numbers are considered to be 88177633Sdfr /// zero. 89177633Sdfr friend bool operator<(const VersionTuple &X, const VersionTuple &Y) { 90184886Sdfr if (X.Major != Y.Major) 91177633Sdfr return X.Major < Y.Major; 92177633Sdfr 93177633Sdfr if (X.Minor != Y.Minor) 94177633Sdfr return X.Minor < Y.Minor; 95177633Sdfr 96177633Sdfr return X.Subminor < Y.Subminor; 97177633Sdfr } 98177633Sdfr 99177633Sdfr /// \brief Determine whether one version number follows another. 100177633Sdfr /// 101177633Sdfr /// If not provided, minor and subminor version numbers are considered to be 102177633Sdfr /// zero. 103177633Sdfr friend bool operator>(const VersionTuple &X, const VersionTuple &Y) { 104177633Sdfr return Y < X; 105177633Sdfr } 106177633Sdfr 107177633Sdfr /// \brief Determine whether one version number precedes or is 108177633Sdfr /// equivalent to another. 109177633Sdfr /// 110177633Sdfr /// If not provided, minor and subminor version numbers are considered to be 111177633Sdfr /// zero. 112177633Sdfr friend bool operator<=(const VersionTuple &X, const VersionTuple &Y) { 113177633Sdfr return !(Y < X); 114177633Sdfr } 115177633Sdfr 116177633Sdfr /// \brief Determine whether one version number follows or is 117177633Sdfr /// equivalent to another. 118177633Sdfr /// 119177633Sdfr /// If not provided, minor and subminor version numbers are considered to be 120177633Sdfr /// zero. 121177633Sdfr friend bool operator>=(const VersionTuple &X, const VersionTuple &Y) { 122177633Sdfr return !(X < Y); 123177633Sdfr } 124177633Sdfr 125177633Sdfr /// \brief Retrieve a string representation of the version number. 126177633Sdfr std::string getAsString() const; 127177633Sdfr 128184588Sdfr /// \brief Try to parse the given string as a version number. 129177633Sdfr /// \returns \c true if the string does not match the regular expression 130184588Sdfr /// [0-9]+(\.[0-9]+(\.[0-9]+)) 131177633Sdfr bool tryParse(StringRef string); 132177633Sdfr}; 133177633Sdfr 134177633Sdfr/// \brief Print a version number. 135177633Sdfrraw_ostream& operator<<(raw_ostream &Out, const VersionTuple &V); 136177633Sdfr 137177633Sdfr} // end namespace clang 138177633Sdfr#endif // LLVM_CLANG_BASIC_VERSIONTUPLE_H 139177633Sdfr