blob: 0ed25f2feea1b40b9e2c22b014265a1ae3646422 [file] [log] [blame]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "gn/version.h"
#include <iostream>
#include <string_view>
#include <tuple>
#include "base/strings/string_number_conversions.h"
using namespace std::literals;
constexpr std::string_view kDot = "."sv;
Version::Version(int major, int minor, int patch)
: major_(major), minor_(minor), patch_(patch) {}
// static
std::optional<Version> Version::FromString(std::string s) {
int major = 0, minor = 0, patch = 0;
// First, parse the major version.
size_t major_begin = 0;
if (size_t major_end = s.find(kDot, major_begin);
major_end != std::string::npos) {
if (!base::StringToInt(s.substr(major_begin, major_end - major_begin),
&major))
return {};
// Then, parse the minor version.
size_t minor_begin = major_end + kDot.size();
if (size_t minor_end = s.find(kDot, minor_begin);
minor_end != std::string::npos) {
if (!base::StringToInt(s.substr(minor_begin, minor_end - minor_begin),
&minor))
return {};
// Finally, parse the patch version.
size_t patch_begin = minor_end + kDot.size();
if (!base::StringToInt(s.substr(patch_begin, std::string::npos), &patch))
return {};
return Version(major, minor, patch);
}
}
return {};
}
bool Version::operator==(const Version& other) const {
return other.major_ == major_ && other.minor_ == minor_ &&
other.patch_ == patch_;
}
bool Version::operator<(const Version& other) const {
return std::tie(major_, minor_, patch_) <
std::tie(other.major_, other.minor_, other.patch_);
}
bool Version::operator!=(const Version& other) const {
return !(*this == other);
}
bool Version::operator>=(const Version& other) const {
return !(*this < other);
}
bool Version::operator>(const Version& other) const {
return other < *this;
}
bool Version::operator<=(const Version& other) const {
return !(*this > other);
}
std::string Version::Describe() const {
std::string ret;
ret += base::IntToString(major_);
ret += kDot;
ret += base::IntToString(minor_);
ret += kDot;
ret += base::IntToString(patch_);
return ret;
}