1 //===- Support/Chrono.cpp - Utilities for Timing Manipulation ---*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/Support/Chrono.h"
11 #include "llvm/Config/llvm-config.h"
12 #include "llvm/Support/Format.h"
13 #include "llvm/Support/raw_ostream.h"
19 const char llvm::detail::unit
<std::ratio
<3600>>::value
[] = "h";
20 const char llvm::detail::unit
<std::ratio
<60>>::value
[] = "m";
21 const char llvm::detail::unit
<std::ratio
<1>>::value
[] = "s";
22 const char llvm::detail::unit
<std::milli
>::value
[] = "ms";
23 const char llvm::detail::unit
<std::micro
>::value
[] = "us";
24 const char llvm::detail::unit
<std::nano
>::value
[] = "ns";
26 static inline struct tm
getStructTM(TimePoint
<> TP
) {
28 std::time_t OurTime
= toTimeT(TP
);
30 #if defined(LLVM_ON_UNIX)
31 struct tm
*LT
= ::localtime_r(&OurTime
, &Storage
);
36 int Error
= ::localtime_s(&Storage
, &OurTime
);
44 raw_ostream
&operator<<(raw_ostream
&OS
, TimePoint
<> TP
) {
45 struct tm LT
= getStructTM(TP
);
46 char Buffer
[sizeof("YYYY-MM-DD HH:MM:SS")];
47 strftime(Buffer
, sizeof(Buffer
), "%Y-%m-%d %H:%M:%S", <
);
48 return OS
<< Buffer
<< '.'
50 long((TP
.time_since_epoch() % std::chrono::seconds(1))
54 void format_provider
<TimePoint
<>>::format(const TimePoint
<> &T
, raw_ostream
&OS
,
56 using namespace std::chrono
;
57 TimePoint
<seconds
> Truncated
= time_point_cast
<seconds
>(T
);
58 auto Fractional
= T
- Truncated
;
59 struct tm LT
= getStructTM(Truncated
);
60 // Handle extensions first. strftime mangles unknown %x on some platforms.
61 if (Style
.empty()) Style
= "%Y-%m-%d %H:%M:%S.%N";
63 raw_string_ostream
FStream(Format
);
64 for (unsigned I
= 0; I
< Style
.size(); ++I
) {
65 if (Style
[I
] == '%' && Style
.size() > I
+ 1) switch (Style
[I
+ 1]) {
66 case 'L': // Milliseconds, from Ruby.
67 FStream
<< llvm::format(
68 "%.3lu", (long)duration_cast
<milliseconds
>(Fractional
).count());
71 case 'f': // Microseconds, from Python.
72 FStream
<< llvm::format(
73 "%.6lu", (long)duration_cast
<microseconds
>(Fractional
).count());
76 case 'N': // Nanoseconds, from date(1).
77 FStream
<< llvm::format(
78 "%.6lu", (long)duration_cast
<nanoseconds
>(Fractional
).count());
81 case '%': // Consume %%, so %%f parses as (%%)f not %(%f)
89 char Buffer
[256]; // Should be enough for anywhen.
90 size_t Len
= strftime(Buffer
, sizeof(Buffer
), Format
.c_str(), <
);
91 OS
<< (Len
? Buffer
: "BAD-DATE-FORMAT");