diff --git a/format.cc b/format.cc index 5103c61f..6dd52b87 100644 --- a/format.cc +++ b/format.cc @@ -930,10 +930,8 @@ unsigned fmt::internal::PrintfFormatter::parse_header( template void fmt::internal::PrintfFormatter::format( - BasicWriter &writer, BasicCStringRef format_str, - const ArgList &args) { + BasicWriter &writer, BasicCStringRef format_str) { const Char *start = format_str.c_str(); - set_args(args); const Char *s = start; while (*s) { Char c = *s++; @@ -1199,11 +1197,9 @@ const Char *fmt::BasicFormatter::format( } template -void fmt::BasicFormatter::format( - BasicCStringRef format_str, const ArgList &args) { +void fmt::BasicFormatter::format(BasicCStringRef format_str) { const Char *s = format_str.c_str(); const Char *start = s; - set_args(args); while (*s) { Char c = *s++; if (c != '{' && c != '}') continue; @@ -1275,11 +1271,10 @@ template void fmt::internal::FixedBuffer::grow(std::size_t); template const char *fmt::BasicFormatter::format( const char *&format_str, const fmt::internal::Arg &arg); -template void fmt::BasicFormatter::format( - CStringRef format, const ArgList &args); +template void fmt::BasicFormatter::format(CStringRef format); template void fmt::internal::PrintfFormatter::format( - BasicWriter &writer, CStringRef format, const ArgList &args); + BasicWriter &writer, CStringRef format); template int fmt::internal::CharTraits::format_float( char *buffer, std::size_t size, const char *format, @@ -1297,11 +1292,10 @@ template const wchar_t *fmt::BasicFormatter::format( const wchar_t *&format_str, const fmt::internal::Arg &arg); template void fmt::BasicFormatter::format( - BasicCStringRef format, const ArgList &args); + BasicCStringRef format); template void fmt::internal::PrintfFormatter::format( - BasicWriter &writer, WCStringRef format, - const ArgList &args); + BasicWriter &writer, WCStringRef format); template int fmt::internal::CharTraits::format_float( wchar_t *buffer, std::size_t size, const wchar_t *format, diff --git a/format.h b/format.h index 9208b7e9..a7c2389b 100644 --- a/format.h +++ b/format.h @@ -1280,7 +1280,7 @@ class FormatterBase { protected: const ArgList &args() const { return args_; } - void set_args(const ArgList &args) { + explicit FormatterBase(const ArgList &args) { args_ = args; next_arg_index_ = 0; } @@ -1316,8 +1316,8 @@ class PrintfFormatter : private FormatterBase { unsigned parse_header(const Char *&s, FormatSpec &spec); public: - void format(BasicWriter &writer, - BasicCStringRef format_str, const ArgList &args); + explicit PrintfFormatter(const ArgList &args) : FormatterBase(args) {} + void format(BasicWriter &writer, BasicCStringRef format_str); }; } // namespace internal @@ -1343,11 +1343,12 @@ class BasicFormatter : private internal::FormatterBase { internal::Arg parse_arg_name(const Char *&s); public: - explicit BasicFormatter(BasicWriter &w) : writer_(w) {} + BasicFormatter(const ArgList &args, BasicWriter &w) + : FormatterBase(args), writer_(w) {} BasicWriter &writer() { return writer_; } - void format(BasicCStringRef format_str, const ArgList &args); + void format(BasicCStringRef format_str); const Char *format(const Char *&format_str, const internal::Arg &arg); }; @@ -1989,7 +1990,7 @@ class BasicWriter { \endrst */ void write(BasicCStringRef format, ArgList args) { - BasicFormatter(*this).format(format, args); + BasicFormatter(args, *this).format(format); } FMT_VARIADIC_VOID(write, BasicCStringRef) @@ -2665,7 +2666,7 @@ void print(std::ostream &os, CStringRef format_str, ArgList args); template void printf(BasicWriter &w, BasicCStringRef format, ArgList args) { - internal::PrintfFormatter().format(w, format, args); + internal::PrintfFormatter(args).format(w, format); } /** diff --git a/test/util-test.cc b/test/util-test.cc index be50bc5c..2173b1bf 100644 --- a/test/util-test.cc +++ b/test/util-test.cc @@ -561,7 +561,7 @@ TEST(ArgTest, MakeArg) { EXPECT_EQ(fmt::internal::Arg::CUSTOM, arg.type); EXPECT_EQ(&t, arg.custom.value); fmt::MemoryWriter w; - fmt::BasicFormatter formatter(w); + fmt::BasicFormatter formatter(fmt::ArgList(), w); const char *s = "}"; arg.custom.format(&formatter, &t, &s); EXPECT_EQ("test", w.str());