X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fpath.h;h=0b946fdcdb18bb00ab79ffe189249946fc5bc8be;hp=f52362230ebf538468734aa4ddfd1e2cc32e0df9;hb=d3c9b9abb9e3c69aeecbca1044b43e7ec83f3b8c;hpb=66bdaa1f9f833e18a07d061208ce6080f3abac06 diff --git a/source/path.h b/source/path.h index f523622..0b946fd 100644 --- a/source/path.h +++ b/source/path.h @@ -1,68 +1,95 @@ -/* -This file is part of libmsppath -Copyright © 2006 Mikko Rasa, Mikkosoft Productions +/* $Id$ + +This file is part of libmspfs +Copyright © 2006-2008 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ -#ifndef MSP_PATH_PATH_H_ -#define MSP_PATH_PATH_H_ + +#ifndef MSP_FS_PATH_H_ +#define MSP_FS_PATH_H_ #include #include namespace Msp { -namespace Path { +namespace FS { enum { #ifdef WIN32 - DIRCHAR='\\' + DIRSEP='\\' #else - DIRCHAR='/' + DIRSEP='/' #endif }; +/** +Stores a filesystem path. Paths are always stored in a normalized form; there +are never any "." or ".." components in the middle of the path, and relative +paths always begin with a single "." component or a sequence ".." components. +*/ class Path { public: - class iterator + class Iterator { - public: - iterator &operator++(); - iterator &operator--(); - std::string operator*() const; - bool operator==(const iterator &i) const { return (start==i.start && end==i.end); } - bool operator!=(const iterator &i) const { return !(*this==i); } + friend class Path; + private: const Path &path; - unsigned start,end; + std::string::size_type start,end; - iterator(const Path &); - - friend class Path; + Iterator(const Path &); + public: + Iterator &operator++(); + Iterator &operator--(); + std::string operator*() const; + bool operator==(const Iterator &i) const { return (start==i.start && end==i.end); } + bool operator!=(const Iterator &i) const { return !(*this==i); } }; - Path() { } - Path(const std::string &p) { init(p); } - Path(const char *p) { init(p); } +private: + std::string path; + +public: + Path(); + Path(const std::string &); + Path(const char *); + const std::string &str() const { return path; } - unsigned size() const; - bool is_absolute() const; - Path subpath(unsigned, unsigned =(unsigned)-1) const; - Path operator/(const Path &p) const { Path a=*this; a/=p; return a; } - Path &operator/=(const Path &); + + /// Returns the number of components in the path. + unsigned size() const; + + bool empty() const { return path.empty(); } + + /// Determines whether the path starts from the root directory + bool is_absolute() const; + + /// Extracts a range of components from the path. + Path subpath(unsigned start, unsigned count=static_cast(-1)) const; + + /// Concatenates this path with another one, with usual filesystem semantics + Path operator/(const Path &p) const; + Path &operator/=(const Path &); + + /** + Extracts a single component from the path. Negative indices count from the + end of the path. + */ std::string operator[](int) const; + bool operator==(const Path &) const; - iterator begin() const { return iterator(*this); } - iterator end() const { iterator i(*this); i.start=i.end=std::string::npos; return i; } + Iterator begin() const; + Iterator end() const; private: - std::string path; - void init(const std::string &); + void add_component(const std::string &); }; inline std::ostream &operator<<(std::ostream &o, const Path &p) { o<