Util: Pass string width,align,fill option to Format::Builder

This commit is contained in:
Riyyi
2022-08-03 14:05:34 +02:00
parent 6209251ca6
commit 1b7a736be2
5 changed files with 49 additions and 12 deletions
+30
View File
@@ -14,6 +14,7 @@
#include <string_view>
#include "util/format/builder.h"
#include "util/meta/assert.h"
namespace Util::Format {
@@ -53,4 +54,33 @@ void Builder::putF64(double number, uint8_t precision) const
m_builder << string;
}
void Builder::putString(std::string_view string, size_t width, Align align, char fill) const
{
size_t length = string.length();
if (width < length) {
m_builder.write(string.data(), length);
return;
}
switch (align) {
case Align::Left:
m_builder.write(string.data(), length);
m_builder << std::string(width - length, fill);
break;
case Align::Center: {
size_t half = (width - length) / 2;
m_builder << std::string(half, fill);
m_builder.write(string.data(), length);
m_builder << std::string(width - half - length, fill);
break;
}
case Align::Right:
m_builder << std::string(width - length, fill);
m_builder.write(string.data(), length);
break;
default:
VERIFY_NOT_REACHED();
};
}
} // namespace Util::Format
+1 -1
View File
@@ -43,7 +43,7 @@ public:
void putF32(float 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 putString(const std::string_view string) const { m_builder.write(string.data(), string.length()); }
void putString(std::string_view string, size_t width = 0, Align align = Align::Left, char fill = ' ') const;
void putPointer(const void* pointer) const { m_builder << pointer; }
const std::stringstream& builder() const { return m_builder; }
+15 -8
View File
@@ -60,11 +60,11 @@ void Formatter<double>::format(Builder& builder, double value) const
{
if (specifier.precision < 0) {
builder.putF64(value);
return;
}
else {
builder.putF64(value, specifier.precision);
}
}
// Char
@@ -82,15 +82,22 @@ void Formatter<bool>::format(Builder& builder, bool value) const
// String
void Formatter<const char*>::format(Builder& builder, const char* value) const
{
builder.putString(value != nullptr ? std::string_view { value, strlen(value) } : "(nil)");
}
template<>
void Formatter<std::string_view>::format(Builder& builder, std::string_view value) const
{
builder.putString(value);
if (specifier.align == Builder::Align::None) {
builder.putString(value, specifier.width);
return;
}
builder.putString(value, specifier.width, specifier.align, specifier.fill);
}
void Formatter<const char*>::format(Builder& builder, const char* value) const
{
Formatter<std::string_view>::format(
builder,
value != nullptr ? std::string_view { value, strlen(value) } : "(nil)");
}
// Pointer
+1 -1
View File
@@ -54,7 +54,7 @@ struct Specifier {
bool alternativeForm = false;
bool zeroPadding = false;
int width = 0;
size_t width = 0;
int8_t precision = -1;
PresentationType type = PresentationType::None;
+1 -1
View File
@@ -274,7 +274,7 @@ void Parser::parseSpecifier(Specifier& specifier, SpecifierType type)
// We parse until after the closing '}', so take this into account
widthEnd = tell() - 1;
}
specifier.width = static_cast<int>(stringToNumber(m_input.substr(widthBegin, widthEnd - widthBegin)));
specifier.width = stringToNumber(m_input.substr(widthBegin, widthEnd - widthBegin));
}
if (precisionBegin != std::numeric_limits<size_t>::max()) {