More API cleanups

This commit is contained in:
Victor Zverovich 2021-05-17 07:50:29 -07:00
parent 4ab01fb198
commit 813ac49543
2 changed files with 38 additions and 36 deletions

View File

@ -2834,8 +2834,6 @@ struct formatter<T, Char,
}; };
/** Formats a string and writes the output to ``out``. */ /** Formats a string and writes the output to ``out``. */
// GCC 8 and earlier cannot handle std::back_insert_iterator<Container> with
// vformat_to<ArgFormatter>(...) overload, so SFINAE on iterator type instead.
template <typename OutputIt, typename S, typename Char = char_t<S>, template <typename OutputIt, typename S, typename Char = char_t<S>,
bool enable = detail::is_output_iterator<OutputIt, Char>::value> bool enable = detail::is_output_iterator<OutputIt, Char>::value>
auto vformat_to(OutputIt out, const S& format_str, auto vformat_to(OutputIt out, const S& format_str,
@ -2920,6 +2918,30 @@ FMT_INLINE auto vformat(
return detail::vformat(to_string_view(format_str), args); return detail::vformat(to_string_view(format_str), args);
} }
#if FMT_COMPILE_TIME_CHECKS
template <typename... Args> struct format_string {
string_view str;
template <size_t N> consteval format_string(const char (&s)[N]) : str(s) {
if constexpr (detail::count_named_args<Args...>() == 0) {
using checker = detail::format_string_checker<char, detail::error_handler,
remove_cvref_t<Args>...>;
detail::parse_format_string<true>(string_view(s, N), checker(s, {}));
}
}
template <typename T,
FMT_ENABLE_IF(std::is_constructible_v<string_view, const T&>)>
format_string(const T& s) : str(s) {}
};
template <typename... Args>
FMT_INLINE std::string format(
format_string<std::type_identity_t<Args>...> format_str, Args&&... args) {
return detail::vformat(format_str.str, make_format_args(args...));
}
#endif
/** /**
\rst \rst
Formats arguments and returns the result as a string. Formats arguments and returns the result as a string.

View File

@ -2776,47 +2776,27 @@ inline void vformat_to(
template <typename S, typename... Args, size_t SIZE = inline_buffer_size, template <typename S, typename... Args, size_t SIZE = inline_buffer_size,
typename Char = enable_if_t<detail::is_string<S>::value, char_t<S>>> typename Char = enable_if_t<detail::is_string<S>::value, char_t<S>>>
inline typename buffer_context<Char>::iterator format_to( inline auto format_to(basic_memory_buffer<Char, SIZE>& buf, const S& format_str,
basic_memory_buffer<Char, SIZE>& buf, const S& format_str, Args&&... args) { Args&&... args) ->
typename buffer_context<Char>::iterator {
const auto& vargs = fmt::make_args_checked<Args...>(format_str, args...); const auto& vargs = fmt::make_args_checked<Args...>(format_str, args...);
detail::vformat_to(buf, to_string_view(format_str), vargs); detail::vformat_to(buf, to_string_view(format_str), vargs);
return detail::buffer_appender<Char>(buf); return detail::buffer_appender<Char>(buf);
} }
template <typename OutputIt, typename Char = char> template <typename OutputIt, typename Char = char>
using format_context_t = basic_format_context<OutputIt, Char>; using format_context_t FMT_DEPRECATED_ALIAS =
basic_format_context<OutputIt, Char>;
template <typename OutputIt, typename Char = char> template <typename OutputIt, typename Char = char>
using format_args_t = basic_format_args<format_context_t<OutputIt, Char>>; using format_args_t FMT_DEPRECATED_ALIAS =
basic_format_args<basic_format_context<OutputIt, Char>>;
#if FMT_COMPILE_TIME_CHECKS
template <typename... Args> struct format_string {
string_view str;
template <size_t N> consteval format_string(const char (&s)[N]) : str(s) {
if constexpr (detail::count_named_args<Args...>() == 0) {
using checker = detail::format_string_checker<char, detail::error_handler,
remove_cvref_t<Args>...>;
detail::parse_format_string<true>(string_view(s, N), checker(s, {}));
}
}
template <typename T,
FMT_ENABLE_IF(std::is_constructible_v<string_view, const T&>)>
format_string(const T& s) : str(s) {}
};
template <typename... Args>
FMT_INLINE std::string format(
format_string<std::type_identity_t<Args>...> format_str, Args&&... args) {
return detail::vformat(format_str.str, make_format_args(args...));
}
#endif
template <typename Char, enable_if_t<(!std::is_same<Char, char>::value), int>> template <typename Char, enable_if_t<(!std::is_same<Char, char>::value), int>>
std::basic_string<Char> detail::vformat( auto detail::vformat(
basic_string_view<Char> format_str, basic_string_view<Char> format_str,
basic_format_args<buffer_context<type_identity_t<Char>>> args) { basic_format_args<buffer_context<type_identity_t<Char>>> args)
-> std::basic_string<Char> {
basic_memory_buffer<Char> buffer; basic_memory_buffer<Char> buffer;
detail::vformat_to(buffer, format_str, args); detail::vformat_to(buffer, format_str, args);
return to_string(buffer); return to_string(buffer);
@ -2906,12 +2886,12 @@ inline namespace literals {
std::string message = "The answer is {}"_format(42); std::string message = "The answer is {}"_format(42);
\endrst \endrst
*/ */
constexpr detail::udl_formatter<char> operator"" _format(const char* s, constexpr auto operator"" _format(const char* s, size_t n)
size_t n) { -> detail::udl_formatter<char> {
return {{s, n}}; return {{s, n}};
} }
constexpr detail::udl_formatter<wchar_t> operator"" _format(const wchar_t* s, constexpr auto operator"" _format(const wchar_t* s, size_t n)
size_t n) { -> detail::udl_formatter<wchar_t> {
return {{s, n}}; return {{s, n}};
} }