@@ -21,44 +21,38 @@ using default_port_list = std::vector<std::pair<std::string, std::optional<std::
2121
2222inline auto special_schemes () noexcept -> const default_port_list & {
2323 static const auto schemes = default_port_list{
24- {" ftp" , 21 },
2524 {" file" , std::nullopt },
25+ {" ftp" , 21 },
2626 {" http" , 80 },
2727 {" https" , 443 },
2828 {" ws" , 80 },
2929 {" wss" , 443 },
3030 };
3131 return schemes;
3232}
33+
34+ inline auto scheme_less (
35+ const default_port_list::value_type &special_scheme,
36+ std::string_view scheme) -> bool {
37+ return special_scheme.first < scheme;
38+ };
3339} // namespace details
3440
3541// / \param scheme
3642// / \returns
3743inline auto is_special (std::string_view scheme) noexcept -> bool {
3844 const auto &schemes = details::special_schemes ();
39- auto first = begin (schemes), last = end (schemes);
40- auto it = std::find_if (
41- first, last,
42- [&scheme](const auto &special_scheme) -> bool {
43- return scheme == special_scheme.first ;
44- });
45- return (it != last);
45+ auto it = std::lower_bound (begin (schemes), end (schemes), scheme, details::scheme_less);
46+ return ((it != end (schemes)) && !(scheme < it->first ));
4647}
4748
4849// / \param scheme
4950// / \returns
50- inline auto default_port (std::string_view scheme) noexcept -> std::optional<std::uint16_t> {
51+ inline auto default_port (std::string_view scheme) noexcept
52+ -> std::optional<std::uint16_t> {
5153 const auto &schemes = details::special_schemes ();
52- auto first = begin (schemes), last = end (schemes);
53- auto it = std::find_if (
54- first, last,
55- [&scheme](const auto &special_scheme) -> bool {
56- return scheme == special_scheme.first ;
57- });
58- if (it != last) {
59- return it->second ;
60- }
61- return std::nullopt ;
54+ auto it = std::lower_bound (begin (schemes), end (schemes), scheme, details::scheme_less);
55+ return ((it != end (schemes)) && !(scheme < it->first )) ? it->second : std::nullopt ;
6256}
6357} // namespace v1
6458} // namespace skyr
0 commit comments