#pragma once #include "utils_meta.h" #include #include #include #include template struct Timer { using DurationType = ChronoDurationType; Timer() : started_at(Now()) {} void Restart() { started_at = Now(); } void Start() { Restart(); } auto Elapsed() const { return std::chrono::duration_cast(Now() - started_at); } private: static auto Now() { return std::chrono::high_resolution_clock::now().time_since_epoch(); } private: std::chrono::nanoseconds started_at; }; template class MeasuresCollector { public: using Result = my_result_of_t; explicit MeasuresCollector(MeasureFunc && measurment_func, const size_t preallocate_results = 10) : measurment_func_(std::move(measurment_func)) { results_.reserve(preallocate_results); } template void Add(NameType && name) { results_.emplace_back(name, measurment_func_()); } const auto & GetResults() const { return results_; } private: MeasureFunc measurment_func_; std::vector> results_; }; template MeasuresCollector collect(MeasureFunc && f) { return MeasuresCollector(std::forward(f)); }