Commit 2c02a045 authored by Max Kellermann's avatar Max Kellermann

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.
parent f13f6648
......@@ -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;
}
......
......@@ -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;
};
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment