diff options
| author | Robert Schumacher <roschuma@microsoft.com> | 2016-10-10 23:07:29 -0700 |
|---|---|---|
| committer | Robert Schumacher <roschuma@microsoft.com> | 2016-10-10 23:07:29 -0700 |
| commit | 9e1d40e4dc313de2e6de0ac4f60a2df224215ae2 (patch) | |
| tree | bc60827a29151d7829f4b6fdeaa8d6f60e8f8258 /toolsrc/src/Stopwatch.cpp | |
| parent | c494892eb24ce6f84c777f24dfceb71a4988fd24 (diff) | |
| parent | 23f187a45766057ef76baba9dc912270b403cb7d (diff) | |
| download | vcpkg-9e1d40e4dc313de2e6de0ac4f60a2df224215ae2.tar.gz vcpkg-9e1d40e4dc313de2e6de0ac4f60a2df224215ae2.zip | |
Merge branch 'master' of https://github.com/microsoft/vcpkg
Diffstat (limited to 'toolsrc/src/Stopwatch.cpp')
| -rw-r--r-- | toolsrc/src/Stopwatch.cpp | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/toolsrc/src/Stopwatch.cpp b/toolsrc/src/Stopwatch.cpp new file mode 100644 index 000000000..035d54c2b --- /dev/null +++ b/toolsrc/src/Stopwatch.cpp @@ -0,0 +1,104 @@ +#include "Stopwatch.h" +#include "vcpkg_Checks.h" + +namespace vcpkg +{ + Stopwatch Stopwatch::createUnstarted() + { + return Stopwatch(); + } + + Stopwatch Stopwatch::createStarted() + { + return Stopwatch().start(); + } + + bool Stopwatch::isRunning() const + { + return this->m_isRunning; + } + + Stopwatch& Stopwatch::start() + { + Checks::check_exit(!this->m_isRunning, "This stopwatch is already running."); + this->m_isRunning = true; + this->m_startTick = std::chrono::high_resolution_clock::now(); + return *this; + } + + Stopwatch& Stopwatch::stop() + { + auto tick = std::chrono::high_resolution_clock::now(); + Checks::check_exit(this->m_isRunning, "This stopwatch is already stopped."); + this->m_isRunning = false; + this->m_elapsedNanos += tick - this->m_startTick; + return *this; + } + + Stopwatch& Stopwatch::reset() + { + this->m_elapsedNanos = std::chrono::nanoseconds(); + this->m_isRunning = false; + return *this; + } + + std::string Stopwatch::toString() const + { + using std::chrono::hours; + using std::chrono::minutes; + using std::chrono::seconds; + using std::chrono::milliseconds; + using std::chrono::microseconds; + using std::chrono::nanoseconds; + using std::chrono::duration_cast; + + auto nanos = elapsedNanos(); + auto nanos_as_double = static_cast<double>(nanos.count()); + + if (duration_cast<hours>(nanos) > hours()) + { + auto t = nanos_as_double / duration_cast<nanoseconds>(hours(1)).count(); + return Strings::format("%.4g h", t); + } + + if (duration_cast<minutes>(nanos) > minutes()) + { + auto t = nanos_as_double / duration_cast<nanoseconds>(minutes(1)).count(); + return Strings::format("%.4g min", t); + } + + if (duration_cast<seconds>(nanos) > seconds()) + { + auto t = nanos_as_double / duration_cast<nanoseconds>(seconds(1)).count(); + return Strings::format("%.4g s", t); + } + + if (duration_cast<milliseconds>(nanos) > milliseconds()) + { + auto t = nanos_as_double / duration_cast<nanoseconds>(milliseconds(1)).count(); + return Strings::format("%.4g ms", t); + } + + if (duration_cast<microseconds>(nanos) > microseconds()) + { + auto t = nanos_as_double / duration_cast<nanoseconds>(microseconds(1)).count(); + return Strings::format("%.4g micros", t); + } + + return Strings::format("%.4g ns", nanos_as_double); + } + + Stopwatch::Stopwatch() : m_isRunning(false), m_elapsedNanos(), m_startTick() + { + } + + std::chrono::nanoseconds Stopwatch::elapsedNanos() const + { + if (this->m_isRunning) + { + return std::chrono::high_resolution_clock::now() - this->m_startTick + this->m_elapsedNanos; + } + + return this->m_elapsedNanos; + } +} |
