forked from fmtlib/fmt
adding a default format for std::chrono::time_point<std::chrono::syst… (#2345)
This commit is contained in:
@ -451,14 +451,37 @@ FMT_END_DETAIL_NAMESPACE
|
|||||||
template <typename Char, typename Duration>
|
template <typename Char, typename Duration>
|
||||||
struct formatter<std::chrono::time_point<std::chrono::system_clock, Duration>,
|
struct formatter<std::chrono::time_point<std::chrono::system_clock, Duration>,
|
||||||
Char> : formatter<std::tm, Char> {
|
Char> : formatter<std::tm, Char> {
|
||||||
|
FMT_CONSTEXPR formatter() {
|
||||||
|
this->specs = {default_specs, sizeof(default_specs) / sizeof(Char)};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename ParseContext>
|
||||||
|
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
||||||
|
auto it = ctx.begin();
|
||||||
|
if (it != ctx.end() && *it == ':') ++it;
|
||||||
|
auto end = it;
|
||||||
|
while (end != ctx.end() && *end != '}') ++end;
|
||||||
|
if (end != it) this->specs = {it, detail::to_unsigned(end - it)};
|
||||||
|
return end;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename FormatContext>
|
template <typename FormatContext>
|
||||||
auto format(std::chrono::time_point<std::chrono::system_clock> val,
|
auto format(std::chrono::time_point<std::chrono::system_clock> val,
|
||||||
FormatContext& ctx) -> decltype(ctx.out()) {
|
FormatContext& ctx) -> decltype(ctx.out()) {
|
||||||
std::tm time = localtime(val);
|
std::tm time = localtime(val);
|
||||||
return formatter<std::tm, Char>::format(time, ctx);
|
return formatter<std::tm, Char>::format(time, ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static constexpr Char default_specs[] = {'%', 'Y', '-', '%', 'm', '-',
|
||||||
|
'%', 'd', ' ', '%', 'H', ':',
|
||||||
|
'%', 'M', ':', '%', 'S'};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template <typename Char, typename Duration>
|
||||||
|
constexpr Char
|
||||||
|
formatter<std::chrono::time_point<std::chrono::system_clock, Duration>,
|
||||||
|
Char>::default_specs[];
|
||||||
|
|
||||||
template <typename Char> struct formatter<std::tm, Char> {
|
template <typename Char> struct formatter<std::tm, Char> {
|
||||||
template <typename ParseContext>
|
template <typename ParseContext>
|
||||||
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
FMT_CONSTEXPR auto parse(ParseContext& ctx) -> decltype(ctx.begin()) {
|
||||||
|
@ -99,6 +99,7 @@ template <typename TimePoint> auto strftime(TimePoint tp) -> std::string {
|
|||||||
TEST(chrono_test, time_point) {
|
TEST(chrono_test, time_point) {
|
||||||
auto t1 = std::chrono::system_clock::now();
|
auto t1 = std::chrono::system_clock::now();
|
||||||
EXPECT_EQ(strftime(t1), fmt::format("{:%Y-%m-%d %H:%M:%S}", t1));
|
EXPECT_EQ(strftime(t1), fmt::format("{:%Y-%m-%d %H:%M:%S}", t1));
|
||||||
|
EXPECT_EQ(strftime(t1), fmt::format("{}", t1));
|
||||||
using time_point =
|
using time_point =
|
||||||
std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds>;
|
std::chrono::time_point<std::chrono::system_clock, std::chrono::seconds>;
|
||||||
auto t2 = time_point(std::chrono::seconds(42));
|
auto t2 = time_point(std::chrono::seconds(42));
|
||||||
|
@ -92,6 +92,8 @@ TEST(compile_test, format_default) {
|
|||||||
EXPECT_EQ("foo", fmt::format(FMT_COMPILE("{}"), "foo"));
|
EXPECT_EQ("foo", fmt::format(FMT_COMPILE("{}"), "foo"));
|
||||||
EXPECT_EQ("foo", fmt::format(FMT_COMPILE("{}"), std::string("foo")));
|
EXPECT_EQ("foo", fmt::format(FMT_COMPILE("{}"), std::string("foo")));
|
||||||
EXPECT_EQ("foo", fmt::format(FMT_COMPILE("{}"), test_formattable()));
|
EXPECT_EQ("foo", fmt::format(FMT_COMPILE("{}"), test_formattable()));
|
||||||
|
auto t = std::chrono::system_clock::now();
|
||||||
|
EXPECT_EQ(fmt::format("{}", t), fmt::format(FMT_COMPILE("{}"), t));
|
||||||
# ifdef __cpp_lib_byte
|
# ifdef __cpp_lib_byte
|
||||||
EXPECT_EQ("42", fmt::format(FMT_COMPILE("{}"), std::byte{42}));
|
EXPECT_EQ("42", fmt::format(FMT_COMPILE("{}"), std::byte{42}));
|
||||||
# endif
|
# endif
|
||||||
|
Reference in New Issue
Block a user