// 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_CORE_QUIC_CLOCK_H_
#define QUICHE_QUIC_CORE_QUIC_CLOCK_H_

#include "quiche/quic/core/quic_time.h"
#include "quiche/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() = default;
  virtual ~QuicClock() = default;

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

  // 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);
  }
};

}  // namespace quic

#endif  // QUICHE_QUIC_CORE_QUIC_CLOCK_H_
