Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
cleaner
  • Loading branch information
lemire authored and anonrig committed Jan 22, 2025
commit 969d2ea84d2e8a08f2cceb15f2e2002750e3f3d7
6 changes: 3 additions & 3 deletions include/ada/implementation.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ bool can_parse(std::string_view input,
* use ada::url_pattern_regex::std_regex_provider
* @return url_pattern instance
*/
template <class regex_provider = ada::url_pattern_regex::std_regex_provider, class regex_type = std::regex>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
ada_warn_unused tl::expected<url_pattern<regex_provider, regex_type>, errors>
template <url_pattern_regex::regex_concept regex_provider =
ada::url_pattern_regex::std_regex_provider>
ada_warn_unused tl::expected<url_pattern<regex_provider>, errors>
parse_url_pattern(std::variant<std::string_view, url_pattern_init> input,
const std::string_view* base_url = nullptr,
const url_pattern_options* options = nullptr,
Expand Down
15 changes: 6 additions & 9 deletions include/ada/parser.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@
namespace ada {
struct url_aggregator;
struct url;
template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
template <url_pattern_regex::regex_concept regex_provider>
class url_pattern;
struct url_pattern_options;
struct url_pattern_init;
Expand Down Expand Up @@ -54,13 +53,11 @@ extern template url_aggregator parse_url_impl<url_aggregator>(
extern template url parse_url_impl<url>(std::string_view user_input,
const url* base_url);

template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
tl::expected<url_pattern<regex_provider, regex_type>, errors>
parse_url_pattern_impl(std::variant<std::string_view, url_pattern_init> input,
const std::string_view* base_url,
const url_pattern_options* options,
regex_provider&& provider);
template <url_pattern_regex::regex_concept regex_provider>
tl::expected<url_pattern<regex_provider>, errors> parse_url_pattern_impl(
std::variant<std::string_view, url_pattern_init> input,
const std::string_view* base_url, const url_pattern_options* options,
regex_provider&& provider);

} // namespace ada::parser

Expand Down
6 changes: 2 additions & 4 deletions include/ada/url_aggregator.h
Original file line number Diff line number Diff line change
Expand Up @@ -222,10 +222,8 @@ struct url_aggregator : url_base {
friend url_aggregator parser::parse_url_impl<url_aggregator, false>(
std::string_view, const url_aggregator *);
// url_pattern methods
template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider,
regex_type>
friend tl::expected<url_pattern<regex_provider, regex_type>, errors>
template <url_pattern_regex::regex_concept regex_provider>
friend tl::expected<url_pattern<regex_provider>, errors>
parse_url_pattern_impl(std::variant<std::string_view, url_pattern_init> input,
const std::string_view *base_url,
const url_pattern_options *options);
Expand Down
70 changes: 28 additions & 42 deletions include/ada/url_pattern-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,8 @@ inline bool url_pattern_component_result::operator==(
return input == other.input && groups == other.groups;
}

template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
std::string url_pattern_component<regex_provider, regex_type>::to_string()
const {
template <url_pattern_regex::regex_concept regex_provider>
std::string url_pattern_component<regex_provider>::to_string() const {
#ifdef ADA_HAS_FORMAT
return std::format(R"({{"pattern": "{}", "has_regexp_groups": {}}})", pattern,
has_regexp_groups ? "true" : "false" //,
Expand All @@ -37,11 +35,10 @@ std::string url_pattern_component<regex_provider, regex_type>::to_string()
#endif
}

template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
url_pattern_component_result url_pattern_component<regex_provider, regex_type>::
create_component_match_result(std::string_view input,
const std::smatch& exec_result) {
template <url_pattern_regex::regex_concept regex_provider>
url_pattern_component_result
url_pattern_component<regex_provider>::create_component_match_result(
std::string_view input, const std::smatch& exec_result) {
// Let result be a new URLPatternComponentResult.
// Set result["input"] to input.
// Let groups be a record<USVString, (USVString or undefined)>.
Expand Down Expand Up @@ -75,9 +72,8 @@ url_pattern_component_result url_pattern_component<regex_provider, regex_type>::
return result;
}

template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
std::string url_pattern<regex_provider, regex_type>::to_string() const {
template <url_pattern_regex::regex_concept regex_provider>
std::string url_pattern<regex_provider>::to_string() const {
#ifdef ADA_HAS_FORMAT
return std::format(
R"({{"protocol_component": "{}", "username_component": {}, "password_component": {}, "hostname_component": {}, "port_component": {}, "pathname_component": {}, "search_component": {}, "hash_component": {}, "ignore_case": {}}})",
Expand All @@ -91,70 +87,60 @@ std::string url_pattern<regex_provider, regex_type>::to_string() const {
#endif
}

template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
std::string_view url_pattern<regex_provider, regex_type>::get_protocol() const
template <url_pattern_regex::regex_concept regex_provider>
std::string_view url_pattern<regex_provider>::get_protocol() const
ada_lifetime_bound {
// Return this's associated URL pattern's protocol component's pattern string.
return protocol_component.pattern;
}
template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
std::string_view url_pattern<regex_provider, regex_type>::get_username() const
template <url_pattern_regex::regex_concept regex_provider>
std::string_view url_pattern<regex_provider>::get_username() const
ada_lifetime_bound {
// Return this's associated URL pattern's username component's pattern string.
return username_component.pattern;
}
template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
std::string_view url_pattern<regex_provider, regex_type>::get_password() const
template <url_pattern_regex::regex_concept regex_provider>
std::string_view url_pattern<regex_provider>::get_password() const
ada_lifetime_bound {
// Return this's associated URL pattern's password component's pattern string.
return password_component.pattern;
}
template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
std::string_view url_pattern<regex_provider, regex_type>::get_hostname() const
template <url_pattern_regex::regex_concept regex_provider>
std::string_view url_pattern<regex_provider>::get_hostname() const
ada_lifetime_bound {
// Return this's associated URL pattern's hostname component's pattern string.
return hostname_component.pattern;
}
template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
std::string_view url_pattern<regex_provider, regex_type>::get_port() const
template <url_pattern_regex::regex_concept regex_provider>
std::string_view url_pattern<regex_provider>::get_port() const
ada_lifetime_bound {
// Return this's associated URL pattern's port component's pattern string.
return port_component.pattern;
}
template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
std::string_view url_pattern<regex_provider, regex_type>::get_pathname() const
template <url_pattern_regex::regex_concept regex_provider>
std::string_view url_pattern<regex_provider>::get_pathname() const
ada_lifetime_bound {
// Return this's associated URL pattern's pathname component's pattern string.
return pathname_component.pattern;
}
template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
std::string_view url_pattern<regex_provider, regex_type>::get_search() const
template <url_pattern_regex::regex_concept regex_provider>
std::string_view url_pattern<regex_provider>::get_search() const
ada_lifetime_bound {
// Return this's associated URL pattern's search component's pattern string.
return search_component.pattern;
}
template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
std::string_view url_pattern<regex_provider, regex_type>::get_hash() const
template <url_pattern_regex::regex_concept regex_provider>
std::string_view url_pattern<regex_provider>::get_hash() const
ada_lifetime_bound {
// Return this's associated URL pattern's hash component's pattern string.
return hash_component.pattern;
}
template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
bool url_pattern<regex_provider, regex_type>::ignore_case() const {
template <url_pattern_regex::regex_concept regex_provider>
bool url_pattern<regex_provider>::ignore_case() const {
return ignore_case_;
}
template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
bool url_pattern<regex_provider, regex_type>::has_regexp_groups() const {
template <url_pattern_regex::regex_concept regex_provider>
bool url_pattern<regex_provider>::has_regexp_groups() const {
// If this's associated URL pattern's has regexp groups, then return true.
return protocol_component.has_regexp_groups ||
username_component.has_regexp_groups ||
Expand Down
32 changes: 15 additions & 17 deletions include/ada/url_pattern.h
Original file line number Diff line number Diff line change
Expand Up @@ -207,15 +207,15 @@ struct url_pattern_component_result {
#endif // ADA_TESTING
};

template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
template <url_pattern_regex::regex_concept regex_provider>
class url_pattern_component {
public:
url_pattern_component() = default;

// This function explicitly takes a std::string because it is moved.
// To avoid unnecessary copy, move each value while calling the constructor.
url_pattern_component(std::string&& new_pattern, regex_type&& new_regexp,
url_pattern_component(std::string&& new_pattern,
regex_provider::regex_type&& new_regexp,
std::vector<std::string>&& new_group_name_list,
bool new_has_regexp_groups)
: regexp(std::move(new_regexp)),
Expand All @@ -236,7 +236,7 @@ class url_pattern_component {

std::string to_string() const;

regex_type regexp{};
regex_provider::regex_type regexp{};
std::string pattern{};
std::vector<std::string> group_name_list{};
bool has_regexp_groups = false;
Expand Down Expand Up @@ -270,13 +270,11 @@ struct url_pattern_options {
// defined in https://wicg.github.io/urlpattern.
// More information about the URL Pattern syntax can be found at
// https://developer.mozilla.org/en-US/docs/Web/API/URL_Pattern_API
template <class regex_provider, class regex_type>
requires url_pattern_regex::derived_from_provider<regex_provider, regex_type>
template <url_pattern_regex::regex_concept regex_provider>
class url_pattern {
public:
explicit url_pattern(
url_pattern_regex::provider<regex_type>&& new_regex_provider)
: regex_provider_(std::move(new_regex_provider)) {}
explicit url_pattern(regex_provider&& new_regex_provider)
: regex_provider_(new_regex_provider) {}

/**
* @see https://urlpattern.spec.whatwg.org/#dom-urlpattern-exec
Expand Down Expand Up @@ -322,14 +320,14 @@ class url_pattern {

[[nodiscard]] std::string to_string() const;

url_pattern_component<regex_provider, regex_type> protocol_component{};
url_pattern_component<regex_provider, regex_type> username_component{};
url_pattern_component<regex_provider, regex_type> password_component{};
url_pattern_component<regex_provider, regex_type> hostname_component{};
url_pattern_component<regex_provider, regex_type> port_component{};
url_pattern_component<regex_provider, regex_type> pathname_component{};
url_pattern_component<regex_provider, regex_type> search_component{};
url_pattern_component<regex_provider, regex_type> hash_component{};
url_pattern_component<regex_provider> protocol_component{};
url_pattern_component<regex_provider> username_component{};
url_pattern_component<regex_provider> password_component{};
url_pattern_component<regex_provider> hostname_component{};
url_pattern_component<regex_provider> port_component{};
url_pattern_component<regex_provider> pathname_component{};
url_pattern_component<regex_provider> search_component{};
url_pattern_component<regex_provider> hash_component{};
bool ignore_case_ = false;
regex_provider regex_provider_;

Expand Down
Loading