Util: Pass string width,align,fill option to Format::Builder
This commit is contained in:
@@ -14,6 +14,7 @@
|
|||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
|
||||||
#include "util/format/builder.h"
|
#include "util/format/builder.h"
|
||||||
|
#include "util/meta/assert.h"
|
||||||
|
|
||||||
namespace Util::Format {
|
namespace Util::Format {
|
||||||
|
|
||||||
@@ -53,4 +54,33 @@ void Builder::putF64(double number, uint8_t precision) const
|
|||||||
m_builder << string;
|
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
|
} // namespace Util::Format
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public:
|
|||||||
void putF32(float number, uint8_t precision = 6) const;
|
void putF32(float number, uint8_t precision = 6) 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(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; }
|
void putPointer(const void* pointer) const { m_builder << pointer; }
|
||||||
|
|
||||||
const std::stringstream& builder() const { return m_builder; }
|
const std::stringstream& builder() const { return m_builder; }
|
||||||
|
|||||||
@@ -60,10 +60,10 @@ void Formatter<double>::format(Builder& builder, double value) const
|
|||||||
{
|
{
|
||||||
if (specifier.precision < 0) {
|
if (specifier.precision < 0) {
|
||||||
builder.putF64(value);
|
builder.putF64(value);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
builder.putF64(value, specifier.precision);
|
builder.putF64(value, specifier.precision);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Char
|
// Char
|
||||||
@@ -82,15 +82,22 @@ void Formatter<bool>::format(Builder& builder, bool value) const
|
|||||||
|
|
||||||
// String
|
// String
|
||||||
|
|
||||||
void Formatter<const char*>::format(Builder& builder, const char* value) const
|
|
||||||
{
|
|
||||||
builder.putString(value != nullptr ? std::string_view { value, strlen(value) } : "(nil)");
|
|
||||||
}
|
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
void Formatter<std::string_view>::format(Builder& builder, std::string_view value) const
|
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
|
// Pointer
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ struct Specifier {
|
|||||||
|
|
||||||
bool alternativeForm = false;
|
bool alternativeForm = false;
|
||||||
bool zeroPadding = false;
|
bool zeroPadding = false;
|
||||||
int width = 0;
|
size_t width = 0;
|
||||||
int8_t precision = -1;
|
int8_t precision = -1;
|
||||||
|
|
||||||
PresentationType type = PresentationType::None;
|
PresentationType type = PresentationType::None;
|
||||||
|
|||||||
@@ -274,7 +274,7 @@ void Parser::parseSpecifier(Specifier& specifier, SpecifierType type)
|
|||||||
// We parse until after the closing '}', so take this into account
|
// We parse until after the closing '}', so take this into account
|
||||||
widthEnd = tell() - 1;
|
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()) {
|
if (precisionBegin != std::numeric_limits<size_t>::max()) {
|
||||||
|
|||||||
Reference in New Issue
Block a user