diff --git a/format.cc b/format.cc index 53f7c414..71bd1ec2 100644 --- a/format.cc +++ b/format.cc @@ -108,14 +108,14 @@ struct CharTraits { swprintf(buffer, size, format, width, precision, value); } }; -} -const char fmt::internal::DIGITS[] = +const char DIGITS[] = "0001020304050607080910111213141516171819" "2021222324252627282930313233343536373839" "4041424344454647484950515253545556575859" "6061626364656667686970717273747576777879" "8081828384858687888990919293949596979899"; +} void fmt::internal::ReportUnknownType(char code, const char *type) { if (std::isprint(static_cast(code))) { @@ -131,8 +131,9 @@ void fmt::internal::ReportUnknownType(char code, const char *type) { // Fills the padding around the content and returns the pointer to the // content area. template -typename fmt::BasicWriter::CharPtr fmt::BasicWriter::FillPadding( - CharPtr buffer, unsigned total_size, std::size_t content_size, char fill) { +typename fmt::BasicWriter::CharPtr + fmt::BasicWriter::FillPadding(CharPtr buffer, + unsigned total_size, std::size_t content_size, wchar_t fill) { std::size_t padding = total_size - content_size; std::size_t left_padding = padding / 2; std::fill_n(buffer, left_padding, fill); @@ -152,8 +153,8 @@ void fmt::BasicWriter::FormatDecimal( // "Three Optimization Tips for C++". See speed-test for a comparison. unsigned index = (value % 100) * 2; value /= 100; - buffer[num_digits] = internal::DIGITS[index + 1]; - buffer[num_digits - 1] = internal::DIGITS[index]; + buffer[num_digits] = DIGITS[index + 1]; + buffer[num_digits - 1] = DIGITS[index]; num_digits -= 2; } if (value < 10) { @@ -161,8 +162,8 @@ void fmt::BasicWriter::FormatDecimal( return; } unsigned index = static_cast(value * 2); - buffer[1] = internal::DIGITS[index + 1]; - buffer[0] = internal::DIGITS[index]; + buffer[1] = DIGITS[index + 1]; + buffer[0] = DIGITS[index]; } template @@ -651,8 +652,9 @@ template void fmt::BasicWriter::FormatDouble( template void fmt::BasicWriter::FormatDouble( long double value, const FormatSpec &spec, int precision); -template fmt::BasicWriter::CharPtr fmt::BasicWriter::FillPadding( - CharPtr buffer, unsigned total_size, std::size_t content_size, char fill); +template fmt::BasicWriter::CharPtr + fmt::BasicWriter::FillPadding(CharPtr buffer, + unsigned total_size, std::size_t content_size, wchar_t fill); template void fmt::BasicWriter::FormatDecimal( CharPtr buffer, uint64_t value, unsigned num_digits); @@ -683,8 +685,8 @@ template void fmt::BasicWriter::FormatDouble( long double value, const FormatSpec &spec, int precision); template fmt::BasicWriter::CharPtr - fmt::BasicWriter::FillPadding( - CharPtr buffer, unsigned total_size, std::size_t content_size, char fill); + fmt::BasicWriter::FillPadding(CharPtr buffer, + unsigned total_size, std::size_t content_size, wchar_t fill); template void fmt::BasicWriter::FormatDecimal( CharPtr buffer, uint64_t value, unsigned num_digits); diff --git a/format.h b/format.h index d93a2623..22815e1b 100644 --- a/format.h +++ b/format.h @@ -169,8 +169,6 @@ struct IsLongDouble { enum {VALUE = 0}; }; template <> struct IsLongDouble { enum {VALUE = 1}; }; -extern const char DIGITS[]; - void ReportUnknownType(char code, const char *type); // Returns the number of decimal digits in n. Leading zeros are not counted @@ -281,18 +279,20 @@ struct TypeSpec : Spec { struct WidthSpec { unsigned width_; - char fill_; + // Fill is always wchar_t and cast to char if necessary to avoid having + // two specialization of WidthSpec and its subclasses. + wchar_t fill_; - WidthSpec(unsigned width, char fill) : width_(width), fill_(fill) {} + WidthSpec(unsigned width, wchar_t fill) : width_(width), fill_(fill) {} unsigned width() const { return width_; } - char fill() const { return fill_; } + wchar_t fill() const { return fill_; } }; struct AlignSpec : WidthSpec { Alignment align_; - AlignSpec(unsigned width, char fill) + AlignSpec(unsigned width, wchar_t fill) : WidthSpec(width, fill), align_(ALIGN_DEFAULT) {} Alignment align() const { return align_; } @@ -300,7 +300,7 @@ struct AlignSpec : WidthSpec { template struct AlignTypeSpec : AlignSpec { - AlignTypeSpec(unsigned width, char fill) : AlignSpec(width, fill) {} + AlignTypeSpec(unsigned width, wchar_t fill) : AlignSpec(width, fill) {} bool sign_flag() const { return false; } bool plus_flag() const { return false; } @@ -313,7 +313,7 @@ struct FormatSpec : AlignSpec { unsigned flags_; char type_; - FormatSpec(unsigned width = 0, char type = 0, char fill = ' ') + FormatSpec(unsigned width = 0, char type = 0, wchar_t fill = ' ') : AlignSpec(width, fill), flags_(0), type_(type) {} Alignment align() const { return align_; } @@ -368,7 +368,7 @@ IntFormatter > hexu(int value); */ template IntFormatter > pad( - int value, unsigned width, char fill = ' '); + int value, unsigned width, wchar_t fill = ' '); #define DEFINE_INT_FORMATTERS(TYPE) \ inline IntFormatter > oct(TYPE value) { \ @@ -386,13 +386,13 @@ inline IntFormatter > hexu(TYPE value) { \ template \ inline IntFormatter > pad( \ IntFormatter > f, \ - unsigned width, char fill = ' ') { \ + unsigned width, wchar_t fill = ' ') { \ return IntFormatter >( \ f.value(), AlignTypeSpec(width, fill)); \ } \ \ inline IntFormatter > pad( \ - TYPE value, unsigned width, char fill = ' ') { \ + TYPE value, unsigned width, wchar_t fill = ' ') { \ return IntFormatter >( \ value, AlignTypeSpec<0>(width, fill)); \ } @@ -430,7 +430,7 @@ class BasicWriter { CharPtr buffer, uint64_t value, unsigned num_digits); static CharPtr FillPadding(CharPtr buffer, - unsigned total_size, std::size_t content_size, char fill); + unsigned total_size, std::size_t content_size, wchar_t fill); // Grows the buffer by n characters and returns a pointer to the newly // allocated area.