#ifndef CLOCK_TIMESPEC_H
#define CLOCK_TIMESPEC_H
#include <time.h>
#include <cassert>
#include <stdexcept>
#include <iostream>
namespace clock {
typedef timespec ts;
static clockid_t const clock_source = CLOCK_REALTIME;
ts now()
{
ts t;
int const res = clock_gettime(clock_source, &t);
if (res)
throw std::runtime_error("timing::now failed");
return t;
}
ts minute(unsigned int m)
{
ts t = {0, 0};
t.tv_sec = 60 * m;
return t;
}
ts second(unsigned int s)
{
ts t = {0, 0};
t.tv_sec = s;
return t;
}
ts millisecond(unsigned int ms)
{
ts t = {0, 0};
t.tv_nsec = 1000000 * ms;
return t;
}
ts microsecond(unsigned int us)
{
ts t = {0, 0};
t.tv_nsec = 1000 * us;
return t;
}
ts nanosecond(unsigned int ns)
{
ts t = {0, 0};
t.tv_nsec = ns;
return t;
}
ts operator+(ts const& a, ts const& b)
{
ts t = {0, 0};
// tv_nsec<1*10^9 => a.tv_nsec+b.tv_nsec < 2*10^9 < max(31 bit)
t.tv_nsec = a.tv_nsec + b.tv_nsec;
if (t.tv_nsec >= 1000000000)
{
t.tv_sec = 1;
t.tv_nsec -= 1000000000;
}
t.tv_sec += a.tv_sec + b.tv_sec;
return t;
}
}
#endif
I2lmbmRlZiBDTE9DS19USU1FU1BFQ19ICiNkZWZpbmUgQ0xPQ0tfVElNRVNQRUNfSAoKCiNpbmNsdWRlIDx0aW1lLmg+CgojaW5jbHVkZSA8Y2Fzc2VydD4KI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKbmFtZXNwYWNlIGNsb2NrIHsKCnR5cGVkZWYgdGltZXNwZWMgdHM7CgpzdGF0aWMgY2xvY2tpZF90IGNvbnN0IGNsb2NrX3NvdXJjZSA9IENMT0NLX1JFQUxUSU1FOwoKdHMgbm93KCkKewogICAgdHMgdDsKICAgIGludCBjb25zdCByZXMgPSBjbG9ja19nZXR0aW1lKGNsb2NrX3NvdXJjZSwgJnQpOwogICAgaWYgKHJlcykKICAgICAgICB0aHJvdyBzdGQ6OnJ1bnRpbWVfZXJyb3IoInRpbWluZzo6bm93IGZhaWxlZCIpOwogICAgcmV0dXJuIHQ7Cn0KCnRzIG1pbnV0ZSh1bnNpZ25lZCBpbnQgbSkKewogICAgdHMgdCA9IHswLCAwfTsKICAgIHQudHZfc2VjID0gNjAgKiBtOwogICAgcmV0dXJuIHQ7Cn0KCnRzIHNlY29uZCh1bnNpZ25lZCBpbnQgcykKewogICAgdHMgdCA9IHswLCAwfTsKICAgIHQudHZfc2VjID0gczsKICAgIHJldHVybiB0Owp9Cgp0cyBtaWxsaXNlY29uZCh1bnNpZ25lZCBpbnQgbXMpCnsKICAgIHRzIHQgPSB7MCwgMH07CiAgICB0LnR2X25zZWMgPSAxMDAwMDAwICogbXM7CiAgICByZXR1cm4gdDsKfQoKdHMgbWljcm9zZWNvbmQodW5zaWduZWQgaW50IHVzKQp7CiAgICB0cyB0ID0gezAsIDB9OwogICAgdC50dl9uc2VjID0gMTAwMCAqIHVzOwogICAgcmV0dXJuIHQ7Cn0KCnRzIG5hbm9zZWNvbmQodW5zaWduZWQgaW50IG5zKQp7CiAgICB0cyB0ID0gezAsIDB9OwogICAgdC50dl9uc2VjID0gbnM7CiAgICByZXR1cm4gdDsKfQoKdHMgb3BlcmF0b3IrKHRzIGNvbnN0JiBhLCB0cyBjb25zdCYgYikKewogICAgdHMgdCA9IHswLCAwfTsKICAgIC8vIHR2X25zZWM8MSoxMF45ID0+IGEudHZfbnNlYytiLnR2X25zZWMgPCAyKjEwXjkgPCBtYXgoMzEgYml0KQogICAgdC50dl9uc2VjID0gYS50dl9uc2VjICsgYi50dl9uc2VjOwogICAgaWYgKHQudHZfbnNlYyA+PSAxMDAwMDAwMDAwKQogICAgewogICAgICAgIHQudHZfc2VjID0gMTsKICAgICAgICB0LnR2X25zZWMgLT0gMTAwMDAwMDAwMDsKICAgIH0KICAgIHQudHZfc2VjICs9IGEudHZfc2VjICsgYi50dl9zZWM7CiAgICByZXR1cm4gdDsKfQoKCn0KCiNlbmRpZg==