Improve Path compatibility with the original implementation.
This commit is contained in:
parent
1d9e88f27a
commit
77eddebe45
|
@ -126,6 +126,8 @@ struct Path {
|
||||||
|
|
||||||
@property PathEntry front() const nothrow @nogc { return PathEntry(m_path[0 .. m_nextEntry], m_type, m_absolute); }
|
@property PathEntry front() const nothrow @nogc { return PathEntry(m_path[0 .. m_nextEntry], m_type, m_absolute); }
|
||||||
|
|
||||||
|
@property PathEntry head() const nothrow @nogc { return this[length-1]; }
|
||||||
|
|
||||||
@property Path save() const nothrow @nogc { return this; }
|
@property Path save() const nothrow @nogc { return this; }
|
||||||
|
|
||||||
@property bool endsWithSlash()
|
@property bool endsWithSlash()
|
||||||
|
@ -242,6 +244,17 @@ struct Path {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hash_t toHash() const nothrow @trusted
|
||||||
|
{
|
||||||
|
hash_t ret;
|
||||||
|
auto strhash = &typeid(string).getHash;
|
||||||
|
try foreach (n; this.save) ret ^= strhash(&n.m_name);
|
||||||
|
catch (Throwable) assert(false);
|
||||||
|
if (this.absolute) ret ^= 0xfe3c1738;
|
||||||
|
if (this.endsWithSlash) ret ^= 0x6aa4352d;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
string toNativeString() const nothrow { return toString(PathType.native); }
|
string toNativeString() const nothrow { return toString(PathType.native); }
|
||||||
|
|
||||||
Path opSlice() const nothrow @nogc { return this; }
|
Path opSlice() const nothrow @nogc { return this; }
|
||||||
|
@ -259,8 +272,8 @@ struct Path {
|
||||||
|
|
||||||
PathEntry opIndex(size_t idx) const nothrow @nogc { auto ret = this[]; ret.popFrontExactly(idx); return ret.front; }
|
PathEntry opIndex(size_t idx) const nothrow @nogc { auto ret = this[]; ret.popFrontExactly(idx); return ret.front; }
|
||||||
|
|
||||||
Path opBinary(string op : "~")(string subpath) nothrow { return this ~ Path(subpath); }
|
Path opBinary(string op : "~")(string subpath) const nothrow { return this ~ Path(subpath); }
|
||||||
Path opBinary(string op : "~")(Path subpath) nothrow {
|
Path opBinary(string op : "~")(Path subpath) const nothrow {
|
||||||
assert(!subpath.absolute || m_path.length == 0, "Cannot append absolute path.");
|
assert(!subpath.absolute || m_path.length == 0, "Cannot append absolute path.");
|
||||||
|
|
||||||
if (this.endsWithSlash)
|
if (this.endsWithSlash)
|
||||||
|
@ -275,7 +288,7 @@ struct Path {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Path opBinary(string op : "~", R)(R entries) nothrow
|
Path opBinary(string op : "~", R)(R entries) const nothrow
|
||||||
if (!is(R == Path) && isInputRange!R && is(ElementType!R == PathEntry))
|
if (!is(R == Path) && isInputRange!R && is(ElementType!R == PathEntry))
|
||||||
{
|
{
|
||||||
import std.array : join;
|
import std.array : join;
|
||||||
|
@ -447,6 +460,15 @@ unittest
|
||||||
assert(Path("foo/", PathType.posix) ~ Path("bar") == Path("foo/bar"));
|
assert(Path("foo/", PathType.posix) ~ Path("bar") == Path("foo/bar"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@safe unittest {
|
||||||
|
import std.array : appender;
|
||||||
|
auto app = appender!(Path[]);
|
||||||
|
void test1(Path p) { app.put(p); }
|
||||||
|
void test2(Path[] ps) { app.put(ps); }
|
||||||
|
//void test3(const(Path) p) { app.put(p); } // DMD issue 17251
|
||||||
|
//void test4(const(Path)[] ps) { app.put(ps); }
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
struct PathEntry {
|
struct PathEntry {
|
||||||
import std.string : cmp;
|
import std.string : cmp;
|
||||||
|
|
Loading…
Reference in a new issue