#include <boost/chrono/chrono.hpp>
#include <boost/type_traits.hpp>
#include <iostream>
using namespace boost::chrono;
template <class To, class Rep, class Period>
To
round_up(duration<Rep, Period> d)
{
To result = duration_cast<To>(d);
if (result < d)
++result;
return result;
}
struct xtime_
{
long sec;
unsigned long usec;
};
template <class Rep, class Period>
xtime_
to_xtime_truncate(duration<Rep, Period> d)
{
xtime_ xt;
xt.sec = static_cast<long>(duration_cast<seconds>(d).count());
xt.usec = static_cast<long>(duration_cast<microseconds>(d - seconds(xt.sec)).count());
return xt;
}
template <class Rep, class Period>
xtime_
to_xtime_round_up(duration<Rep, Period> d)
{
xtime_ xt;
xt.sec = static_cast<long>(duration_cast<seconds>(d).count());
xt.usec = static_cast<unsigned long>(round_up<microseconds>(d - seconds(xt.sec)).count());
return xt;
}
microseconds
from_xtime(xtime_ xt)
{
return seconds(xt.sec) + microseconds(xt.usec);
}
void print(xtime_ xt)
{
std::cout << '{' << xt.sec << ',' << xt.usec << "}\n";
}
void test_with_xtime()
{
std::cout << "test_with_xtime\n";
xtime_ xt = to_xtime_truncate(seconds(3) + milliseconds(251));
print(xt);
milliseconds ms = duration_cast<milliseconds>(from_xtime(xt));
std::cout << ms.count() << " milliseconds\n";
xt = to_xtime_round_up(ms);
print(xt);
xt = to_xtime_truncate(seconds(3) + nanoseconds(999));
print(xt);
xt = to_xtime_round_up(seconds(3) + nanoseconds(999));
print(xt);
}
int main()
{
test_with_xtime();
return 0;
}