| @@ -26,8 +26,8 @@ dependency dependency::parse_depends_string(std::string_view str) { | |||
| ++str_iter; | |||
| } | |||
| auto name = trim(std::string_view(str_begin, str_iter - str_begin)); | |||
| auto version_str = trim(std::string_view(str_iter, str_end - str_iter)); | |||
| auto name = trim_view(std::string_view(str_begin, str_iter - str_begin)); | |||
| auto version_str = trim_view(std::string_view(str_iter, str_end - str_iter)); | |||
| semver::version version; | |||
| try { | |||
| @@ -54,24 +54,25 @@ auto tie_sdist(const sdist& sd) { | |||
| return std::tuple(sd.manifest.name, sd.manifest.version.to_string()); | |||
| } | |||
| auto sdist_compare = [](const sdist& lhs, const sdist& rhs) { | |||
| return tie_sdist(lhs) < tie_sdist(rhs); | |||
| }; | |||
| auto sdist_compare | |||
| = [](const sdist& lhs, const sdist& rhs) { return tie_sdist(lhs) < tie_sdist(rhs); }; | |||
| void detail::sort_sdists(std::vector<sdist>& sd) { std::sort(sd.begin(), sd.end(), sdist_compare); } | |||
| namespace { | |||
| const sdist* get_sdist(const std::vector<sdist>& sorted_sds, std::string_view name, std::string_view version) { | |||
| auto found = std::partition_point(sorted_sds.begin(), sorted_sds.end(), [&](const auto& candidate) { | |||
| return tie_sdist(candidate) < std::tie(name, version); | |||
| }); | |||
| const sdist* | |||
| get_sdist(const std::vector<sdist>& sorted_sds, std::string_view name, std::string_view version) { | |||
| auto found | |||
| = std::partition_point(sorted_sds.begin(), sorted_sds.end(), [&](const auto& candidate) { | |||
| return tie_sdist(candidate) < std::tie(name, version); | |||
| }); | |||
| if (found->manifest.name == name && found->manifest.version.to_string() == version) { | |||
| return &*found; | |||
| } | |||
| return nullptr; | |||
| } | |||
| } | |||
| } // namespace | |||
| void detail::do_find_deps(const std::vector<sdist>& sdists, | |||
| const dependency& dep, | |||
| @@ -11,10 +11,13 @@ inline namespace string_utils { | |||
| inline std::string_view sview(std::string_view::const_iterator beg, | |||
| std::string_view::const_iterator end) { | |||
| if (beg == end) { | |||
| return ""; | |||
| } | |||
| return std::string_view(&*beg, static_cast<std::size_t>(std::distance(beg, end))); | |||
| } | |||
| inline std::string_view trim(std::string_view s) { | |||
| inline std::string_view trim_view(std::string_view s) { | |||
| auto iter = s.begin(); | |||
| auto end = s.end(); | |||
| while (iter != end && std::isspace(*iter)) { | |||
| @@ -29,10 +32,6 @@ inline std::string_view trim(std::string_view s) { | |||
| return sview(iter, new_end); | |||
| } | |||
| inline std::string_view trim(const char* str) { return trim(std::string_view(str)); } | |||
| inline std::string trim(std::string&& s) { return std::string(trim(s)); } | |||
| inline bool ends_with(std::string_view s, std::string_view key) { | |||
| auto found = s.rfind(key); | |||
| return found != s.npos && found == s.size() - key.size(); | |||
| @@ -34,9 +34,9 @@ void test_ends_with() { | |||
| } | |||
| void test_trim() { | |||
| CHECK(trim("foo") == "foo"); | |||
| CHECK(trim("foo ") == "foo"); | |||
| CHECK(trim(" ").size() == 0); | |||
| CHECK(trim_view("foo") == "foo"); | |||
| CHECK(trim_view("foo ") == "foo"); | |||
| CHECK(trim_view(" ").size() == 0); | |||
| } | |||
| void test_contains() { | |||
| @@ -26,7 +26,9 @@ lm::index index::from_file(path_ref fpath) { | |||
| for (const auto& pkg_line : package_lines) { | |||
| auto items = dds::split(pkg_line, ";"); | |||
| std::transform(items.begin(), items.end(), items.begin(), [](auto s) { return trim(s); }); | |||
| std::transform(items.begin(), items.end(), items.begin(), [](auto s) { | |||
| return std::string(trim_view(s)); | |||
| }); | |||
| if (items.size() != 2) { | |||
| throw std::runtime_error( | |||
| fmt::format("Invalid 'Package' field in index file ({}): 'Package: {}'", | |||
| @@ -16,7 +16,7 @@ using namespace lm; | |||
| namespace { | |||
| void parse_line(std::vector<pair>& pairs, const std::string_view whole_line) { | |||
| const auto line = trim(whole_line); | |||
| const auto line = trim_view(whole_line); | |||
| if (line.empty() || line[0] == '#') { | |||
| return; | |||
| } | |||
| @@ -46,8 +46,8 @@ void parse_line(std::vector<pair>& pairs, const std::string_view whole_line) { | |||
| // `iter` now points to the space between the key and value | |||
| auto key = sview(begin, iter - 1); // -1 to trim the colon in the key | |||
| auto value = sview(iter, end); | |||
| key = trim(key); | |||
| value = trim(value); | |||
| key = trim_view(key); | |||
| value = trim_view(value); | |||
| pairs.emplace_back(key, value); | |||
| } | |||