// Copyright (c) 2012 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 QUICHE_QUIC_PLATFORM_API_QUIC_CLOCK_H_
#define QUICHE_QUIC_PLATFORM_API_QUIC_CLOCK_H_

#include "net/third_party/quiche/src/quic/core/quic_time.h"
#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"

namespace quic {

// Interface for retrieving the current time.
class QUIC_EXPORT_PRIVATE QuicClock {
 public:
  QuicClock();
  virtual ~QuicClock();

  QuicClock(const QuicClock&) = delete;
  QuicClock& operator=(const QuicClock&) = delete;

  // Compute the offset between this clock with the Unix Epoch clock.
  // Return the calibrated offset between WallNow() and Now(), in the form of
  // (wallnow_in_us - now_in_us).
  // The return value can be used by SetCalibrationOffset() to actually
  // calibrate the clock, or all instances of this clock type.
  QuicTime::Delta ComputeCalibrationOffset() const;

  // Calibrate this clock. A calibrated clock guarantees that the
  // ConvertWallTimeToQuicTime() function always return the same result for the
  // same walltime.
  // Should not be called more than once for each QuicClock.
  void SetCalibrationOffset(QuicTime::Delta offset);

  // Returns the approximate current time as a QuicTime object.
  virtual QuicTime ApproximateNow() const = 0;

  // Returns the current time as a QuicTime object.
  // Note: this use significant resources please use only if needed.
  virtual QuicTime Now() const = 0;

  // WallNow returns the current wall-time - a time that is consistent across
  // different clocks.
  virtual QuicWallTime WallNow() const = 0;

  // Converts |walltime| to a QuicTime relative to this clock's epoch.
  virtual QuicTime ConvertWallTimeToQuicTime(
      const QuicWallTime& walltime) const;

 protected:
  // Creates a new QuicTime using |time_us| as the internal value.
  QuicTime CreateTimeFromMicroseconds(uint64_t time_us) const {
    return QuicTime(time_us);
  }

 private:
  // True if |calibration_offset_| is valid.
  bool is_calibrated_;
  // If |is_calibrated_|, |calibration_offset_| is the (fixed) offset between
  // the Unix Epoch clock and this clock.
  // In other words, the offset between WallNow() and Now().
  QuicTime::Delta calibration_offset_;
};

}  // namespace quic

#endif  // QUICHE_QUIC_PLATFORM_API_QUIC_CLOCK_H_
