| // io_ex1.cpp ----------------------------------------------------------// |
| |
| // Copyright 2010 Howard Hinnant |
| // Copyright 2010 Vicente J. Botet Escriba |
| |
| // Distributed under the Boost Software License, Version 1.0. |
| // See http://www.boost.org/LICENSE_1_0.txt |
| |
| /* |
| This code was adapted by Vicente J. Botet Escriba from Hinnant's html documentation. |
| Many thanks to Howard for making his code available under the Boost license. |
| |
| */ |
| |
| #include <boost/chrono/chrono_io.hpp> |
| #include <ostream> |
| #include <iostream> |
| |
| // format duration as [-]d/hh::mm::ss.cc |
| template <class CharT, class Traits, class Rep, class Period> |
| std::basic_ostream<CharT, Traits>& |
| display(std::basic_ostream<CharT, Traits>& os, |
| boost::chrono::duration<Rep, Period> d) |
| { |
| using std::cout; |
| using namespace boost; |
| using namespace boost::chrono; |
| |
| typedef duration<long long, ratio<86400> > days; |
| typedef duration<long long, centi> centiseconds; |
| |
| // if negative, print negative sign and negate |
| if (d < duration<Rep, Period>(0)) |
| { |
| d = -d; |
| os << '-'; |
| } |
| // round d to nearest centiseconds, to even on tie |
| centiseconds cs = duration_cast<centiseconds>(d); |
| if (d - cs > milliseconds(5) |
| || (d - cs == milliseconds(5) && cs.count() & 1)) |
| ++cs; |
| // separate seconds from centiseconds |
| seconds s = duration_cast<seconds>(cs); |
| cs -= s; |
| // separate minutes from seconds |
| minutes m = duration_cast<minutes>(s); |
| s -= m; |
| // separate hours from minutes |
| hours h = duration_cast<hours>(m); |
| m -= h; |
| // separate days from hours |
| days dy = duration_cast<days>(h); |
| h -= dy; |
| // print d/hh:mm:ss.cc |
| os << dy.count() << '/'; |
| if (h < hours(10)) |
| os << '0'; |
| os << h.count() << ':'; |
| if (m < minutes(10)) |
| os << '0'; |
| os << m.count() << ':'; |
| if (s < seconds(10)) |
| os << '0'; |
| os << s.count() << '.'; |
| if (cs < centiseconds(10)) |
| os << '0'; |
| os << cs.count(); |
| return os; |
| } |
| |
| int main() |
| { |
| using std::cout; |
| using namespace boost; |
| using namespace boost::chrono; |
| |
| #ifdef BOOST_CHRONO_HAS_CLOCK_STEADY |
| display(cout, steady_clock::now().time_since_epoch() |
| + duration<long, mega>(1)) << '\n'; |
| #endif |
| display(cout, -milliseconds(6)) << '\n'; |
| display(cout, duration<long, mega>(1)) << '\n'; |
| display(cout, -duration<long, mega>(1)) << '\n'; |
| } |
| |
| //~ 12/06:03:22.95 |
| //~ -0/00:00:00.01 |
| //~ 11/13:46:40.00 |
| //~ -11/13:46:40.00 |