Path relative(const Path &path, const Path &base)
{
+ if(path.is_absolute()!=base.is_absolute())
+ throw invalid_argument("FS::relative");
+
Path::Iterator i = path.begin();
Path::Iterator j = base.begin();
for(; (i!=path.end() && j!=base.end() && *i==*j); ++i, ++j) ;
int descendant_depth(const Path &path, const Path &parent)
{
+ if(path.is_absolute()!=parent.is_absolute())
+ throw invalid_argument("FS::descendant_depth");
+
Path::Iterator i = path.begin();
Path::Iterator j = parent.begin();
for(; (i!=path.end() && j!=parent.end() && *i==*j); ++i, ++j) ;
/// Renames a file. Existing file, if any, is overwritten.
void rename(const Path &from, const Path &to);
-/// Makes a path relative to some base path. That is, base/result==path.
+/** Makes a path relative to some base path. That is, base/result==path. Both
+paths must be either absolute or relative. */
Path relative(const Path &path, const Path &base);
/// Returns the longest prefix shared by both paths.
Path common_ancestor(const Path &, const Path &);
/** Determines how many levels a path is below another. Returns -1 if path is
-not a descendant of parent. */
+not a descendant of parent. Both paths must be either absolute or relative. */
int descendant_depth(const Path &path, const Path &parent);
} // namespace FS