Compare commits

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