summaryrefslogtreecommitdiff
path: root/absl/strings/internal/str_format
diff options
context:
space:
mode:
Diffstat (limited to 'absl/strings/internal/str_format')
-rw-r--r--absl/strings/internal/str_format/checker.h125
1 files changed, 78 insertions, 47 deletions
diff --git a/absl/strings/internal/str_format/checker.h b/absl/strings/internal/str_format/checker.h
index 4fd19d13..216742dd 100644
--- a/absl/strings/internal/str_format/checker.h
+++ b/absl/strings/internal/str_format/checker.h
@@ -82,9 +82,11 @@ constexpr string_view ConsumeFront(string_view str, size_t len = 1) {
}
constexpr string_view ConsumeAnyOf(string_view format, const char* chars) {
- return ContainsChar(chars, GetChar(format, 0))
- ? ConsumeAnyOf(ConsumeFront(format), chars)
- : format;
+ if (ContainsChar(chars, GetChar(format, 0))) {
+ return ConsumeAnyOf(ConsumeFront(format), chars);
+ } else {
+ return format;
+ }
}
constexpr bool IsDigit(char c) { return c >= '0' && c <= '9'; }
@@ -98,16 +100,21 @@ struct Integer {
// If the next character is a '$', consume it.
// Otherwise, make `this` an invalid positional argument.
constexpr Integer ConsumePositionalDollar() const {
- return GetChar(format, 0) == '$' ? Integer{ConsumeFront(format), value}
- : Integer{format, 0};
+ if (GetChar(format, 0) == '$') {
+ return Integer{ConsumeFront(format), value};
+ } else {
+ return Integer{format, 0};
+ }
}
};
constexpr Integer ParseDigits(string_view format, int value = 0) {
- return IsDigit(GetChar(format, 0))
- ? ParseDigits(ConsumeFront(format),
- 10 * value + GetChar(format, 0) - '0')
- : Integer{format, value};
+ if (IsDigit(GetChar(format, 0))) {
+ return ParseDigits(ConsumeFront(format),
+ 10 * value + GetChar(format, 0) - '0');
+ } else {
+ return Integer{format, value};
+ }
}
// Parse digits for a positional argument.
@@ -163,30 +170,36 @@ class ConvParser {
// If it is '*', we verify that it matches `args_`. `error_` is set if it
// doesn't match.
constexpr ConvParser ParseWidth() const {
- return IsDigit(GetChar(format_, 0))
- ? SetFormat(ParseDigits(format_).format)
- : GetChar(format_, 0) == '*'
- ? is_positional_
- ? VerifyPositional(
- ParsePositional(ConsumeFront(format_)), '*')
- : SetFormat(ConsumeFront(format_))
- .ConsumeNextArg('*')
- : *this;
+ char first_char = GetChar(format_, 0);
+
+ if (IsDigit(first_char)) {
+ return SetFormat(ParseDigits(format_).format);
+ } else if (first_char == '*') {
+ if (is_positional_) {
+ return VerifyPositional(ParsePositional(ConsumeFront(format_)), '*');
+ } else {
+ return SetFormat(ConsumeFront(format_)).ConsumeNextArg('*');
+ }
+ } else {
+ return *this;
+ }
}
// Consume the precision.
// If it is '*', we verify that it matches `args_`. `error_` is set if it
// doesn't match.
constexpr ConvParser ParsePrecision() const {
- return GetChar(format_, 0) != '.'
- ? *this
- : GetChar(format_, 1) == '*'
- ? is_positional_
- ? VerifyPositional(
- ParsePositional(ConsumeFront(format_, 2)), '*')
- : SetFormat(ConsumeFront(format_, 2))
- .ConsumeNextArg('*')
- : SetFormat(ParseDigits(ConsumeFront(format_)).format);
+ if (GetChar(format_, 0) != '.') {
+ return *this;
+ } else if (GetChar(format_, 1) == '*') {
+ if (is_positional_) {
+ return VerifyPositional(ParsePositional(ConsumeFront(format_, 2)), '*');
+ } else {
+ return SetFormat(ConsumeFront(format_, 2)).ConsumeNextArg('*');
+ }
+ } else {
+ return SetFormat(ParseDigits(ConsumeFront(format_)).format);
+ }
}
// Consume the length characters.
@@ -197,11 +210,14 @@ class ConvParser {
// Consume the conversion character and verify that it matches `args_`.
// `error_` is set if it doesn't match.
constexpr ConvParser ParseConversion() const {
- return is_positional_
- ? VerifyPositional({ConsumeFront(format_), arg_position_},
- GetChar(format_, 0))
- : ConsumeNextArg(GetChar(format_, 0))
- .SetFormat(ConsumeFront(format_));
+ char first_char = GetChar(format_, 0);
+
+ if (is_positional_) {
+ return VerifyPositional({ConsumeFront(format_), arg_position_},
+ first_char);
+ } else {
+ return ConsumeNextArg(first_char).SetFormat(ConsumeFront(format_));
+ }
}
constexpr ConvParser(string_view format, ConvList args, bool error,
@@ -224,8 +240,13 @@ class ConvParser {
// `format()` will be set to the character after the conversion character.
// `error()` will be set if any of the arguments do not match.
constexpr ConvParser Run() const {
- return (is_positional_ ? ParseArgPosition(ParsePositional(format_)) : *this)
- .ParseFlags()
+ ConvParser parser = *this;
+
+ if (is_positional_) {
+ parser = ParseArgPosition(ParsePositional(format_));
+ }
+
+ return parser.ParseFlags()
.ParseWidth()
.ParsePrecision()
.ParseLength()
@@ -264,27 +285,37 @@ class FormatParser {
// This increases the limit from 512 to ~512*limit.
static constexpr string_view ConsumeNonPercentInner(string_view format,
int limit = 20) {
- return FoundPercent(format) || !limit
- ? format
- : ConsumeNonPercentInner(
- ConsumeFront(format, GetChar(format, 0) == '%' &&
- GetChar(format, 1) == '%'
- ? 2
- : 1),
- limit - 1);
+ if (FoundPercent(format) || !limit) {
+ return format;
+ } else {
+ size_t len = 0;
+
+ if (GetChar(format, 0) == '%' && GetChar(format, 1) == '%') {
+ len = 2;
+ } else {
+ len = 1;
+ }
+
+ return ConsumeNonPercentInner(ConsumeFront(format, len), limit - 1);
+ }
}
// Consume characters until the next conversion spec %.
// It skips %%.
static constexpr string_view ConsumeNonPercent(string_view format) {
- return FoundPercent(format)
- ? format
- : ConsumeNonPercent(ConsumeNonPercentInner(format));
+ if (FoundPercent(format)) {
+ return format;
+ } else {
+ return ConsumeNonPercent(ConsumeNonPercentInner(format));
+ }
}
static constexpr bool IsPositional(string_view format) {
- return IsDigit(GetChar(format, 0)) ? IsPositional(ConsumeFront(format))
- : GetChar(format, 0) == '$';
+ if (IsDigit(GetChar(format, 0))) {
+ return IsPositional(ConsumeFront(format));
+ } else {
+ return GetChar(format, 0) == '$';
+ }
}
constexpr bool RunImpl(bool is_positional) const {