// 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"

/* API_DESCRIPTION
 QuicClock is used by QUIC core to get current time. Its instance is created by
 applications and passed into QuicDispatcher and QuicConnectionHelperInterface.
 API-DESCRIPTION */

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_
