std::chrono mostly covers the functionality of llvm::sys::TimeValue and
lldb_private::TimeValue. This header adds additional utility functions, which
make the usage of the library and porting code from TimeValues easier:
- conversion between std::chrono types and legacy C types (time_t, struct timeval, struct timespec).
- string converision
- a TimePoint typedef which defines a system_clock timepoint with nanosecond precision.
Rationale behind some of the design decisions:
- precision of system_clock is implementation defined - using a well-defined precision helps maintain consistency between platforms, makes it interact better with existing TimeValue classes, and avoids cases there a time point is implicitly convertible to a specific precision on some platforms but not on others.
- system_clock::to_time_t only accepts time_points with the default system precision (even though time_t has only second precision on all platforms we support). To avoid the need for explicit casts, I have added a toTimeT() wrapper function. toTimePoint(time_t) was not strictly necessary, but I have added it for symmetry.
- the duration version of toTimeVal() only accepts durations with microsecond precision (forcing the user to explicitly cast if he has a nanosecond duration), but the time point version, casts away the precision implicitly. The rationalle behind that is that for time points the extra precision is not likely to be important, while one may concievably care about the extra precision for durations.
I'm not sure if it's appropriate to have a generic name like TimePoint (which indicates it should be used for any and all time calculations) be forced to a specific resolution. A couple of possibilities would be: