Commit 92614ecb authored by Vladislav Shchapov's avatar Vladislav Shchapov Committed by Victor Zverovich

Optimize %T in tm formatting

parent aaeca12d
...@@ -549,6 +549,7 @@ template <typename Char> struct formatter<std::tm, Char> { ...@@ -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> { ...@@ -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> { ...@@ -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) { ...@@ -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) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment