Compare commits
2
Commits
5e6ec1eff3
...
6f0e3d6063
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6f0e3d6063 | ||
|
|
3e2819cf93 |
@@ -17,16 +17,16 @@ class Builder {
|
|||||||
public:
|
public:
|
||||||
enum class Align : uint8_t {
|
enum class Align : uint8_t {
|
||||||
None,
|
None,
|
||||||
Left = 60, // '<'
|
Left = '<',
|
||||||
Right = 62, // '>'
|
Right = '>',
|
||||||
Center = 94, // '^'
|
Center = '^',
|
||||||
};
|
};
|
||||||
|
|
||||||
enum class Sign : uint8_t {
|
enum class Sign : uint8_t {
|
||||||
None,
|
None,
|
||||||
Negative = 45, // '-'
|
Negative = '-',
|
||||||
Both = 43, // '+'
|
Both = '+',
|
||||||
Space = 32, // ' '
|
Space = ' ',
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit Builder(std::stringstream& builder)
|
explicit Builder(std::stringstream& builder)
|
||||||
|
|||||||
@@ -4,8 +4,7 @@
|
|||||||
* SPDX-License-Identifier: MIT
|
* SPDX-License-Identifier: MIT
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <cstddef> // size_t
|
#include <cstdint> // uint8_t
|
||||||
#include <cstdint> // int32_t, uint32_t, int64_t,
|
|
||||||
#include <cstring> // strlen
|
#include <cstring> // strlen
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
|
|||||||
+20
-18
@@ -23,29 +23,31 @@
|
|||||||
namespace Util::Format {
|
namespace Util::Format {
|
||||||
|
|
||||||
enum class PresentationType : uint8_t {
|
enum class PresentationType : uint8_t {
|
||||||
None, // Defaults are any of: 'dgcsp', depending on the type
|
None,
|
||||||
// Interger
|
// Interger
|
||||||
Binary = 98, // 'b'
|
Binary = 'b',
|
||||||
BinaryUppercase = 66, // 'B'
|
BinaryUppercase = 'B',
|
||||||
Decimal = 100, // 'd'
|
Decimal = 'd',
|
||||||
Octal = 111, // 'o'
|
Octal = 'o',
|
||||||
Hex = 120, // 'x'
|
Hex = 'x',
|
||||||
HexUppercase = 88, // 'X'
|
HexUppercase = 'X',
|
||||||
// Floating-point
|
// Floating-point
|
||||||
Hexfloat = 97, // 'a'
|
Hexfloat = 'a',
|
||||||
HexfloatUppercase = 65, // 'A'
|
HexfloatUppercase = 'A',
|
||||||
Exponent = 101, // 'e'
|
Exponent = 'e',
|
||||||
ExponentUppercase = 69, // 'E'
|
ExponentUppercase = 'E',
|
||||||
FixedPoint = 102, // 'f'
|
FixedPoint = 'f',
|
||||||
FixedPointUppercase = 70, // 'F'
|
FixedPointUppercase = 'F',
|
||||||
General = 103, // 'g'
|
General = 'g',
|
||||||
GeneralUppercase = 71, // 'G'
|
GeneralUppercase = 'G',
|
||||||
// Character
|
// Character
|
||||||
Character = 99, // 'c'
|
Character = 'c',
|
||||||
// String
|
// String
|
||||||
String = 115, // 's'
|
String = 's',
|
||||||
// Pointer
|
// Pointer
|
||||||
Pointer = 112, // 'p'
|
Pointer = 'p',
|
||||||
|
// Container
|
||||||
|
Container = 'C',
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Specifier {
|
struct Specifier {
|
||||||
|
|||||||
@@ -320,7 +320,7 @@ constexpr void Parser::checkSpecifierCharType(const Specifier& specifier)
|
|||||||
{
|
{
|
||||||
checkSpecifierIntegralType(specifier);
|
checkSpecifierIntegralType(specifier);
|
||||||
|
|
||||||
// Valid: fill, align, width
|
// Valid: fill + align, width
|
||||||
// Invalid: sign, alternativeForm, zeroPadding, precision
|
// Invalid: sign, alternativeForm, zeroPadding, precision
|
||||||
if (specifier.type == PresentationType::None
|
if (specifier.type == PresentationType::None
|
||||||
|| specifier.type == PresentationType::Character) {
|
|| specifier.type == PresentationType::Character) {
|
||||||
@@ -342,7 +342,7 @@ constexpr void Parser::checkSpecifierCStringType(const Specifier& specifier)
|
|||||||
VERIFY(false, "invalid type specifier");
|
VERIFY(false, "invalid type specifier");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valid: fill, align, width
|
// Valid: fill + align, width
|
||||||
// Invalid: sign, alternativeForm, zeroPadding, precision
|
// Invalid: sign, alternativeForm, zeroPadding, precision
|
||||||
VERIFY(specifier.sign == Builder::Sign::None, "invalid specifier option");
|
VERIFY(specifier.sign == Builder::Sign::None, "invalid specifier option");
|
||||||
VERIFY(specifier.alternativeForm == false, "invalid specifier option");
|
VERIFY(specifier.alternativeForm == false, "invalid specifier option");
|
||||||
@@ -362,6 +362,23 @@ constexpr void Parser::checkSpecifierPointerType(const Specifier& specifier)
|
|||||||
VERIFY(specifier.type != PresentationType::String, "invalid type specifier");
|
VERIFY(specifier.type != PresentationType::String, "invalid type specifier");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
constexpr void Parser::checkSpecifierContainerType(const Specifier& specifier)
|
||||||
|
{
|
||||||
|
switch (specifier.type) {
|
||||||
|
case PresentationType::None:
|
||||||
|
case PresentationType::Container:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
VERIFY(false, "invalid type specifier");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valid: fill + align, alternativeForm, width
|
||||||
|
// Invalid: sign, zeroPadding, precision
|
||||||
|
VERIFY(specifier.sign == Builder::Sign::None, "invalid specifier option");
|
||||||
|
VERIFY(specifier.zeroPadding == false, "invalid specifier option");
|
||||||
|
VERIFY(specifier.precision == -1, "invalid specifier option");
|
||||||
|
}
|
||||||
|
|
||||||
constexpr void Parser::checkSpecifierType(const Specifier& specifier, ParameterType type)
|
constexpr void Parser::checkSpecifierType(const Specifier& specifier, ParameterType type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
@@ -384,6 +401,7 @@ constexpr void Parser::checkSpecifierType(const Specifier& specifier, ParameterT
|
|||||||
checkSpecifierPointerType(specifier);
|
checkSpecifierPointerType(specifier);
|
||||||
break;
|
break;
|
||||||
case ParameterType::Container:
|
case ParameterType::Container:
|
||||||
|
checkSpecifierContainerType(specifier);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ public:
|
|||||||
constexpr void checkSpecifierCStringType(const Specifier& specifier);
|
constexpr void checkSpecifierCStringType(const Specifier& specifier);
|
||||||
constexpr void checkSpecifierStringType(const Specifier& specifier);
|
constexpr void checkSpecifierStringType(const Specifier& specifier);
|
||||||
constexpr void checkSpecifierPointerType(const Specifier& specifier);
|
constexpr void checkSpecifierPointerType(const Specifier& specifier);
|
||||||
|
constexpr void checkSpecifierContainerType(const Specifier& specifier);
|
||||||
constexpr void checkSpecifierType(const Specifier& specifier, ParameterType type);
|
constexpr void checkSpecifierType(const Specifier& specifier, ParameterType type);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
Reference in New Issue
Block a user