Fix detail::write with fallback formatter (#1829)

* add support for fallback_formatter in detail::write

* add ToString test into OStreamTest

to check fmt::to_string() with class that has output stream operator

* add WithOstreamOperator test into CompileTest

to check fmt::format() with FMT_COMPILE() and class that has output stream operator

* use conditional_t inside detail::write instead of 2 overloads

* Revert "add WithOstreamOperator test into CompileTest"

* remove Context from template parameters in detail::write
This commit is contained in:
Alexey Ochapov 2020-08-20 16:41:09 +03:00 committed by GitHub
parent 06895a7687
commit 1651b2d433
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 11 additions and 2 deletions

View File

@ -1847,8 +1847,13 @@ auto write(OutputIt out, const T& value) -> typename std::enable_if<
mapped_type_constant<T, basic_format_context<OutputIt, Char>>::value == mapped_type_constant<T, basic_format_context<OutputIt, Char>>::value ==
type::custom_type, type::custom_type,
OutputIt>::type { OutputIt>::type {
basic_format_context<OutputIt, Char> ctx(out, {}, {}); using context_type = basic_format_context<OutputIt, Char>;
return formatter<T>().format(value, ctx); using formatter_type =
conditional_t<has_formatter<T, context_type>::value,
typename context_type::template formatter_type<T>,
fallback_formatter<T, Char>>;
context_type ctx(out, {}, {});
return formatter_type().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

View File

@ -319,3 +319,7 @@ TEST(OStreamTest, CopyFmt) {
TEST(OStreamTest, CompileTimeString) { TEST(OStreamTest, CompileTimeString) {
EXPECT_EQ("42", fmt::format(FMT_STRING("{}"), 42)); EXPECT_EQ("42", fmt::format(FMT_STRING("{}"), 42));
} }
TEST(OStreamTest, ToString) {
EXPECT_EQ("ABC", fmt::to_string(fmt_test::ABC()));
}