mirror of
https://github.com/fmtlib/fmt.git
synced 2024-10-02 04:52:03 +00:00
Cleanup
This commit is contained in:
parent
158893b384
commit
cc3ff1529d
@ -330,7 +330,7 @@ FMT_CONSTEXPR inline auto operator|(emphasis lhs, emphasis rhs) noexcept
|
|||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
template <typename Char> struct ansi_color_escape {
|
template <typename Char> struct ansi_color_escape {
|
||||||
FMT_CONSTEXPR ansi_color_escape(detail::color_type text_color,
|
FMT_CONSTEXPR ansi_color_escape(color_type text_color,
|
||||||
const char* esc) noexcept {
|
const char* esc) noexcept {
|
||||||
// If we have a terminal color, we need to output another escape code
|
// If we have a terminal color, we need to output another escape code
|
||||||
// sequence.
|
// sequence.
|
||||||
@ -412,13 +412,13 @@ template <typename Char> struct ansi_color_escape {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template <typename Char>
|
template <typename Char>
|
||||||
FMT_CONSTEXPR auto make_foreground_color(detail::color_type foreground) noexcept
|
FMT_CONSTEXPR auto make_foreground_color(color_type foreground) noexcept
|
||||||
-> ansi_color_escape<Char> {
|
-> ansi_color_escape<Char> {
|
||||||
return ansi_color_escape<Char>(foreground, "\x1b[38;2;");
|
return ansi_color_escape<Char>(foreground, "\x1b[38;2;");
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename Char>
|
template <typename Char>
|
||||||
FMT_CONSTEXPR auto make_background_color(detail::color_type background) noexcept
|
FMT_CONSTEXPR auto make_background_color(color_type background) noexcept
|
||||||
-> ansi_color_escape<Char> {
|
-> ansi_color_escape<Char> {
|
||||||
return ansi_color_escape<Char>(background, "\x1b[48;2;");
|
return ansi_color_escape<Char>(background, "\x1b[48;2;");
|
||||||
}
|
}
|
||||||
@ -434,7 +434,7 @@ template <typename Char> inline void reset_color(buffer<Char>& buffer) {
|
|||||||
buffer.append(reset_color.begin(), reset_color.end());
|
buffer.append(reset_color.begin(), reset_color.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> struct styled_arg : detail::view {
|
template <typename T> struct styled_arg : view {
|
||||||
const T& value;
|
const T& value;
|
||||||
text_style style;
|
text_style style;
|
||||||
styled_arg(const T& v, text_style s) : value(v), style(s) {}
|
styled_arg(const T& v, text_style s) : value(v), style(s) {}
|
||||||
@ -447,21 +447,21 @@ void vformat_to(buffer<Char>& buf, const text_style& ts,
|
|||||||
bool has_style = false;
|
bool has_style = false;
|
||||||
if (ts.has_emphasis()) {
|
if (ts.has_emphasis()) {
|
||||||
has_style = true;
|
has_style = true;
|
||||||
auto emphasis = detail::make_emphasis<Char>(ts.get_emphasis());
|
auto emphasis = make_emphasis<Char>(ts.get_emphasis());
|
||||||
buf.append(emphasis.begin(), emphasis.end());
|
buf.append(emphasis.begin(), emphasis.end());
|
||||||
}
|
}
|
||||||
if (ts.has_foreground()) {
|
if (ts.has_foreground()) {
|
||||||
has_style = true;
|
has_style = true;
|
||||||
auto foreground = detail::make_foreground_color<Char>(ts.get_foreground());
|
auto foreground = make_foreground_color<Char>(ts.get_foreground());
|
||||||
buf.append(foreground.begin(), foreground.end());
|
buf.append(foreground.begin(), foreground.end());
|
||||||
}
|
}
|
||||||
if (ts.has_background()) {
|
if (ts.has_background()) {
|
||||||
has_style = true;
|
has_style = true;
|
||||||
auto background = detail::make_background_color<Char>(ts.get_background());
|
auto background = make_background_color<Char>(ts.get_background());
|
||||||
buf.append(background.begin(), background.end());
|
buf.append(background.begin(), background.end());
|
||||||
}
|
}
|
||||||
detail::vformat_to(buf, fmt, args);
|
vformat_to(buf, fmt, args);
|
||||||
if (has_style) detail::reset_color<Char>(buf);
|
if (has_style) reset_color<Char>(buf);
|
||||||
}
|
}
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
|
@ -41,47 +41,12 @@ template class file_access<file_access_tag, std::filebuf,
|
|||||||
auto get_file(std::filebuf&) -> FILE*;
|
auto get_file(std::filebuf&) -> FILE*;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
inline auto write_ostream_unicode(std::ostream& os, fmt::string_view data)
|
|
||||||
-> bool {
|
|
||||||
FILE* f = nullptr;
|
|
||||||
#if FMT_MSC_VERSION && FMT_USE_RTTI
|
|
||||||
if (auto* buf = dynamic_cast<std::filebuf*>(os.rdbuf()))
|
|
||||||
f = get_file(*buf);
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
#elif defined(_WIN32) && defined(__GLIBCXX__) && FMT_USE_RTTI
|
|
||||||
auto* rdbuf = os.rdbuf();
|
|
||||||
if (auto* sfbuf = dynamic_cast<__gnu_cxx::stdio_sync_filebuf<char>*>(rdbuf))
|
|
||||||
f = sfbuf->file();
|
|
||||||
else if (auto* fbuf = dynamic_cast<__gnu_cxx::stdio_filebuf<char>*>(rdbuf))
|
|
||||||
f = fbuf->file();
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
#else
|
|
||||||
ignore_unused(os, data, f);
|
|
||||||
#endif
|
|
||||||
#ifdef _WIN32
|
|
||||||
if (f) {
|
|
||||||
int fd = _fileno(f);
|
|
||||||
if (_isatty(fd)) {
|
|
||||||
os.flush();
|
|
||||||
return write_console(fd, data);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
inline auto write_ostream_unicode(std::wostream&,
|
|
||||||
fmt::basic_string_view<wchar_t>) -> bool {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Write the content of buf to os.
|
// Write the content of buf to os.
|
||||||
// It is a separate function rather than a part of vprint to simplify testing.
|
// It is a separate function rather than a part of vprint to simplify testing.
|
||||||
template <typename Char>
|
template <typename Char>
|
||||||
void write_buffer(std::basic_ostream<Char>& os, buffer<Char>& buf) {
|
void write_buffer(std::basic_ostream<Char>& os, buffer<Char>& buf) {
|
||||||
const Char* buf_data = buf.data();
|
const Char* buf_data = buf.data();
|
||||||
using unsigned_streamsize = std::make_unsigned<std::streamsize>::type;
|
using unsigned_streamsize =make_unsigned_t<std::streamsize>;
|
||||||
unsigned_streamsize size = buf.size();
|
unsigned_streamsize size = buf.size();
|
||||||
unsigned_streamsize max_size = to_unsigned(max_value<std::streamsize>());
|
unsigned_streamsize max_size = to_unsigned(max_value<std::streamsize>());
|
||||||
do {
|
do {
|
||||||
@ -96,9 +61,7 @@ template <typename Char, typename T>
|
|||||||
void format_value(buffer<Char>& buf, const T& value) {
|
void format_value(buffer<Char>& buf, const T& value) {
|
||||||
auto&& format_buf = formatbuf<std::basic_streambuf<Char>>(buf);
|
auto&& format_buf = formatbuf<std::basic_streambuf<Char>>(buf);
|
||||||
auto&& output = std::basic_ostream<Char>(&format_buf);
|
auto&& output = std::basic_ostream<Char>(&format_buf);
|
||||||
#if !defined(FMT_STATIC_THOUSANDS_SEPARATOR)
|
|
||||||
output.imbue(std::locale::classic()); // The default is always unlocalized.
|
output.imbue(std::locale::classic()); // The default is always unlocalized.
|
||||||
#endif
|
|
||||||
output << value;
|
output << value;
|
||||||
output.exceptions(std::ios_base::failbit | std::ios_base::badbit);
|
output.exceptions(std::ios_base::failbit | std::ios_base::badbit);
|
||||||
}
|
}
|
||||||
@ -106,7 +69,6 @@ void format_value(buffer<Char>& buf, const T& value) {
|
|||||||
template <typename T> struct streamed_view {
|
template <typename T> struct streamed_view {
|
||||||
const T& value;
|
const T& value;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
// Formats an object of type T that has an overloaded ostream operator<<.
|
// Formats an object of type T that has an overloaded ostream operator<<.
|
||||||
@ -148,13 +110,30 @@ constexpr auto streamed(const T& value) -> detail::streamed_view<T> {
|
|||||||
return {value};
|
return {value};
|
||||||
}
|
}
|
||||||
|
|
||||||
FMT_EXPORT template <typename Char>
|
inline void vprint(std::ostream& os, string_view fmt, format_args args) {
|
||||||
void vprint(std::basic_ostream<Char>& os,
|
auto buffer = memory_buffer();
|
||||||
basic_string_view<type_identity_t<Char>> fmt,
|
|
||||||
typename detail::vformat_args<Char>::type args) {
|
|
||||||
auto buffer = basic_memory_buffer<Char>();
|
|
||||||
detail::vformat_to(buffer, fmt, args);
|
detail::vformat_to(buffer, fmt, args);
|
||||||
if (!detail::write_ostream_unicode(os, {buffer.data(), buffer.size()}))
|
FILE* f = nullptr;
|
||||||
|
#if FMT_MSC_VERSION && FMT_USE_RTTI
|
||||||
|
if (auto* buf = dynamic_cast<std::filebuf*>(os.rdbuf()))
|
||||||
|
f = detail::get_file(*buf);
|
||||||
|
#elif defined(_WIN32) && defined(__GLIBCXX__) && FMT_USE_RTTI
|
||||||
|
auto* rdbuf = os.rdbuf();
|
||||||
|
if (auto* sfbuf = dynamic_cast<__gnu_cxx::stdio_sync_filebuf<char>*>(rdbuf))
|
||||||
|
f = sfbuf->file();
|
||||||
|
else if (auto* fbuf = dynamic_cast<__gnu_cxx::stdio_filebuf<char>*>(rdbuf))
|
||||||
|
f = fbuf->file();
|
||||||
|
#endif
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (f) {
|
||||||
|
int fd = _fileno(f);
|
||||||
|
if (_isatty(fd)) {
|
||||||
|
os.flush();
|
||||||
|
if (detail::write_console(fd, {buffer.data(), buffer.size()})) return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
detail::ignore_unused(f);
|
||||||
detail::write_buffer(os, buffer);
|
detail::write_buffer(os, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,25 +153,11 @@ void print(std::ostream& os, format_string<T...> fmt, T&&... args) {
|
|||||||
detail::write_buffer(os, buffer);
|
detail::write_buffer(os, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
FMT_EXPORT
|
|
||||||
template <typename... T>
|
|
||||||
void print(std::wostream& os, typename fstring<wchar_t, T...>::t fmt,
|
|
||||||
T&&... args) {
|
|
||||||
vprint(os, fmt, fmt::make_format_args<buffered_context<wchar_t>>(args...));
|
|
||||||
}
|
|
||||||
|
|
||||||
FMT_EXPORT template <typename... T>
|
FMT_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) {
|
||||||
fmt::print(os, "{}\n", fmt::format(fmt, std::forward<T>(args)...));
|
fmt::print(os, "{}\n", fmt::format(fmt, std::forward<T>(args)...));
|
||||||
}
|
}
|
||||||
|
|
||||||
FMT_EXPORT
|
|
||||||
template <typename... T>
|
|
||||||
void println(std::wostream& os, typename fstring<wchar_t, T...>::t fmt,
|
|
||||||
T&&... args) {
|
|
||||||
print(os, L"{}\n", fmt::format(fmt, std::forward<T>(args)...));
|
|
||||||
}
|
|
||||||
|
|
||||||
FMT_END_NAMESPACE
|
FMT_END_NAMESPACE
|
||||||
|
|
||||||
#endif // FMT_OSTREAM_H_
|
#endif // FMT_OSTREAM_H_
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
#include "color.h"
|
#include "color.h"
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
|
#include "ostream.h"
|
||||||
#include "ranges.h"
|
#include "ranges.h"
|
||||||
|
|
||||||
#ifndef FMT_MODULE
|
#ifndef FMT_MODULE
|
||||||
@ -310,6 +311,24 @@ FMT_DEPRECATED void print(const text_style& ts, wformat_string<T...> fmt,
|
|||||||
return print(stdout, ts, fmt, args...);
|
return print(stdout, ts, fmt, args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline void vprint(std::wostream& os, wstring_view fmt, wformat_args args) {
|
||||||
|
auto buffer = basic_memory_buffer<wchar_t>();
|
||||||
|
detail::vformat_to(buffer, fmt, args);
|
||||||
|
detail::write_buffer(os, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename... T>
|
||||||
|
void print(std::wostream& os, typename fstring<wchar_t, T...>::t fmt,
|
||||||
|
T&&... args) {
|
||||||
|
vprint(os, fmt, fmt::make_format_args<buffered_context<wchar_t>>(args...));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename... T>
|
||||||
|
void println(std::wostream& os, typename fstring<wchar_t, T...>::t fmt,
|
||||||
|
T&&... args) {
|
||||||
|
print(os, L"{}\n", fmt::format(fmt, std::forward<T>(args)...));
|
||||||
|
}
|
||||||
|
|
||||||
/// Converts `value` to `std::wstring` using the default format for type `T`.
|
/// Converts `value` to `std::wstring` using the default format for type `T`.
|
||||||
template <typename T> inline auto to_wstring(const T& value) -> std::wstring {
|
template <typename T> inline auto to_wstring(const T& value) -> std::wstring {
|
||||||
return format(FMT_STRING(L"{}"), value);
|
return format(FMT_STRING(L"{}"), value);
|
||||||
|
Loading…
Reference in New Issue
Block a user