// Copyright 2018 The Fuchsia 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 SRC_LIB_TIMEKEEPER_CLOCK_H_
#define SRC_LIB_TIMEKEEPER_CLOCK_H_

#include <lib/zx/time.h>

namespace timekeeper {

// Abstraction over the clock.
//
// This class allows to retrieve the current time for any supported clock id.
// This being a class, it allows to inject custom behavior for tests.
class Clock {
 public:
  Clock() = default;
  virtual ~Clock() = default;
  Clock(const Clock&) = delete;
  Clock& operator=(const Clock&) = delete;

  // Returns the current time for |kClockId|. See |zx_clock_get|.
  template <zx_clock_t kClockId>
  zx_status_t Now(zx::basic_time<kClockId>* result) const {
    zx_time_t time;
    zx_status_t status = GetTime(kClockId, &time);
    *result = zx::basic_time<kClockId>(time);
    return status;
  }

  // Returns the current monotonic time. See |zx_clock_get_monotonic|.
  zx::time Now() const { return zx::time(GetMonotonicTime()); }

 protected:
  // Returns the current time for |kClockId|. See |zx_clock_get|.
  virtual zx_status_t GetTime(zx_clock_t clock_id, zx_time_t* time) const = 0;
  // Returns the current monotonic time. See |zx_clock_get_monotonic|.
  virtual zx_time_t GetMonotonicTime() const = 0;
};

}  // namespace timekeeper

#endif  // SRC_LIB_TIMEKEEPER_CLOCK_H_
