mirror of
https://github.com/fmtlib/fmt.git
synced 2025-04-16 05:42:19 +00:00
add make_printf_args and make_wprintf_args functions (#934)
* add make_printf_args and make_wprintf_args to printf.h add minimal test for make_printf_args and make_wprintf_args to printf-test.cc renamed the old printf_context template to basic_printf_context_t. the original wish was to rename it basic_printf_context, but that clashed with the name of the inner typedef. this style matches the format_context_t struct.
This commit is contained in:
parent
982ee5c699
commit
e37d6a9840
@ -573,18 +573,41 @@ void printf(internal::basic_buffer<Char> &buf, basic_string_view<Char> format,
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename Buffer>
|
template <typename Buffer>
|
||||||
struct printf_context {
|
struct basic_printf_context_t {
|
||||||
typedef basic_printf_context<
|
typedef basic_printf_context<
|
||||||
std::back_insert_iterator<Buffer>, typename Buffer::value_type> type;
|
std::back_insert_iterator<Buffer>, typename Buffer::value_type> type;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef basic_format_args<printf_context<internal::buffer>::type> printf_args;
|
typedef basic_printf_context_t<internal::buffer>::type printf_context;
|
||||||
typedef basic_format_args<printf_context<internal::wbuffer>::type> wprintf_args;
|
typedef basic_printf_context_t<internal::wbuffer>::type wprintf_context;
|
||||||
|
|
||||||
|
typedef basic_format_args<printf_context> printf_args;
|
||||||
|
typedef basic_format_args<wprintf_context> wprintf_args;
|
||||||
|
|
||||||
|
/**
|
||||||
|
\rst
|
||||||
|
Constructs an `~fmt::format_arg_store` object that contains references to
|
||||||
|
arguments and can be implicitly converted to `~fmt::printf_args`.
|
||||||
|
\endrst
|
||||||
|
*/
|
||||||
|
template<typename... Args>
|
||||||
|
inline format_arg_store<printf_context, Args...>
|
||||||
|
make_printf_args(const Args &... args) { return {args...}; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
\rst
|
||||||
|
Constructs an `~fmt::format_arg_store` object that contains references to
|
||||||
|
arguments and can be implicitly converted to `~fmt::wprintf_args`.
|
||||||
|
\endrst
|
||||||
|
*/
|
||||||
|
template<typename... Args>
|
||||||
|
inline format_arg_store<wprintf_context, Args...>
|
||||||
|
make_wprintf_args(const Args &... args) { return {args...}; }
|
||||||
|
|
||||||
template <typename S, typename Char = FMT_CHAR(S)>
|
template <typename S, typename Char = FMT_CHAR(S)>
|
||||||
inline std::basic_string<Char>
|
inline std::basic_string<Char>
|
||||||
vsprintf(const S &format,
|
vsprintf(const S &format,
|
||||||
basic_format_args<typename printf_context<
|
basic_format_args<typename basic_printf_context_t<
|
||||||
internal::basic_buffer<Char>>::type> args) {
|
internal::basic_buffer<Char>>::type> args) {
|
||||||
basic_memory_buffer<Char> buffer;
|
basic_memory_buffer<Char> buffer;
|
||||||
printf(buffer, to_string_view(format), args);
|
printf(buffer, to_string_view(format), args);
|
||||||
@ -605,7 +628,7 @@ inline FMT_ENABLE_IF_STRING(S, std::basic_string<FMT_CHAR(S)>)
|
|||||||
sprintf(const S &format, const Args & ... args) {
|
sprintf(const S &format, const Args & ... args) {
|
||||||
internal::check_format_string<Args...>(format);
|
internal::check_format_string<Args...>(format);
|
||||||
typedef internal::basic_buffer<FMT_CHAR(S)> buffer;
|
typedef internal::basic_buffer<FMT_CHAR(S)> buffer;
|
||||||
typedef typename printf_context<buffer>::type context;
|
typedef typename basic_printf_context_t<buffer>::type context;
|
||||||
format_arg_store<context, Args...> as{ args... };
|
format_arg_store<context, Args...> as{ args... };
|
||||||
return vsprintf(to_string_view(format),
|
return vsprintf(to_string_view(format),
|
||||||
basic_format_args<context>(as));
|
basic_format_args<context>(as));
|
||||||
@ -613,7 +636,7 @@ inline FMT_ENABLE_IF_STRING(S, std::basic_string<FMT_CHAR(S)>)
|
|||||||
|
|
||||||
template <typename S, typename Char = FMT_CHAR(S)>
|
template <typename S, typename Char = FMT_CHAR(S)>
|
||||||
inline int vfprintf(std::FILE *f, const S &format,
|
inline int vfprintf(std::FILE *f, const S &format,
|
||||||
basic_format_args<typename printf_context<
|
basic_format_args<typename basic_printf_context_t<
|
||||||
internal::basic_buffer<Char>>::type> args) {
|
internal::basic_buffer<Char>>::type> args) {
|
||||||
basic_memory_buffer<Char> buffer;
|
basic_memory_buffer<Char> buffer;
|
||||||
printf(buffer, to_string_view(format), args);
|
printf(buffer, to_string_view(format), args);
|
||||||
@ -636,7 +659,7 @@ inline FMT_ENABLE_IF_STRING(S, int)
|
|||||||
fprintf(std::FILE *f, const S &format, const Args & ... args) {
|
fprintf(std::FILE *f, const S &format, const Args & ... args) {
|
||||||
internal::check_format_string<Args...>(format);
|
internal::check_format_string<Args...>(format);
|
||||||
typedef internal::basic_buffer<FMT_CHAR(S)> buffer;
|
typedef internal::basic_buffer<FMT_CHAR(S)> buffer;
|
||||||
typedef typename printf_context<buffer>::type context;
|
typedef typename basic_printf_context_t<buffer>::type context;
|
||||||
format_arg_store<context, Args...> as{ args... };
|
format_arg_store<context, Args...> as{ args... };
|
||||||
return vfprintf(f, to_string_view(format),
|
return vfprintf(f, to_string_view(format),
|
||||||
basic_format_args<context>(as));
|
basic_format_args<context>(as));
|
||||||
@ -644,7 +667,7 @@ inline FMT_ENABLE_IF_STRING(S, int)
|
|||||||
|
|
||||||
template <typename S, typename Char = FMT_CHAR(S)>
|
template <typename S, typename Char = FMT_CHAR(S)>
|
||||||
inline int vprintf(const S &format,
|
inline int vprintf(const S &format,
|
||||||
basic_format_args<typename printf_context<
|
basic_format_args<typename basic_printf_context_t<
|
||||||
internal::basic_buffer<Char>>::type> args) {
|
internal::basic_buffer<Char>>::type> args) {
|
||||||
return vfprintf(stdout, to_string_view(format), args);
|
return vfprintf(stdout, to_string_view(format), args);
|
||||||
}
|
}
|
||||||
@ -663,7 +686,7 @@ inline FMT_ENABLE_IF_STRING(S, int)
|
|||||||
printf(const S &format_str, const Args & ... args) {
|
printf(const S &format_str, const Args & ... args) {
|
||||||
internal::check_format_string<Args...>(format_str);
|
internal::check_format_string<Args...>(format_str);
|
||||||
typedef internal::basic_buffer<FMT_CHAR(S)> buffer;
|
typedef internal::basic_buffer<FMT_CHAR(S)> buffer;
|
||||||
typedef typename printf_context<buffer>::type context;
|
typedef typename basic_printf_context_t<buffer>::type context;
|
||||||
format_arg_store<context, Args...> as{ args... };
|
format_arg_store<context, Args...> as{ args... };
|
||||||
return vprintf(to_string_view(format_str),
|
return vprintf(to_string_view(format_str),
|
||||||
basic_format_args<context>(as));
|
basic_format_args<context>(as));
|
||||||
@ -672,7 +695,7 @@ inline FMT_ENABLE_IF_STRING(S, int)
|
|||||||
template <typename S, typename Char = FMT_CHAR(S)>
|
template <typename S, typename Char = FMT_CHAR(S)>
|
||||||
inline int vfprintf(std::basic_ostream<Char> &os,
|
inline int vfprintf(std::basic_ostream<Char> &os,
|
||||||
const S &format,
|
const S &format,
|
||||||
basic_format_args<typename printf_context<
|
basic_format_args<typename basic_printf_context_t<
|
||||||
internal::basic_buffer<Char>>::type> args) {
|
internal::basic_buffer<Char>>::type> args) {
|
||||||
basic_memory_buffer<Char> buffer;
|
basic_memory_buffer<Char> buffer;
|
||||||
printf(buffer, to_string_view(format), args);
|
printf(buffer, to_string_view(format), args);
|
||||||
@ -695,7 +718,7 @@ inline FMT_ENABLE_IF_STRING(S, int)
|
|||||||
const S &format_str, const Args & ... args) {
|
const S &format_str, const Args & ... args) {
|
||||||
internal::check_format_string<Args...>(format_str);
|
internal::check_format_string<Args...>(format_str);
|
||||||
typedef internal::basic_buffer<FMT_CHAR(S)> buffer;
|
typedef internal::basic_buffer<FMT_CHAR(S)> buffer;
|
||||||
typedef typename printf_context<buffer>::type context;
|
typedef typename basic_printf_context_t<buffer>::type context;
|
||||||
format_arg_store<context, Args...> as{ args... };
|
format_arg_store<context, Args...> as{ args... };
|
||||||
return vfprintf(os, to_string_view(format_str),
|
return vfprintf(os, to_string_view(format_str),
|
||||||
basic_format_args<context>(as));
|
basic_format_args<context>(as));
|
||||||
|
@ -501,9 +501,8 @@ TEST(PrintfTest, OStream) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST(PrintfTest, VPrintf) {
|
TEST(PrintfTest, VPrintf) {
|
||||||
typedef fmt::printf_context<fmt::internal::buffer>::type context;
|
fmt::format_arg_store<fmt::printf_context, int> as{42};
|
||||||
fmt::format_arg_store<context, int> as{42};
|
fmt::basic_format_args<fmt::printf_context> args(as);
|
||||||
fmt::basic_format_args<context> args(as);
|
|
||||||
EXPECT_EQ(fmt::vsprintf("%d", args), "42");
|
EXPECT_EQ(fmt::vsprintf("%d", args), "42");
|
||||||
EXPECT_WRITE(stdout, fmt::vprintf("%d", args), "42");
|
EXPECT_WRITE(stdout, fmt::vprintf("%d", args), "42");
|
||||||
EXPECT_WRITE(stdout, fmt::vfprintf(stdout, "%d", args), "42");
|
EXPECT_WRITE(stdout, fmt::vfprintf(stdout, "%d", args), "42");
|
||||||
@ -518,3 +517,42 @@ void check_format_string_regression(fmt::string_view s, const Args&... args) {
|
|||||||
TEST(PrintfTest, CheckFormatStringRegression) {
|
TEST(PrintfTest, CheckFormatStringRegression) {
|
||||||
check_format_string_regression("%c%s", 'x', "");
|
check_format_string_regression("%c%s", 'x', "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(PrintfTest, VSPrintfMakeArgsExample) {
|
||||||
|
fmt::format_arg_store<fmt::printf_context, int, const char *> as{
|
||||||
|
42, "something"};
|
||||||
|
fmt::basic_format_args<fmt::printf_context> args(as);
|
||||||
|
EXPECT_EQ(
|
||||||
|
"[42] something happened", fmt::vsprintf("[%d] %s happened", args));
|
||||||
|
auto as2 = fmt::make_printf_args(42, "something");
|
||||||
|
fmt::basic_format_args<fmt::printf_context> args2(as2);
|
||||||
|
EXPECT_EQ(
|
||||||
|
"[42] something happened", fmt::vsprintf("[%d] %s happened", args2));
|
||||||
|
//the older gcc versions can't cast the return value
|
||||||
|
#if !defined(__GNUC__) || (__GNUC__ > 4)
|
||||||
|
EXPECT_EQ(
|
||||||
|
"[42] something happened",
|
||||||
|
fmt::vsprintf(
|
||||||
|
"[%d] %s happened", fmt::make_printf_args(42, "something")));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(PrintfTest, VSPrintfMakeWArgsExample) {
|
||||||
|
fmt::format_arg_store<fmt::wprintf_context, int, const wchar_t *> as{
|
||||||
|
42, L"something"};
|
||||||
|
fmt::basic_format_args<fmt::wprintf_context> args(as);
|
||||||
|
EXPECT_EQ(
|
||||||
|
L"[42] something happened",
|
||||||
|
fmt::vsprintf(L"[%d] %s happened", args));
|
||||||
|
auto as2 = fmt::make_wprintf_args(42, L"something");
|
||||||
|
fmt::basic_format_args<fmt::wprintf_context> args2(as2);
|
||||||
|
EXPECT_EQ(
|
||||||
|
L"[42] something happened", fmt::vsprintf(L"[%d] %s happened", args2));
|
||||||
|
// the older gcc versions can't cast the return value
|
||||||
|
#if !defined(__GNUC__) || (__GNUC__ > 4)
|
||||||
|
EXPECT_EQ(
|
||||||
|
L"[42] something happened",
|
||||||
|
fmt::vsprintf(
|
||||||
|
L"[%d] %s happened", fmt::make_wprintf_args(42, L"something")));
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user