blob: fa35d8a06493aca42eb41fc72d46b78dcd97de39 [file] [log] [blame]
// Copyright 2019 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.
#ifndef REMOTING_CLIENT_NOTIFICATION_VERSION_RANGE_H_
#define REMOTING_CLIENT_NOTIFICATION_VERSION_RANGE_H_
#include <string>
#include "base/version.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace remoting {
// Class representing a range of dotted version numbers. Supporting parsing and
// in-range checking.
class VersionRange final {
public:
// Parses a range spec into range.
//
// Format (regex):
// ([\(\[]((\d+\.)*\d+)?-((\d+\.)*\d+)?[\)\]]|(\d+\.)*\d+)
//
// Examples:
// 1.2.3 Exactly 1.2.3
// [-1.2.3) Anything up to but not including 1.2.3
// [1.2-3) Anything between 1.2 (inclusive) and 3 (exclusive)
// (1.2-3] Anything between 1.2 (exclusive) and 3 (inclusive)
// [1.2-) 1.2 (inclusive) and higher
// [-] Anything
//
// Min version must be less than or equal to max version.
explicit VersionRange(const std::string& range_spec);
VersionRange(const VersionRange&) = delete;
VersionRange& operator=(const VersionRange&) = delete;
~VersionRange();
bool IsValid() const;
bool ContainsVersion(const std::string& version_string) const;
private:
absl::optional<base::Version> min_version_;
absl::optional<base::Version> max_version_;
bool is_min_version_inclusive_ = false;
bool is_max_version_inclusive_ = false;
};
} // namespace remoting
#endif // REMOTING_CLIENT_NOTIFICATION_VERSION_RANGE_H_