Skip to content

Commit

Permalink
Simplify ostream opt-in API
Browse files Browse the repository at this point in the history
  • Loading branch information
vitaut committed Feb 5, 2022
1 parent a5a7e3a commit 17b362f
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 20 deletions.
23 changes: 14 additions & 9 deletions include/fmt/ostream.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,22 +78,30 @@ void format_value(buffer<Char>& buf, const T& value,
output.exceptions(std::ios_base::failbit | std::ios_base::badbit);
buf.try_resize(buf.size());
}
} // namespace detail

// Formats an object of type T that has an overloaded ostream operator<<.
template <typename T, typename Char>
struct fallback_formatter<T, Char, enable_if_t<is_streamable<T, Char>::value>>
: private formatter<basic_string_view<Char>, Char> {
using formatter<basic_string_view<Char>, Char>::parse;

template <typename OutputIt>
template <typename Char>
struct basic_ostream_formatter : formatter<basic_string_view<Char>, Char> {
template <typename T, typename OutputIt>
auto format(const T& value, basic_format_context<OutputIt, Char>& ctx) const
-> OutputIt {
auto buffer = basic_memory_buffer<Char>();
format_value(buffer, value, ctx.locale());
return formatter<basic_string_view<Char>, Char>::format(
{buffer.data(), buffer.size()}, ctx);
}
};

using ostream_formatter = basic_ostream_formatter<char>;

namespace detail {

// Formats an object of type T that has an overloaded ostream operator<<.
template <typename T, typename Char>
struct fallback_formatter<T, Char, enable_if_t<is_streamable<T, Char>::value>>
: basic_ostream_formatter<Char> {
using basic_ostream_formatter<Char>::format;
// DEPRECATED!
template <typename OutputIt>
auto format(const T& value, basic_printf_context<OutputIt, Char>& ctx) const
Expand All @@ -105,9 +113,6 @@ struct fallback_formatter<T, Char, enable_if_t<is_streamable<T, Char>::value>>
};
} // namespace detail

template <typename T, typename Char = char>
using ostream_formatter = detail::fallback_formatter<T, Char>;

FMT_MODULE_EXPORT
template <typename Char>
void vprint(std::basic_ostream<Char>& os, basic_string_view<Char> format_str,
Expand Down
16 changes: 7 additions & 9 deletions test/ostream-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,10 @@ struct empty_test {};
std::ostream& operator<<(std::ostream& os, empty_test) { return os << ""; }

namespace fmt {
template <> struct formatter<test_string> : ostream_formatter<test_string> {};
template <> struct formatter<date> : ostream_formatter<date> {};
template <>
struct formatter<streamable_enum> : ostream_formatter<streamable_enum> {};
template <> struct formatter<empty_test> : ostream_formatter<empty_test> {};
template <> struct formatter<test_string> : ostream_formatter {};
template <> struct formatter<date> : ostream_formatter {};
template <> struct formatter<streamable_enum> : ostream_formatter {};
template <> struct formatter<empty_test> : ostream_formatter {};
} // namespace fmt

TEST(ostream_test, enum) {
Expand Down Expand Up @@ -193,8 +192,7 @@ template <typename T> struct formatter<test_template<T>> : formatter<int> {
}
};

template <>
struct formatter<fmt_test::abc> : ostream_formatter<fmt_test::abc> {};
template <> struct formatter<fmt_test::abc> : ostream_formatter {};
} // namespace fmt

TEST(ostream_test, template) {
Expand Down Expand Up @@ -262,7 +260,7 @@ std::ostream& operator<<(std::ostream& os, copyfmt_test) {
}

namespace fmt {
template <> struct formatter<copyfmt_test> : ostream_formatter<copyfmt_test> {};
template <> struct formatter<copyfmt_test> : ostream_formatter {};
} // namespace fmt

TEST(ostream_test, copyfmt) {
Expand All @@ -287,7 +285,7 @@ struct abstract {
};

namespace fmt {
template <> struct formatter<abstract> : ostream_formatter<abstract> {};
template <> struct formatter<abstract> : ostream_formatter {};
} // namespace fmt

void format_abstract_compiles(const abstract& a) {
Expand Down
4 changes: 2 additions & 2 deletions test/xchar-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,8 @@ std::wostream& operator<<(std::wostream& os, streamable_enum) {

namespace fmt {
template <>
struct formatter<streamable_enum, wchar_t>
: ostream_formatter<streamable_enum, wchar_t> {};
struct formatter<streamable_enum, wchar_t> : basic_ostream_formatter<wchar_t> {
};
} // namespace fmt

enum unstreamable_enum {};
Expand Down

0 comments on commit 17b362f

Please sign in to comment.