Reduce the memory allocations
Signed-off-by: Vladislav Shchapov <vladislav@shchapov.ru>
This commit is contained in:
parent
1741e90dec
commit
f641fc53ae
@ -2776,8 +2776,13 @@ template <typename Char>
|
|||||||
void vformat_to(buffer<Char>& buf, basic_string_view<Char> fmt,
|
void vformat_to(buffer<Char>& buf, basic_string_view<Char> fmt,
|
||||||
typename vformat_args<Char>::type args, locale_ref loc = {});
|
typename vformat_args<Char>::type args, locale_ref loc = {});
|
||||||
|
|
||||||
|
FMT_API void vprint(std::FILE* f, string_view format_str, format_args args,
|
||||||
|
string_view suffix);
|
||||||
|
FMT_API void vprint_mojibake(std::FILE*, string_view, format_args, string_view);
|
||||||
FMT_API void vprint_mojibake(std::FILE*, string_view, format_args);
|
FMT_API void vprint_mojibake(std::FILE*, string_view, format_args);
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
inline void vprint_mojibake(std::FILE*, string_view, format_args, string_view) {
|
||||||
|
}
|
||||||
inline void vprint_mojibake(std::FILE*, string_view, format_args) {}
|
inline void vprint_mojibake(std::FILE*, string_view, format_args) {}
|
||||||
#endif
|
#endif
|
||||||
FMT_END_DETAIL_NAMESPACE
|
FMT_END_DETAIL_NAMESPACE
|
||||||
@ -3021,7 +3026,9 @@ FMT_INLINE void print(std::FILE* f, format_string<T...> fmt, T&&... args) {
|
|||||||
*/
|
*/
|
||||||
template <typename... T>
|
template <typename... T>
|
||||||
FMT_INLINE void println(std::FILE* f, format_string<T...> fmt, T&&... args) {
|
FMT_INLINE void println(std::FILE* f, format_string<T...> fmt, T&&... args) {
|
||||||
return fmt::print(f, "{}\n", fmt::format(fmt, std::forward<T>(args)...));
|
const auto& vargs = fmt::make_format_args(args...);
|
||||||
|
return detail::is_utf8() ? detail::vprint(f, fmt, vargs, {"\n", 1})
|
||||||
|
: detail::vprint_mojibake(f, fmt, vargs, {"\n", 1});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -1482,23 +1482,35 @@ FMT_FUNC void print(std::FILE* f, string_view text) {
|
|||||||
#endif
|
#endif
|
||||||
detail::fwrite_fully(text.data(), 1, text.size(), f);
|
detail::fwrite_fully(text.data(), 1, text.size(), f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args,
|
||||||
|
string_view suffix) {
|
||||||
|
memory_buffer buffer;
|
||||||
|
detail::vformat_to(buffer, format_str, args);
|
||||||
|
buffer.append(suffix);
|
||||||
|
detail::print(f, {buffer.data(), buffer.size()});
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) {
|
FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) {
|
||||||
memory_buffer buffer;
|
detail::vprint(f, format_str, args, {});
|
||||||
detail::vformat_to(buffer, format_str, args);
|
|
||||||
detail::print(f, {buffer.data(), buffer.size()});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
// Print assuming legacy (non-Unicode) encoding.
|
// Print assuming legacy (non-Unicode) encoding.
|
||||||
FMT_FUNC void detail::vprint_mojibake(std::FILE* f, string_view format_str,
|
FMT_FUNC void detail::vprint_mojibake(std::FILE* f, string_view format_str,
|
||||||
format_args args) {
|
format_args args, string_view suffix) {
|
||||||
memory_buffer buffer;
|
memory_buffer buffer;
|
||||||
detail::vformat_to(buffer, format_str,
|
detail::vformat_to(buffer, format_str,
|
||||||
basic_format_args<buffer_context<char>>(args));
|
basic_format_args<buffer_context<char>>(args));
|
||||||
|
buffer.append(suffix);
|
||||||
fwrite_fully(buffer.data(), 1, buffer.size(), f);
|
fwrite_fully(buffer.data(), 1, buffer.size(), f);
|
||||||
}
|
}
|
||||||
|
FMT_FUNC void detail::vprint_mojibake(std::FILE* f, string_view format_str,
|
||||||
|
format_args args) {
|
||||||
|
vprint_mojibake(f, format_str, args, {});
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FMT_FUNC void vprint(string_view format_str, format_args args) {
|
FMT_FUNC void vprint(string_view format_str, format_args args) {
|
||||||
|
|||||||
@ -188,9 +188,22 @@ struct fallback_formatter<T, Char, enable_if_t<is_streamable<T, Char>::value>>
|
|||||||
};
|
};
|
||||||
|
|
||||||
inline void vprint_directly(std::ostream& os, string_view format_str,
|
inline void vprint_directly(std::ostream& os, string_view format_str,
|
||||||
format_args args) {
|
format_args args, string_view suffix) {
|
||||||
auto buffer = memory_buffer();
|
auto buffer = memory_buffer();
|
||||||
detail::vformat_to(buffer, format_str, args);
|
detail::vformat_to(buffer, format_str, args);
|
||||||
|
buffer.append(suffix);
|
||||||
|
detail::write_buffer(os, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Char>
|
||||||
|
void vprint(std::basic_ostream<Char>& os,
|
||||||
|
basic_string_view<type_identity_t<Char>> format_str,
|
||||||
|
basic_format_args<buffer_context<type_identity_t<Char>>> args,
|
||||||
|
basic_string_view<type_identity_t<Char>> suffix) {
|
||||||
|
auto buffer = basic_memory_buffer<Char>();
|
||||||
|
detail::vformat_to(buffer, format_str, args);
|
||||||
|
buffer.append(suffix);
|
||||||
|
if (detail::write_ostream_unicode(os, {buffer.data(), buffer.size()})) return;
|
||||||
detail::write_buffer(os, buffer);
|
detail::write_buffer(os, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,10 +213,7 @@ FMT_MODULE_EXPORT template <typename Char>
|
|||||||
void vprint(std::basic_ostream<Char>& os,
|
void vprint(std::basic_ostream<Char>& os,
|
||||||
basic_string_view<type_identity_t<Char>> format_str,
|
basic_string_view<type_identity_t<Char>> format_str,
|
||||||
basic_format_args<buffer_context<type_identity_t<Char>>> args) {
|
basic_format_args<buffer_context<type_identity_t<Char>>> args) {
|
||||||
auto buffer = basic_memory_buffer<Char>();
|
detail::vprint(os, format_str, args, {});
|
||||||
detail::vformat_to(buffer, format_str, args);
|
|
||||||
if (detail::write_ostream_unicode(os, {buffer.data(), buffer.size()})) return;
|
|
||||||
detail::write_buffer(os, buffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -221,7 +231,7 @@ void print(std::ostream& os, format_string<T...> fmt, T&&... args) {
|
|||||||
if (detail::is_utf8())
|
if (detail::is_utf8())
|
||||||
vprint(os, fmt, vargs);
|
vprint(os, fmt, vargs);
|
||||||
else
|
else
|
||||||
detail::vprint_directly(os, fmt, vargs);
|
detail::vprint_directly(os, fmt, vargs, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
FMT_MODULE_EXPORT
|
FMT_MODULE_EXPORT
|
||||||
@ -234,7 +244,11 @@ void print(std::wostream& os,
|
|||||||
|
|
||||||
FMT_MODULE_EXPORT template <typename... T>
|
FMT_MODULE_EXPORT template <typename... T>
|
||||||
void println(std::ostream& os, format_string<T...> fmt, T&&... args) {
|
void println(std::ostream& os, format_string<T...> fmt, T&&... args) {
|
||||||
print(os, "{}\n", fmt::format(fmt, std::forward<T>(args)...));
|
const auto& vargs = fmt::make_format_args(args...);
|
||||||
|
if (detail::is_utf8())
|
||||||
|
detail::vprint(os, fmt, vargs, {"\n", 1});
|
||||||
|
else
|
||||||
|
detail::vprint_directly(os, fmt, vargs, {"\n", 1});
|
||||||
}
|
}
|
||||||
|
|
||||||
FMT_MODULE_EXPORT
|
FMT_MODULE_EXPORT
|
||||||
@ -242,7 +256,9 @@ template <typename... Args>
|
|||||||
void println(std::wostream& os,
|
void println(std::wostream& os,
|
||||||
basic_format_string<wchar_t, type_identity_t<Args>...> fmt,
|
basic_format_string<wchar_t, type_identity_t<Args>...> fmt,
|
||||||
Args&&... args) {
|
Args&&... args) {
|
||||||
print(os, L"{}\n", fmt::format(fmt, std::forward<Args>(args)...));
|
detail::vprint(os, fmt,
|
||||||
|
fmt::make_format_args<buffer_context<wchar_t>>(args...),
|
||||||
|
{L"\n", 1});
|
||||||
}
|
}
|
||||||
|
|
||||||
FMT_END_NAMESPACE
|
FMT_END_NAMESPACE
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user