diff --git a/include/boost/iterator/filter_iterator.hpp b/include/boost/iterator/filter_iterator.hpp index 8e21981..c3d38f3 100644 --- a/include/boost/iterator/filter_iterator.hpp +++ b/include/boost/iterator/filter_iterator.hpp @@ -76,14 +76,14 @@ namespace boost private: void increment() { - super_t::increment(); + ++(this->base_reference()); satisfy_predicate(); } void satisfy_predicate() { while (this->base() != this->m_end && !this->m_predicate(*this->base())) - super_t::increment(); + ++(this->base_reference()); } // Probably should be the initial base class so it can be diff --git a/include/boost/iterator/iterator_adaptor.hpp b/include/boost/iterator/iterator_adaptor.hpp index 1ab1d8b..aaeb62d 100644 --- a/include/boost/iterator/iterator_adaptor.hpp +++ b/include/boost/iterator/iterator_adaptor.hpp @@ -240,9 +240,22 @@ namespace boost { return m_iterator; } protected: - // Core iterator interface for iterator_facade - // + // + // lvalue access to the Base object for Derived + // + Base const& base_reference() const + { return m_iterator; } + Base& base_reference() + { return m_iterator; } + + private: + // + // Core iterator interface for iterator_facade. This is private + // to prevent temptation for Derived classes to use it, which + // will often result in an error. Derived classes should use + // base_reference(), above, to get direct access to m_iterator. + // typename super_t::reference dereference() const { return *m_iterator; } @@ -277,10 +290,6 @@ namespace boost return y.base() - m_iterator; } - // Needed for counting iterator - Base const& base_reference() const - { return m_iterator; } - private: // data members Base m_iterator; }; diff --git a/include/boost/iterator/reverse_iterator.hpp b/include/boost/iterator/reverse_iterator.hpp index 606b52c..43942eb 100644 --- a/include/boost/iterator/reverse_iterator.hpp +++ b/include/boost/iterator/reverse_iterator.hpp @@ -20,44 +20,44 @@ namespace boost // // template - class reverse_iterator : - public iterator_adaptor< reverse_iterator, Iterator > + class reverse_iterator + : public iterator_adaptor< reverse_iterator, Iterator > { - typedef iterator_adaptor< reverse_iterator, Iterator > super_t; + typedef iterator_adaptor< reverse_iterator, Iterator > super_t; - friend class iterator_core_access; + friend class iterator_core_access; - public: - reverse_iterator() {} + public: + reverse_iterator() {} - explicit reverse_iterator(Iterator x) - : super_t(x) {} + explicit reverse_iterator(Iterator x) + : super_t(x) {} - template - reverse_iterator( - reverse_iterator const& r - , typename enable_if_convertible::type* = 0 - ) - : super_t(r.base()) - {} + template + reverse_iterator( + reverse_iterator const& r + , typename enable_if_convertible::type* = 0 + ) + : super_t(r.base()) + {} - private: - typename super_t::reference dereference() const { return *boost::prior(this->base()); } + private: + typename super_t::reference dereference() const { return *boost::prior(this->base()); } - void increment() { super_t::decrement(); } - void decrement() { super_t::increment(); } + void increment() { --this->base_reference(); } + void decrement() { ++this->base_reference(); } - void advance(typename super_t::difference_type n) - { - super_t::advance(-n); - } + void advance(typename super_t::difference_type n) + { + this->base_reference() += -n; + } - template - typename super_t::difference_type - distance_to(reverse_iterator const& y) const - { - return -super_t::distance_to(y); - } + template + typename super_t::difference_type + distance_to(reverse_iterator const& y) const + { + return this->base_reference() - y.base(); + } }; template diff --git a/include/boost/iterator/transform_iterator.hpp b/include/boost/iterator/transform_iterator.hpp index c86e1a9..497d64f 100644 --- a/include/boost/iterator/transform_iterator.hpp +++ b/include/boost/iterator/transform_iterator.hpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include #include