diff --git a/include/fmt/format.h b/include/fmt/format.h index 66c94a45..721520c4 100644 --- a/include/fmt/format.h +++ b/include/fmt/format.h @@ -1989,7 +1989,7 @@ void handle_dynamic_spec( /** The default argument formatter. */ template -class arg_formatter : +class arg_formatter: public internal::arg_formatter_base { private: basic_context &ctx_; @@ -1998,6 +1998,7 @@ class arg_formatter : typedef internal::arg_formatter_base Base; public: + using range = Range; using format_specs = typename Base::format_specs; /** @@ -2918,17 +2919,19 @@ typename basic_context::format_arg /** Formats arguments and writes the output to the buffer. */ template -void vformat_to(basic_buffer &buffer, basic_string_view format_str, +void vformat_to(typename ArgFormatter::range &out, + basic_string_view format_str, basic_format_args args) { using iterator = internal::null_terminating_iterator; + using range = typename ArgFormatter::range; struct handler : internal::error_handler { - handler(basic_buffer &b, basic_string_view str, + handler(range &o, basic_string_view str, basic_format_args format_args) - : buffer(b), context(b, str, format_args) {} + : out(o), context(o, str, format_args) {} void on_text(iterator begin, iterator end) { - buffer.append(pointer_from(begin), pointer_from(end)); + out.append(pointer_from(begin), pointer_from(end)); } void on_arg_id() { arg = context.next_arg(); } @@ -2946,7 +2949,7 @@ void vformat_to(basic_buffer &buffer, basic_string_view format_str, if (visit(custom_formatter(context), arg)) return; basic_format_specs specs; - visit(ArgFormatter(buffer, context, specs), arg); + visit(ArgFormatter(out, context, specs), arg); } iterator on_format_specs(iterator it) { @@ -2962,16 +2965,16 @@ void vformat_to(basic_buffer &buffer, basic_string_view format_str, if (*it != '}') on_error("missing '}' in format string"); context.advance_to(pointer_from(it)); - visit(ArgFormatter(buffer, context, specs), arg); + visit(ArgFormatter(out, context, specs), arg); return it; } - basic_buffer &buffer; + range &out; Context context; basic_arg arg; }; parse_format_string(iterator(format_str.begin(), format_str.end()), - handler(buffer, format_str, args)); + handler(out, format_str, args)); } // Casts ``p`` to ``const void*`` for pointer formatting. @@ -3004,10 +3007,6 @@ constexpr fill_spec_factory fill; constexpr format_spec_factory width; constexpr format_spec_factory type; -template -void vformat_to(basic_buffer &buffer, basic_string_view format_str, - basic_format_args args); - inline void vformat_to(buffer &buf, string_view format_str, format_args args) { vformat_to>(buf, format_str, args); } diff --git a/test/format-test.cc b/test/format-test.cc index 1c4c3c24..ef3d89a7 100644 --- a/test/format-test.cc +++ b/test/format-test.cc @@ -1482,19 +1482,20 @@ TEST(FormatTest, Enum) { EXPECT_EQ("0", fmt::format("{}", A)); } -class MockArgFormatter : public fmt::internal::arg_formatter_base { +class mock_arg_formatter : public fmt::internal::arg_formatter_base { private: MOCK_METHOD1(call, void (int value)); public: - typedef fmt::internal::arg_formatter_base Base; + using base = fmt::internal::arg_formatter_base; + using range = fmt::buffer; - MockArgFormatter(fmt::buffer &b, fmt::context &, fmt::format_specs &s) + mock_arg_formatter(fmt::buffer &b, fmt::context &, fmt::format_specs &s) : fmt::internal::arg_formatter_base(b, s) { EXPECT_CALL(*this, call(42)); } - using Base::operator(); + using base::operator(); void operator()(int value) { call(value); } @@ -1503,7 +1504,7 @@ class MockArgFormatter : public fmt::internal::arg_formatter_base { void custom_vformat(fmt::string_view format_str, fmt::format_args args) { fmt::memory_buffer buffer; - fmt::vformat_to(buffer, format_str, args); + fmt::vformat_to(buffer, format_str, args); } template