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