]> git.tdb.fi Git - libs/core.git/blobdiff - source/fs/path.h
Add move semantics to Variant
[libs/core.git] / source / fs / path.h
index 210b5d93d14c88bf136d07f25a5ddc78c7fc89e2..1b15047cc528ece01f9d2061fcd0fd3740dedfef 100644 (file)
@@ -4,13 +4,14 @@
 #include <ostream>
 #include <string>
 #include <vector>
+#include <msp/core/mspcore_api.h>
 
 namespace Msp {
 namespace FS {
 
 enum
 {
-#ifdef WIN32
+#ifdef _WIN32
        DIRSEP = '\\'
 #else
        DIRSEP = '/'
@@ -28,18 +29,26 @@ A path can also be treated as an array of components, supporting indexing,
 iteration and slicing.  In this context the root directory is treated as a
 component of its own.
 */
-class Path
+class MSPCORE_API Path
 {
 private:
        typedef std::vector<std::string::size_type> PositionArray;
 
 public:
-       class Iterator
+       class MSPCORE_API Iterator
        {
+       public:
+               typedef PositionArray::difference_type difference_type;
+               typedef const std::string value_type;
+               typedef const std::string *pointer;
+               typedef const std::string &reference;
+               typedef std::input_iterator_tag iterator_category;
+
        private:
                const Path *path;
                PositionArray::const_iterator iter;
                bool end;
+               std::string current;
 
                Iterator(const Path &, bool = false);
        public:
@@ -47,27 +56,31 @@ public:
                static Iterator at_end(const Path &p) { return Iterator(p, true); }
 
                Iterator &operator++();
+               Iterator operator++(int) { Iterator i = *this; ++*this; return i; }
                Iterator &operator--();
-               std::string operator*() const;
+               const std::string &operator*() const { return current; }
+               const std::string *operator->() const { return &current; }
                bool operator==(const Iterator &i) const { return (iter==i.iter && end==i.end); }
                bool operator!=(const Iterator &i) const { return !(*this==i); }
+       private:
+               void update();
        };
 
 private:
        std::string path;
-       std::vector<std::string::size_type> separators;
+       PositionArray separators;
 
 public:
-       Path();
+       Path() = default;
        Path(const std::string &);
-       Path(const char *);
-private:
-       void init(const std::string &);
+       Path(const char *p): Path(std::string(p)) { }
 
-public:
        /// Returns the path as a string.
        const std::string &str() const { return path; }
 
+       /// Returns the path as a pointer to a null-terminated string.
+       const char *c_str() const { return path.c_str(); }
+
        /// Returns the number of components in the path.
        unsigned size() const;