//===- VersionTuple.h - Version Number Handling -----------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This header defines the VersionTuple class, which represents a version in
// the form major[.minor[.subminor]].
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_BASIC_VERSIONTUPLE_H
#define LLVM_CLANG_BASIC_VERSIONTUPLE_H

#include "clang/Basic/LLVM.h"
#include "llvm/ADT/Optional.h"
#include <string>

namespace clang {

/// \brief Represents a version number in the form major[.minor[.subminor]].
class VersionTuple {
  unsigned Major;
  unsigned Minor : 31;
  unsigned Subminor : 31;
  unsigned HasMinor : 1;
  unsigned HasSubminor : 1;

public:
  VersionTuple() 
    : Major(0), Minor(0), Subminor(0), HasMinor(false), HasSubminor(false) { }

  explicit VersionTuple(unsigned Major)
    : Major(Major), Minor(0), Subminor(0), HasMinor(false), HasSubminor(false)
  { }

  explicit VersionTuple(unsigned Major, unsigned Minor)
    : Major(Major), Minor(Minor), Subminor(0), HasMinor(true), 
      HasSubminor(false)
  { }

  explicit VersionTuple(unsigned Major, unsigned Minor, unsigned Subminor)
    : Major(Major), Minor(Minor), Subminor(Subminor), HasMinor(true), 
      HasSubminor(true)
  { }

  /// \brief Determine whether this version information is empty
  /// (e.g., all version components are zero).
  bool empty() const { return Major == 0 && Minor == 0 && Subminor == 0; }

  /// \brief Retrieve the major version number.
  unsigned getMajor() const { return Major; }

  /// \brief Retrieve the minor version number, if provided.
  llvm::Optional<unsigned> getMinor() const { 
    if (!HasMinor)
      return llvm::Optional<unsigned>();
    return Minor;
  }

  /// \brief Retrieve the subminor version number, if provided.
  llvm::Optional<unsigned> getSubminor() const { 
    if (!HasSubminor)
      return llvm::Optional<unsigned>();
    return Subminor;
  }

  /// \brief Determine if two version numbers are equivalent. If not
  /// provided, minor and subminor version numbers are considered to be zero.
  friend bool operator==(const VersionTuple& X, const VersionTuple &Y) {
    return X.Major == Y.Major && X.Minor == Y.Minor && X.Subminor == Y.Subminor;
  }

  /// \brief Determine if two version numbers are not equivalent. If
  /// not provided, minor and subminor version numbers are considered to be 
  /// zero.
  friend bool operator!=(const VersionTuple &X, const VersionTuple &Y) {
    return !(X == Y);
  }

  /// \brief Determine whether one version number precedes another. If not
  /// provided, minor and subminor version numbers are considered to be zero.
  friend bool operator<(const VersionTuple &X, const VersionTuple &Y) {
    if (X.Major != Y.Major)
      return X.Major < Y.Major;

    if (X.Minor != Y.Minor)
      return X.Minor < Y.Minor;

    return X.Subminor < Y.Subminor;
  }

  /// \brief Determine whether one version number follows another. If not
  /// provided, minor and subminor version numbers are considered to be zero.
  friend bool operator>(const VersionTuple &X, const VersionTuple &Y) {
    return Y < X;
  }

  /// \brief Determine whether one version number precedes or is
  /// equivalent to another. If not provided, minor and subminor
  /// version numbers are considered to be zero.
  friend bool operator<=(const VersionTuple &X, const VersionTuple &Y) {
    return !(Y < X);
  }

  /// \brief Determine whether one version number follows or is
  /// equivalent to another. If not provided, minor and subminor
  /// version numbers are considered to be zero.
  friend bool operator>=(const VersionTuple &X, const VersionTuple &Y) {
    return !(X < Y);
  }

  /// \brief Retrieve a string representation of the version number/
  std::string getAsString() const;
};

/// \brief Print a version number.
raw_ostream& operator<<(raw_ostream &Out, const VersionTuple &V);

} // end namespace clang
#endif // LLVM_CLANG_BASIC_VERSIONTUPLE_H
