#pragma once #include "types.hpp" #include #include namespace util { using std::chrono::system_clock; using namespace std::chrono_literals; template auto time_of(F &&fn) -> std::chrono::duration { const auto start = std::chrono::system_clock::now(); fn(); const auto end = std::chrono::system_clock::now(); return {end - start}; } class Delta { system_clock::time_point last; public: Delta() : last(system_clock::now()) {} template inline auto has_elapsed(const std::chrono::duration &duration) -> bool { const auto now = system_clock::now(); if (duration < (now - last)) { last = now; return true; } else { return false; } } template inline auto elapsed() -> std::chrono::duration { const auto now = system_clock::now(); const auto duration = std::chrono::duration_cast>(now - last); last = now; return duration; } inline auto has_elapsed_s(f64 seconds) -> bool { return has_elapsed(std::chrono::duration(seconds)); } inline auto has_elapsed_ms(i64 milliseconds) -> bool { return has_elapsed(std::chrono::duration(milliseconds)); } inline auto elapsed_ms() -> std::chrono::duration { const auto now = system_clock::now(); const auto duration = std::chrono::duration_cast( system_clock::now() - last); last = now; return duration; } inline auto elapsed_s() -> std::chrono::duration { const auto now = system_clock::now(); const auto duration = std::chrono::duration(system_clock::now() - last); last = now; return duration; } }; } // namespace util