Improve compile-time formatting (#4127)

This commit is contained in:
Anthony VH
2024-08-21 21:02:47 +02:00
committed by GitHub
parent 1a79bbfa83
commit c59ee969f3
2 changed files with 12 additions and 9 deletions

View File

@ -1003,7 +1003,7 @@ template <typename Char, size_t N> struct fixed_string {
} }
Char data[N] = {}; Char data[N] = {};
}; };
#endif #endif // FMT_USE_NONTYPE_TEMPLATE_ARGS
// Converts a compile-time string to basic_string_view. // Converts a compile-time string to basic_string_view.
template <typename Char, size_t N> template <typename Char, size_t N>
@ -3912,19 +3912,21 @@ template <typename T, typename Char>
struct formatter<T, Char, enable_if_t<detail::has_format_as<T>::value>> struct formatter<T, Char, enable_if_t<detail::has_format_as<T>::value>>
: formatter<detail::format_as_t<T>, Char> { : formatter<detail::format_as_t<T>, Char> {
template <typename FormatContext> template <typename FormatContext>
auto format(const T& value, FormatContext& ctx) const -> decltype(ctx.out()) { FMT_CONSTEXPR auto format(const T& value, FormatContext& ctx) const
-> decltype(ctx.out()) {
auto&& val = format_as(value); // Make an lvalue reference for format. auto&& val = format_as(value); // Make an lvalue reference for format.
return formatter<detail::format_as_t<T>, Char>::format(val, ctx); return formatter<detail::format_as_t<T>, Char>::format(val, ctx);
} }
}; };
#define FMT_FORMAT_AS(Type, Base) \ #define FMT_FORMAT_AS(Type, Base) \
template <typename Char> \ template <typename Char> \
struct formatter<Type, Char> : formatter<Base, Char> { \ struct formatter<Type, Char> : formatter<Base, Char> { \
template <typename FormatContext> \ template <typename FormatContext> \
auto format(Type value, FormatContext& ctx) const -> decltype(ctx.out()) { \ FMT_CONSTEXPR auto format(Type value, FormatContext& ctx) const \
return formatter<Base, Char>::format(value, ctx); \ -> decltype(ctx.out()) { \
} \ return formatter<Base, Char>::format(value, ctx); \
} \
} }
FMT_FORMAT_AS(signed char, int); FMT_FORMAT_AS(signed char, int);

View File

@ -334,6 +334,7 @@ TEST(compile_time_formatting_test, integer) {
EXPECT_EQ("0X4A", test_format<5>(FMT_COMPILE("{:#X}"), 0x4a)); EXPECT_EQ("0X4A", test_format<5>(FMT_COMPILE("{:#X}"), 0x4a));
EXPECT_EQ(" 42", test_format<6>(FMT_COMPILE("{:5}"), 42)); EXPECT_EQ(" 42", test_format<6>(FMT_COMPILE("{:5}"), 42));
EXPECT_EQ(" 42", test_format<6>(FMT_COMPILE("{:5}"), 42l));
EXPECT_EQ(" 42", test_format<6>(FMT_COMPILE("{:5}"), 42ll)); EXPECT_EQ(" 42", test_format<6>(FMT_COMPILE("{:5}"), 42ll));
EXPECT_EQ(" 42", test_format<6>(FMT_COMPILE("{:5}"), 42ull)); EXPECT_EQ(" 42", test_format<6>(FMT_COMPILE("{:5}"), 42ull));