From eca23d70c9e2c0519125f2fd92c212d3c94f7736 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Sun, 5 Oct 2014 21:20:48 +0300 Subject: [PATCH] Make FS::Path::Iterator meet forward iterator requirements --- source/fs/path.cpp | 18 +++++++++++++----- source/fs/path.h | 14 +++++++++++++- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/source/fs/path.cpp b/source/fs/path.cpp index 4db7f0c..0fe95d6 100644 --- a/source/fs/path.cpp +++ b/source/fs/path.cpp @@ -222,7 +222,9 @@ Path::Iterator::Iterator(const Path &p, bool e): path(&p), iter(e ? path->separators.end() : path->separators.begin()), end(e || path->path.empty()) -{ } +{ + update(); +} Path::Iterator &Path::Iterator::operator++() { @@ -234,6 +236,7 @@ Path::Iterator &Path::Iterator::operator++() if(path->path.size()==1 && path->separators.size()==1) end = true; } + update(); return *this; } @@ -247,13 +250,17 @@ Path::Iterator &Path::Iterator::operator--() } 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()) @@ -267,8 +274,9 @@ string Path::Iterator::operator*() const 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 diff --git a/source/fs/path.h b/source/fs/path.h index 5d0a5d3..3cbfb16 100644 --- a/source/fs/path.h +++ b/source/fs/path.h @@ -36,10 +36,18 @@ private: 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: @@ -47,10 +55,14 @@ 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: -- 2.43.0