Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
F
fmt
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
fmt
Commits
5614289d
Commit
5614289d
authored
6 years ago
by
Victor Zverovich
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Optimize and simplify format string parsing
parent
10c7f893
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
12 additions
and
24 deletions
+12
-24
include/fmt/format.h
include/fmt/format.h
+12
-24
No files found.
include/fmt/format.h
View file @
5614289d
...
...
@@ -2124,34 +2124,27 @@ FMT_CONSTEXPR void parse_format_string(
basic_string_view
<
Char
>
format_str
,
Handler
&&
handler
)
{
struct
writer
{
FMT_CONSTEXPR
void
operator
()(
const
Char
*
begin
,
const
Char
*
end
)
{
if
(
begin
==
end
)
return
;
for
(;;)
{
const
Char
*
p
=
FMT_NULL
;
if
(
!
find
<
IS_CONSTEXPR
>
(
begin
,
end
,
'}'
,
p
))
{
handler_
.
on_text
(
begin
,
end
);
return
;
}
if
(
!
find
<
IS_CONSTEXPR
>
(
begin
,
end
,
'}'
,
p
))
return
handler_
.
on_text
(
begin
,
end
);
++
p
;
if
(
p
==
end
||
*
p
!=
'}'
)
{
handler_
.
on_error
(
"unmatched '}' in format string"
);
return
;
}
if
(
p
==
end
||
*
p
!=
'}'
)
return
handler_
.
on_error
(
"unmatched '}' in format string"
);
handler_
.
on_text
(
begin
,
p
);
begin
=
p
+
1
;
}
}
Handler
&
handler_
;
}
write
{
handler
};
auto
begin
=
format_str
.
data
();
auto
end
=
begin
+
format_str
.
size
();
auto
begin
=
format_str
.
data
(),
end
=
begin
+
format_str
.
size
();
for
(;;)
{
// Doing two passes with memchr (one for '{' and another for '}') is up to
// 2.5x faster than the naive one-pass implementation on big format strings.
const
Char
*
p
=
FMT_NULL
;
if
(
!
find
<
IS_CONSTEXPR
>
(
begin
,
end
,
'{'
,
p
))
{
if
(
begin
!=
end
)
write
(
begin
,
end
);
return
;
}
if
(
!
find
<
IS_CONSTEXPR
>
(
begin
,
end
,
'{'
,
p
))
return
write
(
begin
,
end
);
write
(
begin
,
p
);
++
p
;
if
(
p
!=
end
&&
*
p
==
'{'
)
{
...
...
@@ -2159,7 +2152,6 @@ FMT_CONSTEXPR void parse_format_string(
begin
=
p
+
1
;
continue
;
}
internal
::
null_terminating_iterator
<
Char
>
it
(
p
,
end
);
it
=
parse_arg_id
(
it
,
id_adapter
<
Handler
,
Char
>
(
handler
));
if
(
*
it
==
'}'
)
{
...
...
@@ -2167,17 +2159,13 @@ FMT_CONSTEXPR void parse_format_string(
}
else
if
(
*
it
==
':'
)
{
++
it
;
it
=
handler
.
on_format_specs
(
it
);
if
(
*
it
!=
'}'
)
{
handler
.
on_error
(
"unknown format specifier"
);
return
;
}
if
(
*
it
!=
'}'
)
return
handler
.
on_error
(
"unknown format specifier"
);
}
else
{
handler
.
on_error
(
"missing '}' in format string"
);
return
;
return
handler
.
on_error
(
"missing '}' in format string"
);
}
begin
=
pointer_from
(
it
)
+
1
;
if
(
begin
==
end
)
return
;
if
(
begin
==
end
)
return
;
}
}
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment