Add width and alignment support to error_code

This commit is contained in:
Victor Zverovich 2024-09-21 07:39:24 -07:00
parent 05226c4bd9
commit 3b70966df5
2 changed files with 33 additions and 11 deletions

View File

@ -413,19 +413,37 @@ FMT_END_NAMESPACE
FMT_BEGIN_NAMESPACE FMT_BEGIN_NAMESPACE
FMT_EXPORT FMT_EXPORT
template <typename Char> struct formatter<std::error_code, Char> { template <> struct formatter<std::error_code> {
FMT_CONSTEXPR auto parse(parse_context<Char>& ctx) -> const Char* { private:
return ctx.begin(); format_specs specs_;
detail::arg_ref<char> width_ref_;
public:
FMT_CONSTEXPR auto parse(parse_context<>& ctx) -> const char* {
auto it = ctx.begin(), end = ctx.end();
if (it == end) return it;
it = detail::parse_align(it, end, specs_);
if (it == end) return it;
char c = *it;
if ((c >= '0' && c <= '9') || c == '{')
it = detail::parse_width(it, end, specs_, width_ref_, ctx);
return it;
} }
template <typename FormatContext> template <typename FormatContext>
FMT_CONSTEXPR auto format(const std::error_code& ec, FormatContext& ctx) const FMT_CONSTEXPR20 auto format(const std::error_code& ec, FormatContext& ctx) const
-> decltype(ctx.out()) { -> decltype(ctx.out()) {
auto out = ctx.out(); auto specs = specs_;
out = detail::write_bytes<Char>(out, ec.category().name(), format_specs()); detail::handle_dynamic_spec(specs.dynamic_width(), specs.width, width_ref_,
out = detail::write<Char>(out, Char(':')); ctx);
out = detail::write<Char>(out, ec.value()); memory_buffer buf;
return out; buf.append(string_view(ec.category().name()));
buf.push_back(':');
detail::write<char>(appender(buf), ec.value());
return detail::write<char>(ctx.out(), string_view(buf.data(), buf.size()),
specs);
} }
}; };

View File

@ -265,9 +265,13 @@ TEST(std_test, variant) {
} }
TEST(std_test, error_code) { TEST(std_test, error_code) {
auto& generic = std::generic_category();
EXPECT_EQ("generic:42", EXPECT_EQ("generic:42",
fmt::format(FMT_STRING("{0}"), fmt::format(FMT_STRING("{0}"), std::error_code(42, generic)));
std::error_code(42, std::generic_category()))); EXPECT_EQ(" generic:42",
fmt::format(FMT_STRING("{:>12}"), std::error_code(42, generic)));
EXPECT_EQ("generic:42 ",
fmt::format(FMT_STRING("{:12}"), std::error_code(42, generic)));
EXPECT_EQ("system:42", EXPECT_EQ("system:42",
fmt::format(FMT_STRING("{0}"), fmt::format(FMT_STRING("{0}"),
std::error_code(42, fmt::system_category()))); std::error_code(42, fmt::system_category())));