@Override public boolean equals(Object obj) { if (obj == this) return true; if (obj instanceof Path) { Path that = (Path) obj; if (this.size() != that.size()) return false; if (!this.parent.equals(that.parent())) return false; return this.segment.equals(that.lastSegment().get()); } return false; }
@Override public Path subpath(int length) { if (length > size() || length < 0) throw new IllegalArgumentException("Invalid subpath length: " + length); return length <= parent.size() ? parent.subpath(length) : this; }
@Override public String segment(int index) { if (index >= size() || index < 0) throw new IllegalArgumentException("Invalid segment index: " + index); return index < parent.size() ? parent.segment(index) : segment; }
@Override public boolean equals(Object obj) { if (obj == this) return true; if (obj instanceof Path) { Path that = (Path) obj; if (this.size() != that.size()) return false; if (!this.parent.equals(that.parent())) return false; return this.segment.equals(that.lastSegment().get()); } return false; }
@Override public int copyInto(String[] segments, int start) { int copied = ((InnerPath) parent).copyInto(segments, start); segments[copied] = this.segment; return size(); }
@Override public Path append(Path relPath) { if (relPath.isRoot()) return this; if (relPath.isSingle()) return new ChildPath(this, relPath.lastSegment().get()); String[] segments = new String[size() + relPath.size() + 1]; int offset = copyInto(segments, 0); copyPathInto(relPath, segments, offset); return new MultiSegmentPath(segments); }
@Override public Path subpath(int length) { if (length > size() || length < 0) throw new IllegalArgumentException("Invalid subpath length: " + length); return length <= parent.size() ? parent.subpath(length) : this; }
@Override public String segment(int index) { if (index >= size() || index < 0) throw new IllegalArgumentException("Invalid segment index: " + index); return index < parent.size() ? parent.segment(index) : segment; }
@Override public Path append(Path relPath) { if (relPath.isRoot()) return this; if (relPath.isSingle()) return new ChildPath(this, relPath.lastSegment().get()); String[] segments = new String[size() + relPath.size() + 1]; int offset = copyInto(segments, 0); copyPathInto(relPath, segments, offset); return new MultiSegmentPath(segments); }
@Override public int copyInto(String[] segments, int start) { int copied = ((InnerPath) parent).copyInto(segments, start); segments[copied] = this.segment; return size(); }