db/update/Walk: pass std::string_view to DirectoryMakeUriParentChecked()

Split the string into path segments with StringView::Split().  This
prepares to eliminate all allocations from the method.
This commit is contained in:
Max Kellermann 2020-04-02 20:14:28 +02:00
parent f13f66487a
commit 2c02a04566
2 changed files with 17 additions and 16 deletions

View File

@ -409,28 +409,29 @@ UpdateWalk::DirectoryMakeChildChecked(Directory &parent,
inline Directory *
UpdateWalk::DirectoryMakeUriParentChecked(Directory &root,
const char *uri) noexcept
std::string_view _uri) noexcept
{
Directory *directory = &root;
char *duplicated = xstrdup(uri);
char *name_utf8 = duplicated, *slash;
StringView uri(_uri);
while ((slash = strchr(name_utf8, '/')) != nullptr) {
*slash = 0;
if (StringIsEmpty(name_utf8))
continue;
directory = DirectoryMakeChildChecked(*directory,
duplicated,
name_utf8);
if (directory == nullptr)
while (true) {
auto s = uri.Split('/');
const std::string_view name = s.first;
const auto rest = s.second;
if (rest == nullptr)
break;
name_utf8 = slash + 1;
if (!name.empty()) {
directory = DirectoryMakeChildChecked(*directory,
std::string(name).c_str(),
s.first);
if (directory == nullptr)
break;
}
uri = s.second;
}
free(duplicated);
return directory;
}

View File

@ -166,7 +166,7 @@ private:
std::string_view name_utf8) noexcept;
Directory *DirectoryMakeUriParentChecked(Directory &root,
const char *uri) noexcept;
std::string_view uri) noexcept;
void UpdateUri(Directory &root, const char *uri) noexcept;
};