From c24a8cdca3eb11c7889d83557c223519068a2a9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rkus=20Dorkus?= Date: Sun, 14 Jan 2024 01:18:30 -0500 Subject: [PATCH] =?UTF-8?q?=F0=9F=9B=A0=20Use=20universal=20references=20t?= =?UTF-8?q?o=20SFINAE=20properly?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/fmt/base.h | 17 +++++++++++------ include/fmt/color.h | 15 +++++++++------ include/fmt/format.h | 15 +++++++++------ include/fmt/xchar.h | 36 +++++++++++++++++++++--------------- 4 files changed, 50 insertions(+), 33 deletions(-) diff --git a/include/fmt/base.h b/include/fmt/base.h index 87a9c7a44d532..9612c289d417c 100644 --- a/include/fmt/base.h +++ b/include/fmt/base.h @@ -2804,7 +2804,9 @@ struct format_to_result { /** Ensures old code relying on array-style output continues to work. */ FMT_CONSTEXPR operator OutputIt&() & noexcept { return out; } /** Ensures old code relying on array-style output continues to work. */ - FMT_CONSTEXPR operator OutputIt&&() && noexcept { return static_cast(out); } + FMT_CONSTEXPR operator OutputIt&&() && noexcept { + return static_cast(out); + } /** Ensures old code relying on array-style output continues to work. */ FMT_CONSTEXPR operator const OutputIt&() const& noexcept { return out; } }; @@ -2831,8 +2833,10 @@ inline auto runtime(string_view s) -> runtime_format_string<> { return {{s}}; } /** Formats a string and writes the output to ``out``. */ template ::value)> -auto vformat_to(OutputIt out, string_view fmt, format_args args) -> OutputIt { + FMT_ENABLE_IF(detail::is_output_iterator, + char>::value)> +auto vformat_to(OutputIt&& out, string_view fmt, format_args args) + -> remove_cvref_t { auto&& buf = detail::get_buffer(out); detail::vformat_to(buf, fmt, args, {}); return detail::get_iterator(buf, out); @@ -2861,9 +2865,10 @@ auto vformat_to(char (&out)[Size], string_view fmt, format_args args) \endrst */ template ::value)> -FMT_INLINE auto format_to(OutputIt out, format_string fmt, T&&... args) - -> OutputIt { + FMT_ENABLE_IF(detail::is_output_iterator, + char>::value)> +FMT_INLINE auto format_to(OutputIt&& out, format_string fmt, T&&... args) + -> remove_cvref_t { return vformat_to(out, fmt, fmt::make_format_args(args...)); } diff --git a/include/fmt/color.h b/include/fmt/color.h index bba921fc6c4ac..79f169980b51d 100644 --- a/include/fmt/color.h +++ b/include/fmt/color.h @@ -543,9 +543,10 @@ inline auto format(const text_style& ts, format_string fmt, T&&... args) Formats a string with the given text_style and writes the output to ``out``. */ template ::value)> -auto vformat_to(OutputIt out, const text_style& ts, string_view fmt, - format_args args) -> OutputIt { + FMT_ENABLE_IF(detail::is_output_iterator, + char>::value)> +auto vformat_to(OutputIt&& out, const text_style& ts, string_view fmt, + format_args args) -> remove_cvref_t { auto&& buf = detail::get_buffer(out); detail::vformat_to(buf, ts, fmt, args); return detail::get_iterator(buf, out); @@ -576,9 +577,11 @@ auto vformat_to(char (&out)[Size], const text_style& ts, string_view fmt, \endrst */ template ::value)> -inline auto format_to(OutputIt out, const text_style& ts, - format_string fmt, T&&... args) -> OutputIt { + FMT_ENABLE_IF(detail::is_output_iterator, + char>::value)> +inline auto format_to(OutputIt&& out, const text_style& ts, + format_string fmt, T&&... args) + -> remove_cvref_t { return vformat_to(out, ts, fmt, fmt::make_format_args(args...)); } diff --git a/include/fmt/format.h b/include/fmt/format.h index 5dbdbd62da251..13d9ac735fd52 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -4415,10 +4415,11 @@ inline auto format(const Locale& loc, format_string fmt, T&&... args) } template ::value&& + FMT_ENABLE_IF(detail::is_output_iterator, + char>::value&& detail::is_locale::value)> -auto vformat_to(OutputIt out, const Locale& loc, string_view fmt, - format_args args) -> OutputIt { +auto vformat_to(OutputIt&& out, const Locale& loc, string_view fmt, + format_args args) -> remove_cvref_t { using detail::get_buffer; auto&& buf = get_buffer(out); detail::vformat_to(buf, fmt, args, detail::locale_ref(loc)); @@ -4436,10 +4437,12 @@ auto vformat_to(char (&out)[Size], const Locale& loc, string_view fmt, } template ::value&& + FMT_ENABLE_IF(detail::is_output_iterator, + char>::value&& detail::is_locale::value)> -FMT_INLINE auto format_to(OutputIt out, const Locale& loc, - format_string fmt, T&&... args) -> OutputIt { +FMT_INLINE auto format_to(OutputIt&& out, const Locale& loc, + format_string fmt, T&&... args) + -> remove_cvref_t { return vformat_to(out, loc, fmt, fmt::make_format_args(args...)); } diff --git a/include/fmt/xchar.h b/include/fmt/xchar.h index 5b076054d6e42..b9e107be570ae 100644 --- a/include/fmt/xchar.h +++ b/include/fmt/xchar.h @@ -174,10 +174,12 @@ inline auto format(const Locale& loc, const S& format_str, T&&... args) template , - FMT_ENABLE_IF(detail::is_output_iterator::value&& + FMT_ENABLE_IF(detail::is_output_iterator, + Char>::value&& detail::is_exotic_char::value)> -auto vformat_to(OutputIt out, const S& format_str, - typename detail::vformat_args::type args) -> OutputIt { +auto vformat_to(OutputIt&& out, const S& format_str, + typename detail::vformat_args::type args) + -> remove_cvref_t { auto&& buf = detail::get_buffer(out); detail::vformat_to(buf, detail::to_string_view(format_str), args); return detail::get_iterator(buf, out); @@ -197,9 +199,11 @@ auto vformat_to(Char (&out)[Size], const S& format_str, template , - FMT_ENABLE_IF(detail::is_output_iterator::value&& + FMT_ENABLE_IF(detail::is_output_iterator, + Char>::value&& detail::is_exotic_char::value)> -inline auto format_to(OutputIt out, const S& fmt, T&&... args) -> OutputIt { +inline auto format_to(OutputIt&& out, const S& fmt, T&&... args) + -> remove_cvref_t { return vformat_to(out, detail::to_string_view(fmt), fmt::make_format_args>(args...)); } @@ -215,12 +219,13 @@ inline auto format_to(Char (&out)[Size], const S& fmt, T&&... args) template , - FMT_ENABLE_IF(detail::is_output_iterator::value&& + FMT_ENABLE_IF(detail::is_output_iterator, + Char>::value&& detail::is_locale::value&& detail::is_exotic_char::value)> -inline auto vformat_to(OutputIt out, const Locale& loc, const S& format_str, +inline auto vformat_to(OutputIt&& out, const Locale& loc, const S& format_str, typename detail::vformat_args::type args) - -> OutputIt { + -> remove_cvref_t { auto&& buf = detail::get_buffer(out); vformat_to(buf, detail::to_string_view(format_str), args, detail::locale_ref(loc)); @@ -242,14 +247,15 @@ inline auto vformat_to(Char (&out)[Size], const Locale& loc, return {out + buf.count(), out + Size}; } -template , - bool enable = detail::is_output_iterator::value && - detail::is_locale::value && - detail::is_exotic_char::value> -inline auto format_to(OutputIt out, const Locale& loc, const S& format_str, +template < + typename OutputIt, typename Locale, typename S, typename... T, + typename Char = detail::format_string_char_t, + bool enable = + detail::is_output_iterator, Char>::value && + detail::is_locale::value && detail::is_exotic_char::value> +inline auto format_to(OutputIt&& out, const Locale& loc, const S& format_str, T&&... args) -> - typename std::enable_if::type { + typename std::enable_if>::type { return vformat_to(out, loc, detail::to_string_view(format_str), fmt::make_format_args>(args...)); }