Optimize format string parsing
This commit is contained in:
20
test/format
20
test/format
@@ -596,23 +596,20 @@ struct format_handler : detail::error_handler {
|
||||
context.advance_to(out);
|
||||
}
|
||||
|
||||
void on_arg_id() {
|
||||
arg = context.arg(parse_ctx.next_arg_id());
|
||||
}
|
||||
void on_arg_id(unsigned id) {
|
||||
parse_ctx.check_arg_id(id);
|
||||
arg = context.arg(id);
|
||||
}
|
||||
void on_arg_id(fmt::basic_string_view<Char>) {}
|
||||
int on_arg_id() { return parse_ctx.next_arg_id(); }
|
||||
int on_arg_id(unsigned id) { return parse_ctx.check_arg_id(id), id; }
|
||||
int on_arg_id(fmt::basic_string_view<Char>) { return 0; }
|
||||
|
||||
void on_replacement_field(const Char* p) {
|
||||
parse_ctx.advance_to(parse_ctx.begin() + (p - &*parse_ctx.begin()));
|
||||
void on_replacement_field(int id, const Char* p) {
|
||||
auto arg = context.arg(id);
|
||||
parse_ctx.advance_to(parse_ctx.begin() + (p - &*parse_ctx.begin()));
|
||||
custom_formatter<Context> f(parse_ctx, context);
|
||||
if (!visit_format_arg(f, arg))
|
||||
context.advance_to(visit_format_arg(ArgFormatter(context, &parse_ctx), arg));
|
||||
}
|
||||
|
||||
const Char* on_format_specs(const Char* begin, const Char* end) {
|
||||
const Char* on_format_specs(int id, const Char* begin, const Char* end) {
|
||||
auto arg = context.arg(id);
|
||||
parse_ctx.advance_to(parse_ctx.begin() + (begin - &*parse_ctx.begin()));
|
||||
custom_formatter<Context> f(parse_ctx, context);
|
||||
if (visit_format_arg(f, arg)) return &*parse_ctx.begin();
|
||||
@@ -630,7 +627,6 @@ struct format_handler : detail::error_handler {
|
||||
|
||||
basic_format_parse_context<Char> parse_ctx;
|
||||
Context context;
|
||||
basic_format_arg<Context> arg;
|
||||
};
|
||||
|
||||
template <typename T, typename Char>
|
||||
|
||||
@@ -2223,13 +2223,14 @@ TEST(FormatTest, ConstexprSpecsChecker) {
|
||||
struct test_format_string_handler {
|
||||
FMT_CONSTEXPR void on_text(const char*, const char*) {}
|
||||
|
||||
FMT_CONSTEXPR void on_arg_id() {}
|
||||
FMT_CONSTEXPR int on_arg_id() { return 0; }
|
||||
|
||||
template <typename T> FMT_CONSTEXPR void on_arg_id(T) {}
|
||||
template <typename T> FMT_CONSTEXPR int on_arg_id(T) { return 0; }
|
||||
|
||||
FMT_CONSTEXPR void on_replacement_field(const char*) {}
|
||||
FMT_CONSTEXPR void on_replacement_field(int, const char*) {}
|
||||
|
||||
FMT_CONSTEXPR const char* on_format_specs(const char* begin, const char*) {
|
||||
FMT_CONSTEXPR const char* on_format_specs(int, const char* begin,
|
||||
const char*) {
|
||||
return begin;
|
||||
}
|
||||
|
||||
|
||||
11
test/scan.h
11
test/scan.h
@@ -169,14 +169,15 @@ struct scan_handler : error_handler {
|
||||
scan_ctx_.advance_to(it + size);
|
||||
}
|
||||
|
||||
void on_arg_id() { on_arg_id(next_arg_id_++); }
|
||||
void on_arg_id(int id) {
|
||||
int on_arg_id() { return on_arg_id(next_arg_id_++); }
|
||||
int on_arg_id(int id) {
|
||||
if (id >= args_.size) on_error("argument index out of range");
|
||||
arg_ = args_.data[id];
|
||||
return id;
|
||||
}
|
||||
void on_arg_id(string_view) { on_error("invalid format"); }
|
||||
int on_arg_id(string_view) { return on_error("invalid format"), 0; }
|
||||
|
||||
void on_replacement_field(const char*) {
|
||||
void on_replacement_field(int, const char*) {
|
||||
auto it = scan_ctx_.begin(), end = scan_ctx_.end();
|
||||
switch (arg_.type) {
|
||||
case scan_type::int_type:
|
||||
@@ -208,7 +209,7 @@ struct scan_handler : error_handler {
|
||||
}
|
||||
}
|
||||
|
||||
const char* on_format_specs(const char* begin, const char*) {
|
||||
const char* on_format_specs(int, const char* begin, const char*) {
|
||||
if (arg_.type != scan_type::custom_type) return begin;
|
||||
parse_ctx_.advance_to(begin);
|
||||
arg_.custom.scan(arg_.custom.value, parse_ctx_, scan_ctx_);
|
||||
|
||||
Reference in New Issue
Block a user