From 31fef5252afbdb9c31406ff00b9c78a3f4ec5cb5 Mon Sep 17 00:00:00 2001 From: Jeremy Siek Date: Fri, 24 Nov 2000 19:40:51 +0000 Subject: [PATCH] simplified version of iterator_adaptor, plus fix to indirect iterator and addition of projection iterator [SVN r8317] --- include/boost/pending/integer_range.hpp | 2 +- include/boost/pending/iterator_adaptors.hpp | 268 ++++++++++++++------ 2 files changed, 190 insertions(+), 80 deletions(-) diff --git a/include/boost/pending/integer_range.hpp b/include/boost/pending/integer_range.hpp index 3d396b4..6877d19 100644 --- a/include/boost/pending/integer_range.hpp +++ b/include/boost/pending/integer_range.hpp @@ -54,7 +54,7 @@ struct integer_range { #ifdef BOOST_USE_ITERATOR_ADAPTORS typedef iterator_adaptor, - counting_iterator_traits, IntegerType> iterator; + counting_iterator_traits > iterator; #else typedef int_iterator iterator; #endif diff --git a/include/boost/pending/iterator_adaptors.hpp b/include/boost/pending/iterator_adaptors.hpp index 33a88c5..0f03cd6 100644 --- a/include/boost/pending/iterator_adaptors.hpp +++ b/include/boost/pending/iterator_adaptors.hpp @@ -13,9 +13,8 @@ #ifndef BOOST_ITERATOR_ADAPTOR_DWA053000_HPP_ #define BOOST_ITERATOR_ADAPTOR_DWA053000_HPP_ -#include +#include #include -#include #include // I was having some problems with VC6. I couldn't tell whether our hack for @@ -144,22 +143,17 @@ inline bool operator<=(const iterator_comparisons& xb, // Traits - a class satisfying the same requirements as a specialization of // std::iterator_traits for the resulting iterator. // -// NonconstIterator - the corresponding non-const iterator type for -// Iterator, if any. You don't need to supply this if you are not make a -// const/non-const iterator pair. -// template , + class Traits = std::iterator_traits #endif - class NonconstIterator = Iterator > struct iterator_adaptor : #ifdef BOOST_RELOPS_AMBIGUITY_BUG iterator_comparisons< - iterator_adaptor, + iterator_adaptor, #endif boost::iterator #endif { - typedef iterator_adaptor Self; + typedef iterator_adaptor Self; public: typedef typename Traits::difference_type difference_type; typedef typename Traits::value_type value_type; @@ -179,35 +173,15 @@ public: iterator_adaptor() { } - iterator_adaptor(const iterator_type& iter, const Policies& p =Policies()) + iterator_adaptor(const Iterator& iter, const Policies& p = Policies()) : m_iter_p(iter, p) {} -#ifdef BOOST_MSVC6_MEMBER_TEMPLATES - template - iterator_adaptor(const iterator_adaptor& rhs) - : m_iter_p(rhs.iter(), rhs.policies()) {} - - template - Self& operator=(const iterator_adaptor& rhs) - { - iter() = rhs.iter(); - policies() = rhs.policies(); - return *this; + template + iterator_adaptor (const iterator_adaptor& src) + : m_iter_p(src.iter(), src.policies()) { } -#else - template - iterator_adaptor(const iterator_adaptor& rhs) - : m_iter_p(rhs.iter(), rhs.policies()) {} - - template - Self& operator=(const iterator_adaptor& rhs) - { - iter() = rhs.iter(); - policies() = rhs.policies(); - return *this; - } -#endif - + reference operator*() const { return policies().dereference(type(), iter()); } @@ -281,73 +255,73 @@ public: // too many compilers have trouble when these are private. const Iterator& iter() const { return m_iter_p.first(); } }; -template -iterator_adaptor -operator-(iterator_adaptor p, const typename Traits::difference_type x) +template +iterator_adaptor +operator-(iterator_adaptor p, const typename Traits::difference_type x) { return p -= x; } -template -iterator_adaptor -operator+(iterator_adaptor p, const typename Traits::difference_type x) +template +iterator_adaptor +operator+(iterator_adaptor p, typename Traits::difference_type x) { return p += x; } -template -iterator_adaptor -operator+(const typename Traits::difference_type x, iterator_adaptor p) +template +iterator_adaptor +operator+(typename Traits::difference_type x, iterator_adaptor p) { return p += x; } -template +template typename Traits1::difference_type operator-( - const iterator_adaptor& x, - const iterator_adaptor& y ) + const iterator_adaptor& x, + const iterator_adaptor& y ) { typedef typename Traits1::difference_type difference_type; return x.policies().distance(type(), y.iter(), x.iter()); } #ifndef BOOST_RELOPS_AMBIGUITY_BUG -template +template inline bool -operator==(const iterator_adaptor& x, const iterator_adaptor& y) { +operator==(const iterator_adaptor& x, const iterator_adaptor& y) { return x.policies().equal(x.iter(), y.iter()); } -template +template inline bool -operator<(const iterator_adaptor& x, const iterator_adaptor& y) { +operator<(const iterator_adaptor& x, const iterator_adaptor& y) { return x.policies().less(x.iter(), y.iter()); } -template +template inline bool -operator>(const iterator_adaptor& x, - const iterator_adaptor& y) { +operator>(const iterator_adaptor& x, + const iterator_adaptor& y) { return x.policies().less(y.iter(), x.iter()); } -template +template inline bool -operator>=(const iterator_adaptor& x, const iterator_adaptor& y) { +operator>=(const iterator_adaptor& x, const iterator_adaptor& y) { return !x.policies().less(x.iter(), y.iter()); } -template +template inline bool -operator<=(const iterator_adaptor& x, - const iterator_adaptor& y) { +operator<=(const iterator_adaptor& x, + const iterator_adaptor& y) { return !x.policies().less(y.iter(), x.iter()); } -template +template inline bool -operator!=(const iterator_adaptor& x, - const iterator_adaptor& y) { +operator!=(const iterator_adaptor& x, + const iterator_adaptor& y) { return !x.policies().equal(x.iter(), y.iter()); } #endif @@ -359,17 +333,17 @@ operator!=(const iterator_adaptor& template , - class ConstTraits = std::iterator_traits, + class ConstTraits = std::iterator_traits, #endif class Policies = default_iterator_policies> class iterator_adaptors { public: - typedef iterator_adaptor iterator; - typedef iterator_adaptor + typedef iterator_adaptor iterator; + typedef iterator_adaptor const_iterator; }; @@ -412,8 +386,8 @@ struct transform_iterator typedef transform_iterator_traits TransTraits; typedef iterator_adaptor, TransTraits, - Iterator> type; + transform_iterator_policies, TransTraits> + type; }; @@ -449,27 +423,62 @@ struct indirect_traits typedef typename IndirectTraits::iterator_category iterator_category; }; -template , - class ConstIndirectTraits = - std::iterator_traits, - class Traits = - std::iterator_traits + class Traits = std::iterator_traits +#endif + > +struct indirect_iterator +{ + typedef typename Traits::value_type ValueType; + typedef iterator_adaptor + > type; +}; + +template , + class ConstTraits = std::iterator_traits +#endif + > +struct const_indirect_iterator +{ + typedef iterator_adaptor + > type; +}; + +template , + class Traits = std::iterator_traits, + class ConstTraits = std::iterator_traits #endif > struct indirect_iterators { - typedef typename IndirectTraits::value_type Iterator; typedef typename Traits::value_type ValueType; - typedef iterator_adaptors, - indirect_traits, + indirect_traits, indirect_iterator_policies > Adaptors; typedef typename Adaptors::iterator iterator; @@ -512,6 +521,32 @@ struct reverse_iterator_policies { return y < x; } }; +template +#else + class Traits +#endif + > +struct reverse_iterator +{ + typedef iterator_adaptor type; +}; + +template +#else + class ConstTraits +#endif + > +struct const_reverse_iterator +{ + typedef iterator_adaptor type; +}; + template , @@ -529,7 +564,82 @@ struct reverse_iterators typedef typename Adaptor::const_iterator const_iterator; }; +template +struct projection_iterator_policies : + public default_iterator_policies { + template + Reference dereference (type, Iterator const& it) const { + return AdaptableUnaryFunction()(*it); + } +}; +template +struct projection_iterator_traits { + typedef typename AdaptableUnaryFunction::result_type value_type; + typedef value_type& reference; + typedef value_type* pointer; + typedef typename Traits::difference_type difference_type; + typedef typename Traits::iterator_category iterator_category; +}; +template +struct const_projection_iterator_traits { + typedef typename AdaptableUnaryFunction::result_type value_type; + typedef value_type const& reference; + typedef value_type const* pointer; + typedef typename Traits::difference_type difference_type; + typedef typename Traits::iterator_category iterator_category; +}; +template +#else + class Traits +#endif + > +struct projection_iterator { + typedef projection_iterator_traits + Projection_Traits; + typedef iterator_adaptor, + Projection_Traits> type; +}; +template +#else + class Traits +#endif + > +struct const_projection_iterator { + typedef const_projection_iterator_traits Projection_Traits; + typedef iterator_adaptor, + Projection_Traits> type; +}; +template , + class ConstTraits = std::iterator_traits +#else + class Traits, + class ConstTraits +#endif + > +struct projection_iterators { + typedef projection_iterator_traits + Projection_Traits; + typedef const_projection_iterator_traits Const_Projection_Traits; + typedef iterator_adaptors > Adaptors; + typedef typename Adaptors::iterator iterator; + typedef typename Adaptors::const_iterator const_iterator; +}; + } // namespace boost #endif + +