| // 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; |
| } |