| // 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. |
| |
| #pragma once |
| |
| #include <cobalt-client/cpp/histogram.h> |
| #include <lib/fzl/time.h> |
| #include <lib/zx/time.h> |
| #include <zircon/assert.h> |
| |
| namespace cobalt_client { |
| namespace internal { |
| |
| template <typename Clock> class TimerBase { |
| public: |
| explicit TimerBase(bool is_collecting) : start_(is_collecting ? Clock::now().get() : 0) {} |
| TimerBase(const TimerBase&) = delete; |
| TimerBase(TimerBase&& other) : start_(other.start_) { other.start_ = zx::ticks(0); } |
| TimerBase& operator=(const TimerBase&) = delete; |
| TimerBase& operator=(TimerBase&& other) = delete; |
| ~TimerBase() = default; |
| |
| // Returns the duration since creation. If |is_collecting| is false, will return |
| // 0. |
| zx::duration End() { |
| if (start_.get() == 0) { |
| return zx::duration(0); |
| } |
| return fzl::TicksToNs(Clock::now() - start_); |
| } |
| |
| // Resets the timer. If |is_collecting| is false, has no effect. |
| void Reset() { |
| if (start_.get() == 0) { |
| return; |
| } |
| start_ = Clock::now(); |
| } |
| |
| private: |
| zx::ticks start_; |
| }; |
| } // namespace internal |
| |
| // Utility class for measuring the amount of ticks in an interval. |
| // |
| // This class is moveable, but not copyable or assignable. |
| using Timer = internal::TimerBase<zx::ticks>; |
| |
| } // namespace cobalt_client |