mirror of
https://github.com/fmtlib/fmt.git
synced 2024-11-07 08:31:16 +00:00
parent
a5bd3ddb28
commit
3fe49163bd
@ -185,6 +185,14 @@ class prepared_format {
|
|||||||
|
|
||||||
prepared_format() = delete;
|
prepared_format() = delete;
|
||||||
|
|
||||||
|
template <typename OutputIt>
|
||||||
|
inline OutputIt format_to(OutputIt out, const Args&... args) const {
|
||||||
|
typedef format_context_t<OutputIt, char_type> context;
|
||||||
|
typedef output_range<OutputIt, char_type> range;
|
||||||
|
format_arg_store<context, Args...> as(args...);
|
||||||
|
return this->vformat_to(range(out), basic_format_args<context>(as));
|
||||||
|
}
|
||||||
|
|
||||||
typedef buffer_context<char_type> context;
|
typedef buffer_context<char_type> context;
|
||||||
|
|
||||||
template <typename Range, typename Context>
|
template <typename Range, typename Context>
|
||||||
@ -674,17 +682,6 @@ std::basic_string<Char> format(const CompiledFormat& cf, const Args&... args) {
|
|||||||
return to_string(buffer);
|
return to_string(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename OutputIt, typename CompiledFormat, typename... Args>
|
|
||||||
OutputIt format_to(OutputIt out, const CompiledFormat& cf,
|
|
||||||
const Args&... args) {
|
|
||||||
using char_type = typename CompiledFormat::char_type;
|
|
||||||
using range = internal::output_range<OutputIt, char_type>;
|
|
||||||
using context = format_context_t<OutputIt, char_type>;
|
|
||||||
format_arg_store<context, Args...> as(args...);
|
|
||||||
return cf.template vformat_to<range, context>(
|
|
||||||
range(out), {make_format_args<context>(args...)});
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename OutputIt, typename CompiledFormat, typename... Args,
|
template <typename OutputIt, typename CompiledFormat, typename... Args,
|
||||||
FMT_ENABLE_IF(internal::is_output_iterator<OutputIt>::value)>
|
FMT_ENABLE_IF(internal::is_output_iterator<OutputIt>::value)>
|
||||||
format_to_n_result<OutputIt> format_to_n(OutputIt out, unsigned n,
|
format_to_n_result<OutputIt> format_to_n(OutputIt out, unsigned n,
|
||||||
|
@ -3368,10 +3368,11 @@ inline OutputIt vformat_to(OutputIt out, const S& format_str,
|
|||||||
fmt::format_to(std::back_inserter(out), "{}", 42);
|
fmt::format_to(std::back_inserter(out), "{}", 42);
|
||||||
\endrst
|
\endrst
|
||||||
*/
|
*/
|
||||||
template <typename OutputIt, typename S, typename... Args,
|
template <typename OutputIt, typename S, typename... Args>
|
||||||
FMT_ENABLE_IF(internal::is_output_iterator<OutputIt>::value&&
|
|
||||||
internal::is_string<S>::value)>
|
|
||||||
inline OutputIt format_to(OutputIt out, const S& format_str, Args&&... args) {
|
inline OutputIt format_to(OutputIt out, const S& format_str, Args&&... args) {
|
||||||
|
static_assert(internal::is_output_iterator<OutputIt>::value &&
|
||||||
|
internal::is_string<S>::value,
|
||||||
|
"");
|
||||||
internal::check_format_string<Args...>(format_str);
|
internal::check_format_string<Args...>(format_str);
|
||||||
using context = format_context_t<OutputIt, char_t<S>>;
|
using context = format_context_t<OutputIt, char_t<S>>;
|
||||||
return vformat_to(out, to_string_view(format_str),
|
return vformat_to(out, to_string_view(format_str),
|
||||||
|
@ -257,14 +257,16 @@ To safe_duration_cast(std::chrono::duration<FromRep, FromPeriod> from,
|
|||||||
|
|
||||||
// multiply with Factor::num without overflow or underflow
|
// multiply with Factor::num without overflow or underflow
|
||||||
if (Factor::num != 1) {
|
if (Factor::num != 1) {
|
||||||
constexpr auto max1 = std::numeric_limits<IntermediateRep>::max() /
|
constexpr auto max1 =
|
||||||
static_cast<IntermediateRep>(Factor::num);
|
std::numeric_limits<IntermediateRep>::max() /
|
||||||
|
static_cast<IntermediateRep>(Factor::num);
|
||||||
if (count > max1) {
|
if (count > max1) {
|
||||||
ec = 1;
|
ec = 1;
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
constexpr auto min1 = std::numeric_limits<IntermediateRep>::lowest() /
|
constexpr auto min1 =
|
||||||
static_cast<IntermediateRep>(Factor::num);
|
std::numeric_limits<IntermediateRep>::lowest() /
|
||||||
|
static_cast<IntermediateRep>(Factor::num);
|
||||||
if (count < min1) {
|
if (count < min1) {
|
||||||
ec = 1;
|
ec = 1;
|
||||||
return {};
|
return {};
|
||||||
|
@ -643,32 +643,32 @@ TEST(PrepareTest, PassUserTypeFormat) {
|
|||||||
TEST(PrepareTest, FormatToArrayOfChars) {
|
TEST(PrepareTest, FormatToArrayOfChars) {
|
||||||
char buffer[32] = {0};
|
char buffer[32] = {0};
|
||||||
const auto prepared = fmt::compile<int>("4{}");
|
const auto prepared = fmt::compile<int>("4{}");
|
||||||
fmt::format_to(buffer, prepared, 2);
|
prepared.format_to(buffer, 2);
|
||||||
EXPECT_EQ(std::string("42"), buffer);
|
EXPECT_EQ(std::string("42"), buffer);
|
||||||
wchar_t wbuffer[32] = {0};
|
wchar_t wbuffer[32] = {0};
|
||||||
const auto wprepared = fmt::compile<int>(L"4{}");
|
const auto wprepared = fmt::compile<int>(L"4{}");
|
||||||
fmt::format_to(wbuffer, wprepared, 2);
|
wprepared.format_to(wbuffer, 2);
|
||||||
EXPECT_EQ(std::wstring(L"42"), wbuffer);
|
EXPECT_EQ(std::wstring(L"42"), wbuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(PrepareTest, FormatToIterator) {
|
TEST(PrepareTest, FormatToIterator) {
|
||||||
std::string s(2, ' ');
|
std::string s(2, ' ');
|
||||||
const auto prepared = fmt::compile<int>("4{}");
|
const auto prepared = fmt::compile<int>("4{}");
|
||||||
fmt::format_to(s.begin(), prepared, 2);
|
prepared.format_to(s.begin(), 2);
|
||||||
EXPECT_EQ("42", s);
|
EXPECT_EQ("42", s);
|
||||||
std::wstring ws(2, L' ');
|
std::wstring ws(2, L' ');
|
||||||
const auto wprepared = fmt::compile<int>(L"4{}");
|
const auto wprepared = fmt::compile<int>(L"4{}");
|
||||||
fmt::format_to(ws.begin(), wprepared, 2);
|
wprepared.format_to(ws.begin(), 2);
|
||||||
EXPECT_EQ(L"42", ws);
|
EXPECT_EQ(L"42", ws);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(PrepareTest, FormatToBackInserter) {
|
TEST(PrepareTest, FormatToBackInserter) {
|
||||||
std::string s;
|
std::string s;
|
||||||
const auto prepared = fmt::compile<int>("4{}");
|
const auto prepared = fmt::compile<int>("4{}");
|
||||||
fmt::format_to(std::back_inserter(s), prepared, 2);
|
prepared.format_to(std::back_inserter(s), 2);
|
||||||
EXPECT_EQ("42", s);
|
EXPECT_EQ("42", s);
|
||||||
std::wstring ws;
|
std::wstring ws;
|
||||||
const auto wprepared = fmt::compile<int>(L"4{}");
|
const auto wprepared = fmt::compile<int>(L"4{}");
|
||||||
fmt::format_to(std::back_inserter(ws), wprepared, 2);
|
wprepared.format_to(std::back_inserter(ws), 2);
|
||||||
EXPECT_EQ(L"42", ws);
|
EXPECT_EQ(L"42", ws);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user