string basename(const Path &p)
{
- return p[-1];
+ return p.empty() ? string() : p[-1];
}
Path dirname(const Path &p)
{
+ if(p.empty())
+ return p;
if(p.size()==1)
{
if(p.is_absolute())
Path result;
for(Path::Iterator i=path.begin(); i!=path.end(); ++i)
{
- if(!found || *i=="/")
+ if(!found || (result.empty() && (*i=="/" || *i==".")))
result /= *i;
else
{
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) ;