path(&p),
iter(e ? path->separators.end() : path->separators.begin()),
end(e || path->path.empty())
-{ }
+{
+ update();
+}
Path::Iterator &Path::Iterator::operator++()
{
if(path->path.size()==1 && path->separators.size()==1)
end = true;
}
+ update();
return *this;
}
}
else if(iter!=path->separators.begin())
--iter;
+ update();
return *this;
}
-string Path::Iterator::operator*() const
+void Path::Iterator::update()
{
if(end)
- throw logic_error("Path::Iterator::operator*");
+ {
+ current.clear();
+ return;
+ }
string::size_type start = 0;
if(iter!=path->separators.begin())
slash = *iter;
if(slash==0)
- return path->path.substr(start, 1);
- return path->path.substr(start, slash-start);
+ current = path->path.substr(start, 1);
+ else
+ current = path->path.substr(start, slash-start);
}
} // namespace FS
public:
class 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:
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 ¤t; }
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: