Commit 29984e9b authored by Kenton Varda's avatar Kenton Varda

Fix append() so that the parameter can be an lvalue String& or Path&.

A parameter type of `String` takes precedence over `StringPtr` when matching a parameter of type `String&` (i.e. an lvalue), but then doesn't work since `String` has no copy constructor. Matching `String&&` instead avoids this problem.
parent 42846e1a
...@@ -55,13 +55,13 @@ Path Path::parse(StringPtr path) { ...@@ -55,13 +55,13 @@ Path Path::parse(StringPtr path) {
return evalImpl(Vector<String>(countParts(path)), path); return evalImpl(Vector<String>(countParts(path)), path);
} }
Path PathPtr::append(Path suffix) const { Path PathPtr::append(Path&& suffix) const {
auto newParts = kj::heapArrayBuilder<String>(parts.size() + suffix.parts.size()); auto newParts = kj::heapArrayBuilder<String>(parts.size() + suffix.parts.size());
for (auto& p: parts) newParts.add(heapString(p)); for (auto& p: parts) newParts.add(heapString(p));
for (auto& p: suffix.parts) newParts.add(kj::mv(p)); for (auto& p: suffix.parts) newParts.add(kj::mv(p));
return Path(newParts.finish(), Path::ALREADY_CHECKED); return Path(newParts.finish(), Path::ALREADY_CHECKED);
} }
Path Path::append(Path suffix) && { Path Path::append(Path&& suffix) && {
auto newParts = kj::heapArrayBuilder<String>(parts.size() + suffix.parts.size()); auto newParts = kj::heapArrayBuilder<String>(parts.size() + suffix.parts.size());
for (auto& p: parts) newParts.add(kj::mv(p)); for (auto& p: parts) newParts.add(kj::mv(p));
for (auto& p: suffix.parts) newParts.add(kj::mv(p)); for (auto& p: suffix.parts) newParts.add(kj::mv(p));
......
...@@ -97,14 +97,14 @@ public: ...@@ -97,14 +97,14 @@ public:
// is NOT accepted -- if that is a problem, you probably want `eval()`. Trailing '/'s are // is NOT accepted -- if that is a problem, you probably want `eval()`. Trailing '/'s are
// ignored. // ignored.
Path append(Path suffix) const&; Path append(Path&& suffix) const&;
Path append(Path suffix) &&; Path append(Path&& suffix) &&;
Path append(PathPtr suffix) const&; Path append(PathPtr suffix) const&;
Path append(PathPtr suffix) &&; Path append(PathPtr suffix) &&;
Path append(StringPtr suffix) const&; Path append(StringPtr suffix) const&;
Path append(StringPtr suffix) &&; Path append(StringPtr suffix) &&;
Path append(String suffix) const&; Path append(String&& suffix) const&;
Path append(String suffix) &&; Path append(String&& suffix) &&;
// Create a new path by appending the given path to this path. // Create a new path by appending the given path to this path.
// //
// `suffix` cannot contain '/' characters. Instead, you can append an array: // `suffix` cannot contain '/' characters. Instead, you can append an array:
...@@ -204,10 +204,10 @@ public: ...@@ -204,10 +204,10 @@ public:
PathPtr(const Path& path); PathPtr(const Path& path);
Path clone(); Path clone();
Path append(Path suffix) const; Path append(Path&& suffix) const;
Path append(PathPtr suffix) const; Path append(PathPtr suffix) const;
Path append(StringPtr suffix) const; Path append(StringPtr suffix) const;
Path append(String suffix) const; Path append(String&& suffix) const;
Path eval(StringPtr pathText) const; Path eval(StringPtr pathText) const;
PathPtr basename() const; PathPtr basename() const;
PathPtr parent() const; PathPtr parent() const;
...@@ -856,12 +856,12 @@ inline Path::Path(std::initializer_list<StringPtr> parts) ...@@ -856,12 +856,12 @@ inline Path::Path(std::initializer_list<StringPtr> parts)
inline Path::Path(Array<String> parts, decltype(ALREADY_CHECKED)) inline Path::Path(Array<String> parts, decltype(ALREADY_CHECKED))
: parts(kj::mv(parts)) {} : parts(kj::mv(parts)) {}
inline Path Path::clone() const { return PathPtr(*this).clone(); } inline Path Path::clone() const { return PathPtr(*this).clone(); }
inline Path Path::append(Path suffix) const& { return PathPtr(*this).append(kj::mv(suffix)); } inline Path Path::append(Path&& suffix) const& { return PathPtr(*this).append(kj::mv(suffix)); }
inline Path Path::append(PathPtr suffix) const& { return PathPtr(*this).append(suffix); } inline Path Path::append(PathPtr suffix) const& { return PathPtr(*this).append(suffix); }
inline Path Path::append(StringPtr suffix) const& { return append(Path(suffix)); } inline Path Path::append(StringPtr suffix) const& { return append(Path(suffix)); }
inline Path Path::append(StringPtr suffix) && { return kj::mv(*this).append(Path(suffix)); } inline Path Path::append(StringPtr suffix) && { return kj::mv(*this).append(Path(suffix)); }
inline Path Path::append(String suffix) const& { return append(Path(kj::mv(suffix))); } inline Path Path::append(String&& suffix) const& { return append(Path(kj::mv(suffix))); }
inline Path Path::append(String suffix) && { return kj::mv(*this).append(Path(kj::mv(suffix))); } inline Path Path::append(String&& suffix) && { return kj::mv(*this).append(Path(kj::mv(suffix))); }
inline Path Path::eval(StringPtr pathText) const& { return PathPtr(*this).eval(pathText); } inline Path Path::eval(StringPtr pathText) const& { return PathPtr(*this).eval(pathText); }
inline PathPtr Path::basename() const& { return PathPtr(*this).basename(); } inline PathPtr Path::basename() const& { return PathPtr(*this).basename(); }
inline PathPtr Path::parent() const& { return PathPtr(*this).parent(); } inline PathPtr Path::parent() const& { return PathPtr(*this).parent(); }
...@@ -885,7 +885,7 @@ inline PathPtr::PathPtr(decltype(nullptr)): parts(nullptr) {} ...@@ -885,7 +885,7 @@ inline PathPtr::PathPtr(decltype(nullptr)): parts(nullptr) {}
inline PathPtr::PathPtr(const Path& path): parts(path.parts) {} inline PathPtr::PathPtr(const Path& path): parts(path.parts) {}
inline PathPtr::PathPtr(ArrayPtr<const String> parts): parts(parts) {} inline PathPtr::PathPtr(ArrayPtr<const String> parts): parts(parts) {}
inline Path PathPtr::append(StringPtr suffix) const { return append(Path(suffix)); } inline Path PathPtr::append(StringPtr suffix) const { return append(Path(suffix)); }
inline Path PathPtr::append(String suffix) const { return append(Path(kj::mv(suffix))); } inline Path PathPtr::append(String&& suffix) const { return append(Path(kj::mv(suffix))); }
inline const String& PathPtr::operator[](size_t i) const { return parts[i]; } inline const String& PathPtr::operator[](size_t i) const { return parts[i]; }
inline size_t PathPtr::size() const { return parts.size(); } inline size_t PathPtr::size() const { return parts.size(); }
inline const String* PathPtr::begin() const { return parts.begin(); } inline const String* PathPtr::begin() const { return parts.begin(); }
......
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