Skip to content

Commit

Permalink
cleaner
Browse files Browse the repository at this point in the history
  • Loading branch information
lemire committed Jan 20, 2025
1 parent 2772ae9 commit 8c8b6fc
Show file tree
Hide file tree
Showing 13 changed files with 229 additions and 274 deletions.
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

0 comments on commit 8c8b6fc

Please sign in to comment.