#ifndef STOPWATCH_HPP
#define STOPWATCH_HPP
#include <chrono>
template <typename Clock = std::chrono::steady_clock>
class stopwatch
{
public:
typedef Clock clock;
typedef typename clock::time_point time_point;
typedef typename clock::duration duration;
private:
time_point last_;
public:
stopwatch()
: last_(clock::now())
{}
void reset()
{
*this = stopwatch();
}
time_point now() const
{
return clock::now();
}
duration elapsed() const
{
return now() - last_;
}
duration tick()
{
time_point dummy;
return tick(dummy);
}
duration tick(time_point& now_)
{
now_ = now();
auto elapsed = now_ - last_;
last_ = now_;
return elapsed;
}
};
typedef stopwatch<> default_stopwatch;
template <typename T, typename Rep, typename Period>
T duration_cast(const std::chrono::duration<Rep, Period>& duration)
{
return duration.count() * static_cast<T>(Period::num) / static_cast<T>(Period::den);
}
#endif
// cpp file
#include <iostream>
#include <thread>
int main()
{
default_stopwatch sw;
for (unsigned i = 0; i != 50; ++i)
{
std::this_thread::sleep_for(std::chrono::milliseconds(77));
std::cout << duration_cast<double>(sw.elapsed()) << '\n';
}
}
CiNpZm5kZWYgU1RPUFdBVENIX0hQUAojZGVmaW5lIFNUT1BXQVRDSF9IUFAKCiNpbmNsdWRlIDxjaHJvbm8+Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xvY2sgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrPgpjbGFzcyBzdG9wd2F0Y2gKewpwdWJsaWM6Cgl0eXBlZGVmIENsb2NrIGNsb2NrOwoJdHlwZWRlZiB0eXBlbmFtZSBjbG9jazo6dGltZV9wb2ludCB0aW1lX3BvaW50OwoJdHlwZWRlZiB0eXBlbmFtZSBjbG9jazo6ZHVyYXRpb24gZHVyYXRpb247Cgpwcml2YXRlOgoJdGltZV9wb2ludCBsYXN0XzsKCnB1YmxpYzoKCXN0b3B3YXRjaCgpCgkJOiBsYXN0XyhjbG9jazo6bm93KCkpCgl7fQoKCXZvaWQgcmVzZXQoKQoJewoJCSp0aGlzID0gc3RvcHdhdGNoKCk7Cgl9CgoJdGltZV9wb2ludCBub3coKSBjb25zdAoJewoJCXJldHVybiBjbG9jazo6bm93KCk7Cgl9CgoJZHVyYXRpb24gZWxhcHNlZCgpIGNvbnN0Cgl7CgkJcmV0dXJuIG5vdygpIC0gbGFzdF87Cgl9CgoJZHVyYXRpb24gdGljaygpCgl7CgkJdGltZV9wb2ludCBkdW1teTsKCQlyZXR1cm4gdGljayhkdW1teSk7Cgl9CgoJZHVyYXRpb24gdGljayh0aW1lX3BvaW50JiBub3dfKQoJewoJCW5vd18gPSBub3coKTsKCQlhdXRvIGVsYXBzZWQgPSBub3dfIC0gbGFzdF87CgkJbGFzdF8gPSBub3dfOwoJCXJldHVybiBlbGFwc2VkOwoJfQp9OwoKdHlwZWRlZiBzdG9wd2F0Y2g8PiBkZWZhdWx0X3N0b3B3YXRjaDsKCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBSZXAsIHR5cGVuYW1lIFBlcmlvZD4KVCBkdXJhdGlvbl9jYXN0KGNvbnN0IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxSZXAsIFBlcmlvZD4mIGR1cmF0aW9uKQp7CglyZXR1cm4gZHVyYXRpb24uY291bnQoKSAqIHN0YXRpY19jYXN0PFQ+KFBlcmlvZDo6bnVtKSAvIHN0YXRpY19jYXN0PFQ+KFBlcmlvZDo6ZGVuKTsKfQoKI2VuZGlmCgoKLy8gY3BwIGZpbGUKI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dGhyZWFkPgoKaW50IG1haW4oKQp7CglkZWZhdWx0X3N0b3B3YXRjaCBzdzsKCWZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gNTA7ICsraSkKCXsKCQlzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyg3NykpOwoJCXN0ZDo6Y291dCA8PCBkdXJhdGlvbl9jYXN0PGRvdWJsZT4oc3cuZWxhcHNlZCgpKSA8PCAnXG4nOwoJfQp9