mirror of
https://github.com/fmtlib/fmt.git
synced 2024-11-27 04:20:06 +00:00
Cleanup format API
This commit is contained in:
parent
9282222b7d
commit
891c9a73ae
@ -63,8 +63,8 @@ FMT_FUNC void format_error_code(detail::buffer<char>& out, int error_code,
|
|||||||
FMT_ASSERT(out.size() <= inline_buffer_size, "");
|
FMT_ASSERT(out.size() <= inline_buffer_size, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
FMT_FUNC void report_error(format_func func, int error_code,
|
FMT_FUNC void do_report_error(format_func func, int error_code,
|
||||||
const char* message) noexcept {
|
const char* message) noexcept {
|
||||||
memory_buffer full_message;
|
memory_buffer full_message;
|
||||||
func(full_message, error_code, message);
|
func(full_message, error_code, message);
|
||||||
// Don't use fwrite_all because the latter may throw.
|
// Don't use fwrite_all because the latter may throw.
|
||||||
@ -1434,7 +1434,7 @@ FMT_FUNC void format_system_error(detail::buffer<char>& out, int error_code,
|
|||||||
|
|
||||||
FMT_FUNC void report_system_error(int error_code,
|
FMT_FUNC void report_system_error(int error_code,
|
||||||
const char* message) noexcept {
|
const char* message) noexcept {
|
||||||
report_error(format_system_error, error_code, message);
|
do_report_error(format_system_error, error_code, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
FMT_FUNC auto vformat(string_view fmt, format_args args) -> std::string {
|
FMT_FUNC auto vformat(string_view fmt, format_args args) -> std::string {
|
||||||
|
@ -1297,6 +1297,17 @@ template <> inline auto decimal_point(locale_ref loc) -> wchar_t {
|
|||||||
return decimal_point_impl<wchar_t>(loc);
|
return decimal_point_impl<wchar_t>(loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef FMT_HEADER_ONLY
|
||||||
|
FMT_BEGIN_EXPORT
|
||||||
|
extern template FMT_API auto thousands_sep_impl<char>(locale_ref)
|
||||||
|
-> thousands_sep_result<char>;
|
||||||
|
extern template FMT_API auto thousands_sep_impl<wchar_t>(locale_ref)
|
||||||
|
-> thousands_sep_result<wchar_t>;
|
||||||
|
extern template FMT_API auto decimal_point_impl(locale_ref) -> char;
|
||||||
|
extern template FMT_API auto decimal_point_impl(locale_ref) -> wchar_t;
|
||||||
|
FMT_END_EXPORT
|
||||||
|
#endif // FMT_HEADER_ONLY
|
||||||
|
|
||||||
// Compares two characters for equality.
|
// Compares two characters for equality.
|
||||||
template <typename Char> auto equal2(const Char* lhs, const char* rhs) -> bool {
|
template <typename Char> auto equal2(const Char* lhs, const char* rhs) -> bool {
|
||||||
return lhs[0] == Char(rhs[0]) && lhs[1] == Char(rhs[1]);
|
return lhs[0] == Char(rhs[0]) && lhs[1] == Char(rhs[1]);
|
||||||
@ -3779,6 +3790,27 @@ template <typename Char> struct format_handler {
|
|||||||
FMT_NORETURN void on_error(const char* message) { report_error(message); }
|
FMT_NORETURN void on_error(const char* message) { report_error(message); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
using format_func = void (*)(detail::buffer<char>&, int, const char*);
|
||||||
|
FMT_API void do_report_error(format_func func, int error_code,
|
||||||
|
const char* message) noexcept;
|
||||||
|
|
||||||
|
FMT_API void format_error_code(buffer<char>& out, int error_code,
|
||||||
|
string_view message) noexcept;
|
||||||
|
|
||||||
|
template <typename T, typename Char, type TYPE>
|
||||||
|
template <typename FormatContext>
|
||||||
|
FMT_CONSTEXPR auto native_formatter<T, Char, TYPE>::format(
|
||||||
|
const T& val, FormatContext& ctx) const -> decltype(ctx.out()) {
|
||||||
|
if (!specs_.dynamic())
|
||||||
|
return write<Char>(ctx.out(), val, specs_, ctx.locale());
|
||||||
|
auto specs = format_specs(specs_);
|
||||||
|
handle_dynamic_spec(specs.dynamic_width(), specs.width, specs_.width_ref,
|
||||||
|
ctx);
|
||||||
|
handle_dynamic_spec(specs.dynamic_precision(), specs.precision,
|
||||||
|
specs_.precision_ref, ctx);
|
||||||
|
return write<Char>(ctx.out(), val, specs, ctx.locale());
|
||||||
|
}
|
||||||
|
|
||||||
// DEPRECATED!
|
// DEPRECATED!
|
||||||
template <typename Char = char> struct vformat_args {
|
template <typename Char = char> struct vformat_args {
|
||||||
using type = basic_format_args<buffered_context<Char>>;
|
using type = basic_format_args<buffered_context<Char>>;
|
||||||
@ -3794,57 +3826,10 @@ void vformat_to(buffer<Char>& buf, basic_string_view<Char> fmt,
|
|||||||
parse_format_string(
|
parse_format_string(
|
||||||
fmt, format_handler<Char>{parse_context<Char>(fmt), {out, args, loc}});
|
fmt, format_handler<Char>{parse_context<Char>(fmt), {out, args, loc}});
|
||||||
}
|
}
|
||||||
|
|
||||||
using format_func = void (*)(detail::buffer<char>&, int, const char*);
|
|
||||||
|
|
||||||
FMT_API void format_error_code(buffer<char>& out, int error_code,
|
|
||||||
string_view message) noexcept;
|
|
||||||
|
|
||||||
using fmt::report_error;
|
|
||||||
FMT_API void report_error(format_func func, int error_code,
|
|
||||||
const char* message) noexcept;
|
|
||||||
|
|
||||||
FMT_BEGIN_EXPORT
|
|
||||||
|
|
||||||
#ifndef FMT_HEADER_ONLY
|
|
||||||
extern template FMT_API auto thousands_sep_impl<char>(locale_ref)
|
|
||||||
-> thousands_sep_result<char>;
|
|
||||||
extern template FMT_API auto thousands_sep_impl<wchar_t>(locale_ref)
|
|
||||||
-> thousands_sep_result<wchar_t>;
|
|
||||||
extern template FMT_API auto decimal_point_impl(locale_ref) -> char;
|
|
||||||
extern template FMT_API auto decimal_point_impl(locale_ref) -> wchar_t;
|
|
||||||
#endif // FMT_HEADER_ONLY
|
|
||||||
|
|
||||||
FMT_END_EXPORT
|
|
||||||
|
|
||||||
template <typename T, typename Char, type TYPE>
|
|
||||||
template <typename FormatContext>
|
|
||||||
FMT_CONSTEXPR auto native_formatter<T, Char, TYPE>::format(
|
|
||||||
const T& val, FormatContext& ctx) const -> decltype(ctx.out()) {
|
|
||||||
if (!specs_.dynamic())
|
|
||||||
return write<Char>(ctx.out(), val, specs_, ctx.locale());
|
|
||||||
auto specs = format_specs(specs_);
|
|
||||||
handle_dynamic_spec(specs.dynamic_width(), specs.width, specs_.width_ref,
|
|
||||||
ctx);
|
|
||||||
handle_dynamic_spec(specs.dynamic_precision(), specs.precision,
|
|
||||||
specs_.precision_ref, ctx);
|
|
||||||
return write<Char>(ctx.out(), val, specs, ctx.locale());
|
|
||||||
}
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
FMT_BEGIN_EXPORT
|
FMT_BEGIN_EXPORT
|
||||||
|
|
||||||
template <typename T, typename Char>
|
|
||||||
struct formatter<T, Char, void_t<detail::format_as_result<T>>>
|
|
||||||
: formatter<detail::format_as_result<T>, Char> {
|
|
||||||
template <typename FormatContext>
|
|
||||||
FMT_CONSTEXPR auto format(const T& value, FormatContext& ctx) const
|
|
||||||
-> decltype(ctx.out()) {
|
|
||||||
auto&& val = format_as(value); // Make an lvalue reference for format.
|
|
||||||
return formatter<detail::format_as_result<T>, Char>::format(val, ctx);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
#define FMT_FORMAT_AS(Type, Base) \
|
#define FMT_FORMAT_AS(Type, Base) \
|
||||||
template <typename Char> \
|
template <typename Char> \
|
||||||
struct formatter<Type, Char> : formatter<Base, Char> { \
|
struct formatter<Type, Char> : formatter<Base, Char> { \
|
||||||
@ -3884,6 +3869,17 @@ struct formatter<detail::float128, Char>
|
|||||||
: detail::native_formatter<detail::float128, Char,
|
: detail::native_formatter<detail::float128, Char,
|
||||||
detail::type::float_type> {};
|
detail::type::float_type> {};
|
||||||
|
|
||||||
|
template <typename T, typename Char>
|
||||||
|
struct formatter<T, Char, void_t<detail::format_as_result<T>>>
|
||||||
|
: formatter<detail::format_as_result<T>, Char> {
|
||||||
|
template <typename FormatContext>
|
||||||
|
FMT_CONSTEXPR auto format(const T& value, FormatContext& ctx) const
|
||||||
|
-> decltype(ctx.out()) {
|
||||||
|
auto&& val = format_as(value); // Make an lvalue reference for format.
|
||||||
|
return formatter<detail::format_as_result<T>, Char>::format(val, ctx);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts `p` to `const void*` for pointer formatting.
|
* Converts `p` to `const void*` for pointer formatting.
|
||||||
*
|
*
|
||||||
|
@ -160,7 +160,7 @@ void detail::format_windows_error(detail::buffer<char>& out, int error_code,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void report_windows_error(int error_code, const char* message) noexcept {
|
void report_windows_error(int error_code, const char* message) noexcept {
|
||||||
report_error(detail::format_windows_error, error_code, message);
|
do_report_error(detail::format_windows_error, error_code, message);
|
||||||
}
|
}
|
||||||
#endif // _WIN32
|
#endif // _WIN32
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user