]> git.tdb.fi Git - libs/core.git/blobdiff - source/fs/path.h
Prepare for assimilation into core
[libs/core.git] / source / fs / path.h
diff --git a/source/fs/path.h b/source/fs/path.h
new file mode 100644 (file)
index 0000000..e560d3f
--- /dev/null
@@ -0,0 +1,95 @@
+/* $Id$
+
+This file is part of libmspfs
+Copyright © 2006-2008  Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+
+#ifndef MSP_FS_PATH_H_
+#define MSP_FS_PATH_H_
+
+#include <ostream>
+#include <string>
+
+namespace Msp {
+namespace FS {
+
+enum
+{
+#ifdef WIN32
+       DIRSEP = '\\'
+#else
+       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
+       {
+               friend class Path;
+
+       private:
+               const Path &path;
+               std::string::size_type start,end;
+
+               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); }
+       };
+
+private:
+       std::string path;
+
+public:
+       Path();
+       Path(const std::string &);
+       Path(const char *);
+
+       const std::string &str() const { return 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<unsigned>(-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;
+       Iterator    end() const;
+private:
+       void init(const std::string &);
+       void add_component(const std::string &);
+};
+
+inline std::ostream &operator<<(std::ostream &o, const Path &p) { o<<p.str(); return o; }
+
+} // namespace FS
+} // namespace Msp
+
+#endif