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