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