// Copyright 2017 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 CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_DATA_FORMAT_VERSION_H_
#define CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_DATA_FORMAT_VERSION_H_

#include <cstdint>
#include <limits>

#include "base/logging.h"
#include "content/common/content_export.h"

namespace content {

// Contains version data for the wire format used for encoding IndexedDB values.
// A version tuple (a, b) is at least as new as (a', b')
// iff a >= a' and b >= b'.
class IndexedDBDataFormatVersion {
 public:
  constexpr IndexedDBDataFormatVersion() {}
  constexpr IndexedDBDataFormatVersion(uint32_t v8_version,
                                       uint32_t blink_version)
      : v8_version_(v8_version), blink_version_(blink_version) {}

  static IndexedDBDataFormatVersion GetCurrent() { return current_; }
  static IndexedDBDataFormatVersion& GetMutableCurrentForTesting() {
    return current_;
  }

  uint32_t v8_version() const { return v8_version_; }
  uint32_t blink_version() const { return blink_version_; }

  bool operator==(const IndexedDBDataFormatVersion& other) const {
    return v8_version_ == other.v8_version_ &&
           blink_version_ == other.blink_version_;
  }
  bool operator!=(const IndexedDBDataFormatVersion& other) const {
    return !operator==(other);
  }

  bool IsAtLeast(const IndexedDBDataFormatVersion& other) const {
    return v8_version_ >= other.v8_version_ &&
           blink_version_ >= other.blink_version_;
  }

  // Encodes and decodes the tuple from an int64_t.
  // This scheme is chosen so that earlier versions (before we reported both the
  // Blink and V8 versions) decode properly, with a V8 version of 0.
  int64_t Encode() const {
    // Since negative values are considered invalid, this scheme will only work
    // as long as the v8 version would not overflow int32_t.  We check both
    // components, to be consistent.
    DCHECK_GE(static_cast<int32_t>(v8_version_), 0);
    DCHECK_GE(static_cast<int32_t>(blink_version_), 0);
    return (static_cast<int64_t>(v8_version_) << 32) | blink_version_;
  }
  static IndexedDBDataFormatVersion Decode(int64_t encoded) {
    DCHECK_GE(encoded, 0);
    return IndexedDBDataFormatVersion(encoded >> 32, encoded);
  }

 private:
  uint32_t v8_version_ = 0;
  uint32_t blink_version_ = 0;

  CONTENT_EXPORT static IndexedDBDataFormatVersion current_;
};

}  // namespace content

#endif  // CONTENT_BROWSER_INDEXED_DB_INDEXED_DB_DATA_FORMAT_VERSION_H_
