From 26f5ac9a55dae71f462ec6be9f7a7f41d1739378 Mon Sep 17 00:00:00 2001 From: Jeremy Siek Date: Wed, 23 Oct 2002 22:55:53 +0000 Subject: [PATCH] added new iterator category support to iterator adaptors [SVN r609] --- include/boost/iterator/iterator_adaptors.hpp | 64 +++++++++++-------- .../boost/iterator/iterator_categories.hpp | 27 +++++++- 2 files changed, 63 insertions(+), 28 deletions(-) diff --git a/include/boost/iterator/iterator_adaptors.hpp b/include/boost/iterator/iterator_adaptors.hpp index 50e3091..18b90b6 100644 --- a/include/boost/iterator/iterator_adaptors.hpp +++ b/include/boost/iterator/iterator_adaptors.hpp @@ -3,25 +3,24 @@ #include // for prior #include +#include namespace boost { -template +template struct repository - : iterator + : iterator::type, V, D, P, R> { - typedef Final type; - typedef V value_type; - typedef R reference; - typedef C iterator_category; - typedef D difference_type; + typedef Final final; + typedef RC return_category; + typedef TC traversal_category; }; template struct downcastable : Base { - typedef typename Base::type final_t; + typedef typename Base::final final_t; public: final_t& downcast() { return static_cast(*this); } const final_t& downcast() const { return static_cast(*this); } @@ -80,16 +79,20 @@ struct iterator_arith : B { }; template typename Base::final operator+( - iterator_arith i, typename Base::distance n) + const iterator_arith& i, // pass by ref, not value to avoid slicing -JGS + typename Base::difference_type n) { - return i.downcast() += n; + typename Base::final tmp(i.downcast()); + return tmp += n; } template typename Base::final operator+( - typename Base::distance n, iterator_arith i) + typename Base::difference_type n, + const iterator_arith& i) // pass by ref, not value to avoid slicing -JGS { - return i.downcast() += n; + typename Base::final tmp(i.downcast()); + return tmp += n; } template @@ -102,17 +105,17 @@ typename Base1::difference_type operator-( template > > > + iterator_comparisons< + downcastable > > > > -struct iterator_adaptor : B +struct iterator_adaptor : B, new_iterator_base { typedef V value_type; typedef R reference; typedef P pointer; - typedef C iterator_category; + typedef typename B::iterator_category iterator_category; typedef D difference_type; reference operator*() const @@ -135,14 +138,25 @@ struct iterator_adaptor : B Final operator-(difference_type x) const { Final result(downcast()); return result -= x; } - template - bool equal(iterator_adaptor const& x) const + template + bool equal(iterator_adaptor const& x) const { return this->downcast().base() == x.downcast().base(); } + void advance(difference_type n) + { + this->downcast().base() += n; + } void increment() { ++this->downcast().base(); } void decrement() { --this->downcast().base(); } + + template + difference_type + distance_from(const iterator_adaptor& y) const + { + return y.downcast().base() - this->downcast().base();//? + } private: using B::downcast; @@ -150,13 +164,13 @@ struct iterator_adaptor : B template + class V, class R, class P, class RC, class TC, class D> struct reverse_iterator : iterator_adaptor< - reverse_iterator, V, R, P, C, D + reverse_iterator, V, R, P, RC, TC, D > { - typedef iterator_adaptor, V, R, P, C, D> super; + typedef iterator_adaptor, V, R, P, RC, TC, D> super; // friend class super; // hmm, I don't like the next two lines @@ -171,7 +185,7 @@ struct reverse_iterator Base const& base() const { return m_base; } template - reverse_iterator(const reverse_iterator& y) + reverse_iterator(const reverse_iterator& y) : m_base(y.m_base) { } @@ -186,7 +200,7 @@ struct reverse_iterator template typename super::difference_type - distance_from(const reverse_iterator& y) const + distance_from(const reverse_iterator& y) const { return m_base - y.m_base; } @@ -195,8 +209,6 @@ struct reverse_iterator }; - - } // namespace boost diff --git a/include/boost/iterator/iterator_categories.hpp b/include/boost/iterator/iterator_categories.hpp index c99d28f..bc49069 100644 --- a/include/boost/iterator/iterator_categories.hpp +++ b/include/boost/iterator/iterator_categories.hpp @@ -12,6 +12,8 @@ #include #include #include +#include +#include namespace boost { @@ -106,10 +108,10 @@ namespace boost { bidirectional_traversal_tag, typename ct_if< is_convertible::value, - forward_traversal_tag, + forward_traversal_tag, typename ct_if< is_convertible::value, - input_traversal_tag, + input_traversal_tag, output_traversal_tag >::type >::type @@ -187,6 +189,27 @@ namespace boost { #endif + template + struct cvt_iterator_category { + typedef + typename mpl::if_c<(is_convertible::value + || is_convertible::value), + typename mpl::if_c::value, + std::random_access_iterator_tag, + typename mpl::if_c::value, + std::bidirectional_iterator_tag, + typename mpl::if_c::value, + std::forward_iterator_tag, + boost::error_iterator_tag>::type >::type >::type, + typename mpl::if_c<(is_convertible::value + && is_convertible::value), + std::input_iterator_tag, + typename mpl::if_c<(is_convertible::value + && is_convertible::value), + std::output_iterator_tag, + boost::error_iterator_tag>::type>::type >::type type; + }; + } // namespace boost #endif // BOOST_ITERATOR_CATEGORIES_HPP