forked from fmtlib/fmt
Reintroduce UDT support to fmt::to_string and test ADL
This commit is contained in:
@ -1777,6 +1777,15 @@ OutputIt write(OutputIt out, const void* value) {
|
|||||||
return write_ptr<Char>(out, to_uintptr(value), nullptr);
|
return write_ptr<Char>(out, to_uintptr(value), nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename Char, typename OutputIt, typename T>
|
||||||
|
auto write(OutputIt out, const T& value) -> typename std::enable_if<
|
||||||
|
mapped_type_constant<T, basic_format_context<OutputIt, Char>>::value ==
|
||||||
|
type::custom_type,
|
||||||
|
OutputIt>::type {
|
||||||
|
basic_format_context<OutputIt, Char> ctx(out, {}, {});
|
||||||
|
return formatter<T>().format(value, ctx);
|
||||||
|
}
|
||||||
|
|
||||||
// An argument visitor that formats the argument and writes it via the output
|
// An argument visitor that formats the argument and writes it via the output
|
||||||
// iterator. It's a class and not a generic lambda for compatibility with C++11.
|
// iterator. It's a class and not a generic lambda for compatibility with C++11.
|
||||||
template <typename OutputIt, typename Char> struct default_arg_formatter {
|
template <typename OutputIt, typename Char> struct default_arg_formatter {
|
||||||
|
@ -1906,9 +1906,30 @@ TEST(FormatTest, DynamicFormatter) {
|
|||||||
"precision not allowed for this argument type");
|
"precision not allowed for this argument type");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace adl_test {
|
||||||
|
namespace fmt {
|
||||||
|
namespace detail {
|
||||||
|
struct foo {};
|
||||||
|
template <typename, typename OutputIt> void write(OutputIt, foo) = delete;
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace fmt
|
||||||
|
} // namespace adl_test
|
||||||
|
|
||||||
|
FMT_BEGIN_NAMESPACE
|
||||||
|
template <>
|
||||||
|
struct formatter<adl_test::fmt::detail::foo> : formatter<std::string> {
|
||||||
|
template <typename FormatContext>
|
||||||
|
auto format(adl_test::fmt::detail::foo, FormatContext& ctx)
|
||||||
|
-> decltype(ctx.out()) {
|
||||||
|
return formatter<std::string>::format("foo", ctx);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
FMT_END_NAMESPACE
|
||||||
|
|
||||||
TEST(FormatTest, ToString) {
|
TEST(FormatTest, ToString) {
|
||||||
EXPECT_EQ("42", fmt::to_string(42));
|
EXPECT_EQ("42", fmt::to_string(42));
|
||||||
EXPECT_EQ("0x1234", fmt::to_string(reinterpret_cast<void*>(0x1234)));
|
EXPECT_EQ("0x1234", fmt::to_string(reinterpret_cast<void*>(0x1234)));
|
||||||
|
EXPECT_EQ("foo", fmt::to_string(adl_test::fmt::detail::foo()));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(FormatTest, ToWString) { EXPECT_EQ(L"42", fmt::to_wstring(42)); }
|
TEST(FormatTest, ToWString) { EXPECT_EQ(L"42", fmt::to_wstring(42)); }
|
||||||
|
Reference in New Issue
Block a user