Move writer to PrintfFormatter object for consistency with BasicFormatter

This commit is contained in:
Victor Zverovich
2016-07-20 08:21:13 -07:00
parent 9823675832
commit ab054532ce
3 changed files with 19 additions and 20 deletions

View File

@ -521,8 +521,7 @@ template void internal::FixedBuffer<char>::grow(std::size_t);
template void internal::ArgMap<char>::init(const ArgList &args); template void internal::ArgMap<char>::init(const ArgList &args);
template void PrintfFormatter<char>::format( template void PrintfFormatter<char>::format(CStringRef format);
BasicWriter<char> &writer, CStringRef format);
template int internal::CharTraits<char>::format_float( template int internal::CharTraits<char>::format_float(
char *buffer, std::size_t size, const char *format, char *buffer, std::size_t size, const char *format,
@ -538,8 +537,7 @@ template void internal::FixedBuffer<wchar_t>::grow(std::size_t);
template void internal::ArgMap<wchar_t>::init(const ArgList &args); template void internal::ArgMap<wchar_t>::init(const ArgList &args);
template void PrintfFormatter<wchar_t>::format( template void PrintfFormatter<wchar_t>::format(WCStringRef format);
BasicWriter<wchar_t> &writer, WCStringRef format);
template int internal::CharTraits<wchar_t>::format_float( template int internal::CharTraits<wchar_t>::format_float(
wchar_t *buffer, std::size_t size, const wchar_t *format, wchar_t *buffer, std::size_t size, const wchar_t *format,

View File

@ -255,6 +255,8 @@ template <typename Char,
typename ArgFormatter = internal::PrintfArgFormatter<Char> > typename ArgFormatter = internal::PrintfArgFormatter<Char> >
class PrintfFormatter : private internal::FormatterBase { class PrintfFormatter : private internal::FormatterBase {
private: private:
BasicWriter<Char> &writer_;
void parse_flags(FormatSpec &spec, const Char *&s); void parse_flags(FormatSpec &spec, const Char *&s);
// Returns the argument with specified index or, if arg_index is equal // Returns the argument with specified index or, if arg_index is equal
@ -269,15 +271,15 @@ class PrintfFormatter : private internal::FormatterBase {
public: public:
/** /**
\rst \rst
Constructs a ``PrintfFormatter`` object. References to the arguments Constructs a ``PrintfFormatter`` object. References to the arguments and
are stored in the formatter object so make sure they have appropriate the writer are stored in the formatter object so make sure they have
lifetimes. appropriate lifetimes.
\endrst \endrst
*/ */
explicit PrintfFormatter(const ArgList &args) : FormatterBase(args) {} explicit PrintfFormatter(const ArgList &args, BasicWriter<Char> &w)
: FormatterBase(args), writer_(w) {}
FMT_API void format(BasicWriter<Char> &writer, FMT_API void format(BasicCStringRef<Char> format_str);
BasicCStringRef<Char> format_str);
}; };
template <typename Char, typename AF> template <typename Char, typename AF>
@ -353,19 +355,18 @@ unsigned PrintfFormatter<Char, AF>::parse_header(
} }
template <typename Char, typename AF> template <typename Char, typename AF>
void PrintfFormatter<Char, AF>::format( void PrintfFormatter<Char, AF>::format(BasicCStringRef<Char> format_str) {
BasicWriter<Char> &writer, BasicCStringRef<Char> format_str) {
const Char *start = format_str.c_str(); const Char *start = format_str.c_str();
const Char *s = start; const Char *s = start;
while (*s) { while (*s) {
Char c = *s++; Char c = *s++;
if (c != '%') continue; if (c != '%') continue;
if (*s == c) { if (*s == c) {
write(writer, start, s); write(writer_, start, s);
start = ++s; start = ++s;
continue; continue;
} }
write(writer, start, s - 1); write(writer_, start, s - 1);
FormatSpec spec; FormatSpec spec;
spec.align_ = ALIGN_RIGHT; spec.align_ = ALIGN_RIGHT;
@ -448,14 +449,14 @@ void PrintfFormatter<Char, AF>::format(
start = s; start = s;
// Format argument. // Format argument.
AF(writer, spec).visit(arg); AF(writer_, spec).visit(arg);
} }
write(writer, start, s); write(writer_, start, s);
} }
template <typename Char> template <typename Char>
void printf(BasicWriter<Char> &w, BasicCStringRef<Char> format, ArgList args) { void printf(BasicWriter<Char> &w, BasicCStringRef<Char> format, ArgList args) {
PrintfFormatter<Char>(args).format(w, format); PrintfFormatter<Char>(args, w).format(format);
} }
/** /**

View File

@ -51,10 +51,10 @@ std::string custom_format(const char *format_str, fmt::ArgList args) {
} }
FMT_VARIADIC(std::string, custom_format, const char *) FMT_VARIADIC(std::string, custom_format, const char *)
std::string custom_sprintf(const char* fstr, fmt::ArgList args){ std::string custom_sprintf(const char* format_str, fmt::ArgList args){
fmt::MemoryWriter writer; fmt::MemoryWriter writer;
fmt::PrintfFormatter<char, CustomPAF> pfer( args); fmt::PrintfFormatter<char, CustomPAF> formatter(args, writer);
pfer.format(writer, fstr); formatter.format(format_str);
return writer.str(); return writer.str();
} }
FMT_VARIADIC(std::string, custom_sprintf, const char*); FMT_VARIADIC(std::string, custom_sprintf, const char*);