// Copyright 2015 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_BASE_CLOCK_H_
#define COBALT_BASE_CLOCK_H_

#include "base/basictypes.h"
#include "base/logging.h"
#include "base/memory/ref_counted.h"
#include "base/time/time.h"

namespace base {

// A generic base::BasicClock interface for querying the current time.
// Inserting a level of indirection between querying for the current time allows
// one to have greater control over how their system reacts to time changes.
class BasicClock : public ::base::RefCountedThreadSafe<BasicClock> {
 public:
  virtual ::base::TimeDelta Now() = 0;

 protected:
  virtual ~BasicClock() {}
  friend class ::base::RefCountedThreadSafe<BasicClock>;
};

// The SystemClock calls in to the standard ::base::TimeTicks::HighResNow()
// method to obtain a time.
class SystemMonotonicClock : public BasicClock {
 public:
  SystemMonotonicClock() { origin_ = ::base::TimeTicks::Now(); }

  ::base::TimeDelta Now() override {
    return ::base::TimeTicks::Now() - origin_;
  }

 private:
  ::base::TimeTicks origin_;

  ~SystemMonotonicClock() override {}
};

// The MinimumResolutionClock modifies the output of an existing clock by
// clamping its minimum resolution to a predefined amount.  This is implemented
// by rounding down the existing clock's time to the previous multiple of the
// desired clock resolution.
class MinimumResolutionClock : public BasicClock {
 public:
  MinimumResolutionClock(scoped_refptr<BasicClock> parent,
                         const ::base::TimeDelta& min_resolution)
      : parent_(parent),
        min_resolution_in_microseconds_(min_resolution.InMicroseconds()) {
    DCHECK(parent);
  }

  ::base::TimeDelta Now() override {
    ::base::TimeDelta now = parent_->Now();
    int64 microseconds = now.InMicroseconds();
    return ::base::TimeDelta::FromMicroseconds(
        microseconds - (microseconds % min_resolution_in_microseconds_));
  }

 private:
  scoped_refptr<BasicClock> parent_;
  const int64_t min_resolution_in_microseconds_;
};

// The OffsetClock takes a parent clock and an offset upon construction, and
// when queried for the time it returns the time of the parent clock offset by
// the specified offset.
class OffsetClock : public BasicClock {
 public:
  OffsetClock(const scoped_refptr<BasicClock> parent,
              const ::base::TimeDelta& origin)
      : parent_(parent), origin_(origin) {
    DCHECK(parent_);
  }

  ::base::TimeDelta Now() override { return parent_->Now() - origin_; }

  ::base::TimeDelta origin() const { return origin_; }

 private:
  ~OffsetClock() override {}

  scoped_refptr<BasicClock> parent_;
  const ::base::TimeDelta origin_;
};

// Simple clock that needs to be manually advanced.
class ManualAdvanceClock : public BasicClock {
 public:
  ::base::TimeDelta Now() override { return value_; }

  void Advance(const ::base::TimeDelta& advance_amount) {
    DCHECK_GE(advance_amount, ::base::TimeDelta());
    value_ += advance_amount;
  }

 private:
  ~ManualAdvanceClock() override {}

  ::base::TimeDelta value_;
};

}  // namespace base

#endif  // COBALT_BASE_CLOCK_H_
