// Copyright (c) 2011 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 "base/version.h" #include #include "base/logging.h" #include "base/string_number_conversions.h" #include "base/string_split.h" #include "base/string_util.h" Version::Version() { } Version::~Version() { } Version::Version(const std::string& version_str) { std::vector numbers; base::SplitString(version_str, '.', &numbers); if (numbers.empty()) return; std::vector parsed; for (std::vector::iterator i = numbers.begin(); i != numbers.end(); ++i) { int num; if (!base::StringToInt(*i, &num)) return; if (num < 0) return; const uint16 max = 0xFFFF; if (num > max) return; // This throws out things like +3, or 032. if (base::IntToString(num) != *i) return; parsed.push_back(static_cast(num)); } components_.swap(parsed); } bool Version::IsValid() const { return (!components_.empty()); } bool Version::IsOlderThan(const std::string& version_str) const { Version proposed_ver(version_str); if (!proposed_ver.IsValid()) return false; return (CompareTo(proposed_ver) < 0); } // TODO(cpu): remove this method. Version* Version::GetVersionFromString(const std::string& version_str) { Version* vers = new Version(version_str); if (vers->IsValid()) { return vers; } delete vers; return NULL; } // TODO(cpu): remove this method. Version* Version::Clone() const { DCHECK(IsValid()); return new Version(*this); } bool Version::Equals(const Version& that) const { DCHECK(IsValid()); DCHECK(that.IsValid()); return (CompareTo(that) == 0); } int Version::CompareTo(const Version& other) const { DCHECK(IsValid()); DCHECK(other.IsValid()); size_t count = std::min(components_.size(), other.components_.size()); for (size_t i = 0; i < count; ++i) { if (components_[i] > other.components_[i]) return 1; if (components_[i] < other.components_[i]) return -1; } if (components_.size() > other.components_.size()) { for (size_t i = count; i < components_.size(); ++i) if (components_[i] > 0) return 1; } else if (components_.size() < other.components_.size()) { for (size_t i = count; i < other.components_.size(); ++i) if (other.components_[i] > 0) return -1; } return 0; } const std::string Version::GetString() const { DCHECK(IsValid()); std::string version_str; size_t count = components_.size(); for (size_t i = 0; i < count - 1; ++i) { version_str.append(base::IntToString(components_[i])); version_str.append("."); } version_str.append(base::IntToString(components_[count - 1])); return version_str; }