forked from fmtlib/fmt
Optimize %T in tm formatting
This commit is contained in:
committed by
Victor Zverovich
parent
aaeca12d89
commit
92614ecbf9
@ -549,6 +549,7 @@ template <typename Char> struct formatter<std::tm, Char> {
|
|||||||
enum class spec {
|
enum class spec {
|
||||||
unknown,
|
unknown,
|
||||||
year_month_day,
|
year_month_day,
|
||||||
|
hh_mm_ss,
|
||||||
};
|
};
|
||||||
spec spec_ = spec::unknown;
|
spec spec_ = spec::unknown;
|
||||||
|
|
||||||
@ -563,7 +564,10 @@ template <typename Char> struct formatter<std::tm, Char> {
|
|||||||
while (end != ctx.end() && *end != '}') ++end;
|
while (end != ctx.end() && *end != '}') ++end;
|
||||||
auto size = detail::to_unsigned(end - it);
|
auto size = detail::to_unsigned(end - it);
|
||||||
specs = {it, size};
|
specs = {it, size};
|
||||||
if (specs == string_view("%F", 2)) spec_ = spec::year_month_day;
|
if (specs == string_view("%F", 2))
|
||||||
|
spec_ = spec::year_month_day;
|
||||||
|
else if (specs == string_view("%T", 2))
|
||||||
|
spec_ = spec::hh_mm_ss;
|
||||||
return end;
|
return end;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -578,6 +582,12 @@ template <typename Char> struct formatter<std::tm, Char> {
|
|||||||
detail::to_unsigned(tm.tm_mon + 1),
|
detail::to_unsigned(tm.tm_mon + 1),
|
||||||
detail::to_unsigned(tm.tm_mday), '-');
|
detail::to_unsigned(tm.tm_mday), '-');
|
||||||
return std::copy_n(buf, sizeof(buf), ctx.out());
|
return std::copy_n(buf, sizeof(buf), ctx.out());
|
||||||
|
} else if (spec_ == spec::hh_mm_ss) {
|
||||||
|
char buf[8];
|
||||||
|
detail::write_digit2_separated(buf, detail::to_unsigned(tm.tm_hour),
|
||||||
|
detail::to_unsigned(tm.tm_min),
|
||||||
|
detail::to_unsigned(tm.tm_sec), ':');
|
||||||
|
return std::copy_n(buf, sizeof(buf), ctx.out());
|
||||||
}
|
}
|
||||||
basic_memory_buffer<Char> tm_format;
|
basic_memory_buffer<Char> tm_format;
|
||||||
tm_format.append(specs.begin(), specs.end());
|
tm_format.append(specs.begin(), specs.end());
|
||||||
|
@ -49,6 +49,7 @@ TEST(chrono_test, format_tm) {
|
|||||||
EXPECT_EQ(fmt::format("The date is {:%Y-%m-%d %H:%M:%S}.", tm),
|
EXPECT_EQ(fmt::format("The date is {:%Y-%m-%d %H:%M:%S}.", tm),
|
||||||
"The date is 2016-04-25 11:22:33.");
|
"The date is 2016-04-25 11:22:33.");
|
||||||
EXPECT_EQ(fmt::format("{:%F}", tm), "2016-04-25");
|
EXPECT_EQ(fmt::format("{:%F}", tm), "2016-04-25");
|
||||||
|
EXPECT_EQ(fmt::format("{:%T}", tm), "11:22:33");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(chrono_test, grow_buffer) {
|
TEST(chrono_test, grow_buffer) {
|
||||||
|
Reference in New Issue
Block a user