Minor cleanup

This commit is contained in:
Victor Zverovich
2025-05-11 07:54:23 -07:00
parent 4999416e5c
commit 07885271a1
2 changed files with 34 additions and 42 deletions

View File

@ -232,6 +232,19 @@ struct is_bit_reference_like<std::__bit_const_reference<C>> {
}; };
#endif #endif
template <typename T, typename Enable = void>
struct has_format_as : std::false_type {};
template <typename T>
struct has_format_as<T, void_t<decltype(format_as(std::declval<const T&>()))>>
: std::true_type {};
template <typename T, typename Enable = void>
struct has_format_as_member : std::false_type {};
template <typename T>
struct has_format_as_member<
T, void_t<decltype(formatter<T>::format_as(std::declval<const T&>()))>>
: std::true_type {};
} // namespace detail } // namespace detail
template <typename T, typename Deleter> template <typename T, typename Deleter>
@ -678,25 +691,10 @@ template <typename T, typename Char> struct formatter<std::complex<T>, Char> {
} }
}; };
namespace detail {
template <typename T, typename Enable = void>
struct has_format_as : std::false_type {};
template <typename T>
struct has_format_as<T, void_t<decltype(format_as(std::declval<const T&>()))>>
: std::true_type {};
template <typename T, typename Enable = void>
struct has_format_as_member : std::false_type {};
template <typename T>
struct has_format_as_member<
T, void_t<decltype(formatter<T>::format_as(std::declval<const T&>()))>>
: std::true_type {};
} // namespace detail
// Guard against format_as because reference_wrappers are implicitly convertible
// to T&
template <typename T, typename Char> template <typename T, typename Char>
struct formatter<std::reference_wrapper<T>, Char, struct formatter<std::reference_wrapper<T>, Char,
// Guard against format_as because reference_wrapper is
// implicitly convertible to T&.
enable_if_t<is_formattable<remove_cvref_t<T>, Char>::value && enable_if_t<is_formattable<remove_cvref_t<T>, Char>::value &&
!detail::has_format_as<T>::value && !detail::has_format_as<T>::value &&
!detail::has_format_as_member<T>::value>> !detail::has_format_as_member<T>::value>>

View File

@ -413,37 +413,31 @@ TEST(std_test, format_shared_ptr) {
TEST(std_test, format_reference_wrapper) { TEST(std_test, format_reference_wrapper) {
int num = 35; int num = 35;
EXPECT_EQ("35", fmt::to_string(std::cref(num))); EXPECT_EQ(fmt::to_string(std::cref(num)), "35");
EXPECT_EQ("35", fmt::to_string(std::ref(num))); EXPECT_EQ(fmt::to_string(std::ref(num)), "35");
EXPECT_EQ("35", fmt::format("{}", std::cref(num))); EXPECT_EQ(fmt::format("{}", std::cref(num)), "35");
EXPECT_EQ("35", fmt::format("{}", std::ref(num))); EXPECT_EQ(fmt::format("{}", std::ref(num)), "35");
} }
// Regression test for https://github.com/fmtlib/fmt/issues/4424 // Regression test for https://github.com/fmtlib/fmt/issues/4424.
struct type_with_format_as { struct type_with_format_as {};
int x; int format_as(type_with_format_as) { return 20; }
};
int format_as(const type_with_format_as& t) { return t.x; }
TEST(std_test, format_reference_wrapper_with_format_as) { TEST(std_test, format_reference_wrapper_with_format_as) {
type_with_format_as t{20}; type_with_format_as t;
EXPECT_EQ("20", fmt::to_string(std::cref(t))); EXPECT_EQ(fmt::to_string(std::cref(t)), "20");
EXPECT_EQ("20", fmt::to_string(std::ref(t))); EXPECT_EQ(fmt::to_string(std::ref(t)), "20");
EXPECT_EQ("20", fmt::format("{}", std::cref(t))); EXPECT_EQ(fmt::format("{}", std::cref(t)), "20");
EXPECT_EQ("20", fmt::format("{}", std::ref(t))); EXPECT_EQ(fmt::format("{}", std::ref(t)), "20");
} }
struct type_with_format_as_string { struct type_with_format_as_string {};
std::string str; std::string format_as(type_with_format_as_string) { return "foo"; }
};
std::string format_as(const type_with_format_as_string& t) { return t.str; }
TEST(std_test, format_reference_wrapper_with_format_as_string) { TEST(std_test, format_reference_wrapper_with_format_as_string) {
type_with_format_as_string t{"foo"}; type_with_format_as_string t;
EXPECT_EQ("foo", fmt::to_string(std::cref(t))); EXPECT_EQ(fmt::to_string(std::cref(t)), "foo");
EXPECT_EQ("foo", fmt::to_string(std::ref(t))); EXPECT_EQ(fmt::to_string(std::ref(t)), "foo");
EXPECT_EQ("foo", fmt::format("{}", std::cref(t))); EXPECT_EQ(fmt::format("{}", std::cref(t)), "foo");
EXPECT_EQ("foo", fmt::format("{}", std::ref(t))); EXPECT_EQ(fmt::format("{}", std::ref(t)), "foo");
} }