29 lines
561 B
C++
29 lines
561 B
C++
// -*- mode: c++ -*-
|
|
|
|
#pragma once
|
|
|
|
namespace atlas::time {
|
|
template <typename Duration>
|
|
class Timer {
|
|
public:
|
|
using duration_type = Duration;
|
|
|
|
virtual ~Timer() = default;
|
|
virtual auto start() -> void = 0;
|
|
virtual auto elapsed() const -> duration_type;
|
|
|
|
template <typename T>
|
|
struct TimerResult {
|
|
T value;
|
|
duration_type duration;
|
|
};
|
|
|
|
template <typename F>
|
|
[[nodiscard]] auto measure(F&& f) -> TimerResult<decltype(f())>
|
|
{
|
|
start();
|
|
auto v = f();
|
|
return { v, elapsed() };
|
|
}
|
|
};
|
|
}
|