| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #pragma once |
|
|
| #include <chrono> |
|
|
| namespace utilities { |
|
|
| class timer { |
| public: |
| using nanoseconds = std::chrono::nanoseconds; |
| using microseconds = std::chrono::microseconds; |
| using milliseconds = std::chrono::milliseconds; |
| using seconds = std::chrono::seconds; |
| using minutes = std::chrono::minutes; |
| using hours = std::chrono::hours; |
|
|
| timer() { |
| start(); |
| } |
|
|
| void start() { |
| stop(); |
| this->start_ = this->end_; |
| } |
|
|
| void stop() { |
| #ifdef _MSC_VER |
| this->end_ = std::chrono::system_clock::now(); |
| #else |
| this->end_ = std::chrono::high_resolution_clock::now(); |
| #endif |
| } |
|
|
| template<typename T> |
| float elapsed() { |
| if (this->end_ <= this->start_) { |
| this->stop(); |
| } |
|
|
| if (std::is_same_v<T, std::chrono::nanoseconds>) { |
| const auto t = std::chrono::duration_cast<std::chrono::nanoseconds>(this->end_ - this->start_).count(); |
| return static_cast<float>(t); |
| } |
| if (std::is_same_v<T, std::chrono::microseconds>) { |
| const auto t = std::chrono::duration_cast<std::chrono::nanoseconds>(this->end_ - this->start_).count(); |
| return static_cast<float>(t) / 1000.f; |
| } |
| if (std::is_same_v<T, std::chrono::milliseconds>) { |
| const auto t = std::chrono::duration_cast<std::chrono::microseconds>(this->end_ - this->start_).count(); |
| return static_cast<float>(t) / 1000.f; |
| } |
| if (std::is_same_v<T, std::chrono::seconds>) { |
| const auto t = std::chrono::duration_cast<std::chrono::milliseconds>(this->end_ - this->start_).count(); |
| return static_cast<float>(t) / 1000.f; |
| } |
| if (std::is_same_v<T, std::chrono::minutes>) { |
| const auto t = std::chrono::duration_cast<std::chrono::milliseconds>(this->end_ - this->start_).count(); |
| return static_cast<float>(t) / (60.f * 1000.f); |
| } |
| if (std::is_same_v<T, std::chrono::hours>) { |
| const auto t = std::chrono::duration_cast<std::chrono::seconds>(this->end_ - this->start_).count(); |
| return static_cast<float>(t) / (60.f * 60.f); |
| } |
| return 0.f; |
| } |
|
|
| float elapsed() { |
| return elapsed<std::chrono::milliseconds>(); |
| } |
|
|
| private: |
| std::chrono::system_clock::time_point start_, end_; |
| }; |
|
|
| } |
|
|