Skip to content

Commit b86148e

Browse files
authored
perf: optimize ada::can_parse more (#690)
1 parent 71dc9ee commit b86148e

File tree

1 file changed

+41
-34
lines changed

1 file changed

+41
-34
lines changed

src/parser.cpp

Lines changed: 41 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ result_type parse_url_impl(std::string_view user_input,
4848
if (!url.is_valid) {
4949
return url;
5050
}
51-
if constexpr (result_type_is_ada_url_aggregator) {
51+
if constexpr (result_type_is_ada_url_aggregator && store_values) {
5252
// Most of the time, we just need user_input.size().
5353
// In some instances, we may need a bit more.
5454
///////////////////////////
@@ -65,9 +65,6 @@ result_type parse_url_impl(std::string_view user_input,
6565
helpers::leading_zeroes(uint32_t(1 | user_input.size()))) +
6666
1;
6767
url.reserve(reserve_capacity);
68-
//
69-
//
70-
//
7168
}
7269
std::string tmp_buffer;
7370
std::string_view internal_input;
@@ -290,32 +287,36 @@ result_type parse_url_impl(std::string_view user_input,
290287
password_token_seen =
291288
password_token_location != std::string_view::npos;
292289

293-
if (!password_token_seen) {
294-
if constexpr (result_type_is_ada_url) {
295-
url.username += unicode::percent_encode(
296-
authority_view, character_sets::USERINFO_PERCENT_ENCODE);
297-
} else {
298-
url.append_base_username(unicode::percent_encode(
299-
authority_view, character_sets::USERINFO_PERCENT_ENCODE));
300-
}
301-
} else {
302-
if constexpr (result_type_is_ada_url) {
303-
url.username += unicode::percent_encode(
304-
authority_view.substr(0, password_token_location),
305-
character_sets::USERINFO_PERCENT_ENCODE);
306-
url.password += unicode::percent_encode(
307-
authority_view.substr(password_token_location + 1),
308-
character_sets::USERINFO_PERCENT_ENCODE);
290+
if constexpr (store_values) {
291+
if (!password_token_seen) {
292+
if constexpr (result_type_is_ada_url) {
293+
url.username += unicode::percent_encode(
294+
authority_view,
295+
character_sets::USERINFO_PERCENT_ENCODE);
296+
} else {
297+
url.append_base_username(unicode::percent_encode(
298+
authority_view,
299+
character_sets::USERINFO_PERCENT_ENCODE));
300+
}
309301
} else {
310-
url.append_base_username(unicode::percent_encode(
311-
authority_view.substr(0, password_token_location),
312-
character_sets::USERINFO_PERCENT_ENCODE));
313-
url.append_base_password(unicode::percent_encode(
314-
authority_view.substr(password_token_location + 1),
315-
character_sets::USERINFO_PERCENT_ENCODE));
302+
if constexpr (result_type_is_ada_url) {
303+
url.username += unicode::percent_encode(
304+
authority_view.substr(0, password_token_location),
305+
character_sets::USERINFO_PERCENT_ENCODE);
306+
url.password += unicode::percent_encode(
307+
authority_view.substr(password_token_location + 1),
308+
character_sets::USERINFO_PERCENT_ENCODE);
309+
} else {
310+
url.append_base_username(unicode::percent_encode(
311+
authority_view.substr(0, password_token_location),
312+
character_sets::USERINFO_PERCENT_ENCODE));
313+
url.append_base_password(unicode::percent_encode(
314+
authority_view.substr(password_token_location + 1),
315+
character_sets::USERINFO_PERCENT_ENCODE));
316+
}
316317
}
317318
}
318-
} else {
319+
} else if constexpr (store_values) {
319320
if constexpr (result_type_is_ada_url) {
320321
url.password += unicode::percent_encode(
321322
authority_view, character_sets::USERINFO_PERCENT_ENCODE);
@@ -342,8 +343,10 @@ result_type parse_url_impl(std::string_view user_input,
342343
break;
343344
}
344345
if (end_of_authority == input_size) {
345-
if (fragment.has_value()) {
346-
url.update_unencoded_base_hash(*fragment);
346+
if constexpr (store_values) {
347+
if (fragment.has_value()) {
348+
url.update_unencoded_base_hash(*fragment);
349+
}
347350
}
348351
return url;
349352
}
@@ -658,9 +661,11 @@ result_type parse_url_impl(std::string_view user_input,
658661
// Optimization: Avoiding going into PATH state improves the
659662
// performance of urls ending with /.
660663
if (input_position == input_size) {
661-
url.update_base_pathname("/");
662-
if (fragment.has_value()) {
663-
url.update_unencoded_base_hash(*fragment);
664+
if constexpr (store_values) {
665+
url.update_base_pathname("/");
666+
if (fragment.has_value()) {
667+
url.update_unencoded_base_hash(*fragment);
668+
}
664669
}
665670
return url;
666671
}
@@ -906,8 +911,10 @@ result_type parse_url_impl(std::string_view user_input,
906911
ada::unreachable();
907912
}
908913
}
909-
if (fragment.has_value()) {
910-
url.update_unencoded_base_hash(*fragment);
914+
if constexpr (store_values) {
915+
if (fragment.has_value()) {
916+
url.update_unencoded_base_hash(*fragment);
917+
}
911918
}
912919
return url;
913920
}

0 commit comments

Comments
 (0)