Util: Add zero padding specifier to putU64()
This commit is contained in:
@@ -28,28 +28,36 @@ void Builder::putLiteral(std::string_view literal)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Builder::putU64(size_t value, char fill, Align align, Sign sign, size_t width, bool isNegative) const
|
void Builder::putU64(size_t value, char fill, Align align, Sign sign, bool zeroPadding, size_t width, bool isNegative) const
|
||||||
{
|
{
|
||||||
std::string string = (std::stringstream {} << value).str();
|
std::string string = (std::stringstream {} << value).str();
|
||||||
|
|
||||||
printf("sign {%c}\n", (char)sign);
|
|
||||||
// Sign
|
// Sign
|
||||||
|
std::string signCharacter = "";
|
||||||
switch (sign) {
|
switch (sign) {
|
||||||
case Sign::None:
|
case Sign::None:
|
||||||
case Sign::Negative:
|
case Sign::Negative:
|
||||||
if (isNegative) {
|
if (isNegative) {
|
||||||
string.insert(0, 1, '-');
|
signCharacter = '-';
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Sign::Both:
|
case Sign::Both:
|
||||||
string.insert(0, 1, (isNegative) ? '-' : '+');
|
signCharacter = (isNegative) ? '-' : '+';
|
||||||
break;
|
break;
|
||||||
case Sign::Space:
|
case Sign::Space:
|
||||||
string.insert(0, 1, (isNegative) ? '-' : ' ');
|
signCharacter = (isNegative) ? '-' : ' ';
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
};
|
};
|
||||||
|
if (align != Align::None || !zeroPadding) {
|
||||||
|
string.insert(0, signCharacter);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Zero padding
|
||||||
|
if (zeroPadding) {
|
||||||
|
fill = '0';
|
||||||
|
}
|
||||||
|
|
||||||
size_t length = string.length();
|
size_t length = string.length();
|
||||||
if (width < length) {
|
if (width < length) {
|
||||||
@@ -69,21 +77,30 @@ void Builder::putU64(size_t value, char fill, Align align, Sign sign, size_t wid
|
|||||||
m_builder << std::string(width - half - length, fill);
|
m_builder << std::string(width - half - length, fill);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Align::None:
|
|
||||||
case Align::Right:
|
case Align::Right:
|
||||||
m_builder << std::string(width - length, fill);
|
m_builder << std::string(width - length, fill);
|
||||||
m_builder.write(string.data(), length);
|
m_builder.write(string.data(), length);
|
||||||
break;
|
break;
|
||||||
|
case Align::None:
|
||||||
|
if (zeroPadding) {
|
||||||
|
m_builder << signCharacter;
|
||||||
|
if (signCharacter.empty()) {
|
||||||
|
m_builder << '0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m_builder << std::string(width - length - zeroPadding, fill);
|
||||||
|
m_builder.write(string.data(), length);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void Builder::putI64(int64_t value, char fill, Align align, Sign sign, size_t width) const
|
void Builder::putI64(int64_t value, char fill, Align align, Sign sign, bool zeroPadding, size_t width) const
|
||||||
{
|
{
|
||||||
bool isNegative = value < 0;
|
bool isNegative = value < 0;
|
||||||
value = isNegative ? -value : value;
|
value = isNegative ? -value : value;
|
||||||
putU64(static_cast<uint64_t>(value), fill, align, sign, width, isNegative);
|
putU64(static_cast<uint64_t>(value), fill, align, sign, zeroPadding, width, isNegative);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Builder::putF64(double number, uint8_t precision) const
|
void Builder::putF64(double number, uint8_t precision) const
|
||||||
|
|||||||
@@ -36,8 +36,8 @@ public:
|
|||||||
|
|
||||||
void putLiteral(std::string_view literal);
|
void putLiteral(std::string_view literal);
|
||||||
|
|
||||||
void putU64(size_t value, char fill = ' ', Align align = Align::Right, Sign sign = Sign::Negative, size_t width = 0, bool isNegative = false) const;
|
void putU64(size_t value, char fill = ' ', Align align = Align::Right, Sign sign = Sign::Negative, bool zeroPadding = false, size_t width = 0, bool isNegative = false) const;
|
||||||
void putI64(int64_t value, char fill = ' ', Align align = Align::Right, Sign sign = Sign::Negative, size_t width = 0) const;
|
void putI64(int64_t value, char fill = ' ', Align align = Align::Right, Sign sign = Sign::Negative, bool zeroPadding = false, size_t width = 0) const;
|
||||||
void putF64(double number, uint8_t precision = 6) const;
|
void putF64(double number, uint8_t precision = 6) const;
|
||||||
void putCharacter(char character) const { m_builder.write(&character, 1); }
|
void putCharacter(char character) const { m_builder.write(&character, 1); }
|
||||||
void putString(std::string_view string, char fill = ' ', Align align = Align::Left, size_t width = 0) const;
|
void putString(std::string_view string, char fill = ' ', Align align = Align::Left, size_t width = 0) const;
|
||||||
|
|||||||
@@ -93,11 +93,13 @@ struct Formatter<T> {
|
|||||||
{
|
{
|
||||||
if (std::is_signed_v<T>) {
|
if (std::is_signed_v<T>) {
|
||||||
builder.putI64(
|
builder.putI64(
|
||||||
value, specifier.fill, specifier.align, specifier.sign, specifier.width);
|
value, specifier.fill, specifier.align, specifier.sign,
|
||||||
|
specifier.zeroPadding, specifier.width);
|
||||||
}
|
}
|
||||||
if (std::is_unsigned_v<T>) {
|
if (std::is_unsigned_v<T>) {
|
||||||
builder.putU64(
|
builder.putU64(
|
||||||
value, specifier.fill, specifier.align, specifier.sign, specifier.width);
|
value, specifier.fill, specifier.align, specifier.sign,
|
||||||
|
specifier.zeroPadding, specifier.width);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user