From 0e62e5dc7cd1132020e209023d919f8325d6d539 Mon Sep 17 00:00:00 2001 From: Victor Zverovich Date: Mon, 16 Sep 2024 19:48:02 -0700 Subject: [PATCH] Simplify has_formatter --- include/fmt/base.h | 23 ++++++++++------------- test/base-test.cc | 6 +++--- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/include/fmt/base.h b/include/fmt/base.h index 40637c56..80a31442 100644 --- a/include/fmt/base.h +++ b/include/fmt/base.h @@ -1108,26 +1108,23 @@ struct use_formatter !use_format_as::value> {}; template -constexpr auto has_const_formatter_impl(T*) - -> decltype(formatter().format( - std::declval(), +constexpr auto has_formatter_impl(T*) + -> decltype(formatter, Char>().format( + std::declval(), std::declval&>()), true) { return true; } -template constexpr auto has_const_formatter_impl(...) -> bool { +template constexpr auto has_formatter_impl(...) -> bool { return false; } -template -constexpr auto has_const_formatter() -> bool { - return has_const_formatter_impl(static_cast(nullptr)); +// T can be const-qualified to check if it is const-formattable. +template constexpr auto has_formatter() -> bool { + return has_formatter_impl(static_cast(nullptr)); } -template > -struct formattable - : bool_constant() || - (std::is_constructible>::value && - !std::is_const::value)> {}; +template +struct formattable : bool_constant()> {}; // Maps formatting argument types to natively supported types or user-defined // types with formatters. Returns void on errors to be SFINAE-friendly. @@ -2223,7 +2220,7 @@ template class value { auto f = Formatter(); parse_ctx.advance_to(f.parse(parse_ctx)); using qualified_type = - conditional_t(), const T, T>; + conditional_t(), const T, T>; // format must be const for compatibility with std::format and compilation. const auto& cf = f; ctx.advance_to(cf.format(*static_cast(arg), ctx)); diff --git a/test/base-test.cc b/test/base-test.cc index 3189858a..cc0901a4 100644 --- a/test/base-test.cc +++ b/test/base-test.cc @@ -784,10 +784,10 @@ TEST(base_test, format_explicitly_convertible_to_std_string_view) { # endif #endif -TEST(base_test, has_const_formatter) { - EXPECT_TRUE((fmt::detail::has_const_formatter())); +TEST(base_test, has_formatter) { + EXPECT_TRUE((fmt::detail::has_formatter())); EXPECT_FALSE( - (fmt::detail::has_const_formatter())); + (fmt::detail::has_formatter())); } TEST(base_test, format_nonconst) {