diff --git a/include/boost/iterator/counting_iterator.hpp b/include/boost/iterator/counting_iterator.hpp index f89e7a4..d168e2d 100755 --- a/include/boost/iterator/counting_iterator.hpp +++ b/include/boost/iterator/counting_iterator.hpp @@ -96,7 +96,6 @@ namespace detail , Incrementable // value_type , category , Incrementable const& // reference - , Incrementable const* // pointer , difference > type; }; diff --git a/include/boost/iterator/indirect_iterator.hpp b/include/boost/iterator/indirect_iterator.hpp index a0c903b..f6caa71 100644 --- a/include/boost/iterator/indirect_iterator.hpp +++ b/include/boost/iterator/indirect_iterator.hpp @@ -29,7 +29,7 @@ namespace boost { - template + template struct indirect_iterator; namespace detail @@ -112,7 +112,7 @@ namespace boost // If the Value parameter is unspecified, we use this metafunction // to deduce the default types - template + template struct indirect_base { typedef typename iterator_value::type dereferenceable; @@ -138,18 +138,17 @@ namespace boost >::type cv_value_type; typedef iterator_adaptor< - indirect_iterator + indirect_iterator , Iter , cv_value_type , Category , Reference - , Pointer , Difference > type; }; template <> - struct indirect_base {}; + struct indirect_base {}; } // namespace detail template < @@ -157,16 +156,15 @@ namespace boost , class Value = use_default , class Category = use_default , class Reference = use_default - , class Pointer = use_default , class Difference = use_default > class indirect_iterator : public detail::indirect_base< - Iterator, Value, Category, Reference, Pointer, Difference + Iterator, Value, Category, Reference, Difference >::type { typedef typename detail::indirect_base< - Iterator, Value, Category, Reference, Pointer, Difference + Iterator, Value, Category, Reference, Difference >::type super_t; friend class iterator_core_access; @@ -179,11 +177,11 @@ namespace boost template < class Iterator2, class Value2, class Category2 - , class Reference2, class Pointer2, class Difference2 + , class Reference2, class Difference2 > indirect_iterator( indirect_iterator< - Iterator2, Value2, Category2, Reference2, Pointer2, Difference2 + Iterator2, Value2, Category2, Reference2, Difference2 > const& y , typename enable_if_convertible::type* = 0 ) diff --git a/include/boost/iterator/iterator_adaptor.hpp b/include/boost/iterator/iterator_adaptor.hpp index 9e44b94..a9cd88d 100644 --- a/include/boost/iterator/iterator_adaptor.hpp +++ b/include/boost/iterator/iterator_adaptor.hpp @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -33,20 +34,6 @@ namespace boost { namespace detail { - template - struct same_category_and_difference - : mpl::and_< - is_same< - typename Traits::iterator_category - , typename Other::iterator_category - > - , is_same< - typename Traits::iterator_category // *** THIS IS A BUG!! *** - , typename Other::iterator_category // MAKE FAILING TEST BEFORE FIXING!! - > - > - {}; - // // Result type used in enable_if_convertible meta function. @@ -187,17 +174,21 @@ namespace boost , class Value , class Category , class Reference - , class Pointer , class Difference > struct iterator_adaptor_base { + private: + typedef typename detail::ia_dflt_help >::type category; + typedef typename detail::ia_dflt_help , iterator_reference >::type reference; + + public: typedef iterator_facade< Derived , typename detail::ia_dflt_help >::type - , typename detail::ia_dflt_help >::type + , typename access_category_tag< category, reference >::type + , typename traversal_category_tag< category >::type , typename detail::ia_dflt_help , iterator_reference >::type - , typename detail::ia_dflt_help , iterator_pointer >::type , typename detail::ia_dflt_help >::type > type; @@ -214,18 +205,17 @@ namespace boost , class Value = use_default , class Category = use_default , class Reference = use_default - , class Pointer = use_default , class Difference = use_default > class iterator_adaptor : public detail::iterator_adaptor_base< - Derived, Base, Value, Category, Reference, Pointer, Difference + Derived, Base, Value, Category, Reference, Difference >::type { friend class iterator_core_access; typedef typename detail::iterator_adaptor_base< - Derived, Base, Value, Category, Reference, Pointer, Difference + Derived, Base, Value, Category, Reference, Difference >::type super_t; public: @@ -260,13 +250,14 @@ namespace boost { return *m_iterator; } template < - class OtherDerived, class OtherIterator, class V, class C, class R, class P, class D + class OtherDerived, class OtherIterator, class V, class C, class R, class D > - bool equal(iterator_adaptor const& x) const + bool equal(iterator_adaptor const& x) const { - BOOST_STATIC_ASSERT( - (detail::same_category_and_difference::value) - ); + // Maybe readd with same_distance + // BOOST_STATIC_ASSERT( + // (detail::same_category_and_difference::value) + // ); return m_iterator == x.base(); } @@ -279,14 +270,15 @@ namespace boost void decrement() { --m_iterator; } template < - class OtherDerived, class OtherIterator, class V, class C, class R, class P, class D + class OtherDerived, class OtherIterator, class V, class C, class R, class D > typename super_t::difference_type distance_to( - iterator_adaptor const& y) const + iterator_adaptor const& y) const { - BOOST_STATIC_ASSERT( - (detail::same_category_and_difference::value) - ); + // Maybe readd with same_distance + // BOOST_STATIC_ASSERT( + // (detail::same_category_and_difference::value) + // ); return y.base() - m_iterator; } diff --git a/include/boost/iterator/iterator_facade.hpp b/include/boost/iterator/iterator_facade.hpp index 848eecd..55b600d 100644 --- a/include/boost/iterator/iterator_facade.hpp +++ b/include/boost/iterator/iterator_facade.hpp @@ -62,6 +62,13 @@ namespace boost }; + template + struct const_qualified : + mpl::if_< is_tag< writable_iterator_tag, AccessCategory >, + Value, + Value const > + {}; + // // Type generator. // Generates the corresponding std::iterator specialization @@ -73,25 +80,21 @@ namespace boost // So use_default is its way to say what I really mean // is youre default parameter. // - template + template struct iterator_facade_base { typedef iterator< - Category + iterator_tag , typename remove_cv::type , Difference - , typename mpl::if_< - is_same - , Value* - , Pointer - >::type + , typename const_qualified::type* , typename mpl::if_< is_same - , Value& + , typename const_qualified::type& , Reference >::type > @@ -208,18 +211,18 @@ namespace boost // Macros which describe the declarations of binary operators # define BOOST_ITERATOR_FACADE_INTEROP_HEAD(prefix, op, result_type) \ template < \ - class Derived1, class V1, class C1, class R1, class P1, class D1 \ - , class Derived2, class V2, class C2, class R2, class P2, class D2 \ + class Derived1, class V1, class AC1, class TC1, class R1, class D1 \ + , class Derived2, class V2, class AC2, class TC2, class R2, class D2 \ > \ prefix typename detail::enable_if_interoperable< \ Derived1, Derived2, result_type \ >::type \ operator op( \ - iterator_facade const& lhs \ - , iterator_facade const& rhs) + iterator_facade const& lhs \ + , iterator_facade const& rhs) # define BOOST_ITERATOR_FACADE_PLUS_HEAD(prefix,args) \ - template \ + template \ prefix Derived operator+ args // @@ -240,7 +243,7 @@ namespace boost public: # else - template friend class iterator_facade; + template friend class iterator_facade; # define BOOST_ITERATOR_FACADE_RELATION(op) \ BOOST_ITERATOR_FACADE_INTEROP_HEAD(friend,op, bool); @@ -260,7 +263,7 @@ namespace boost BOOST_ITERATOR_FACADE_PLUS_HEAD( friend - , (iterator_facade const& + , (iterator_facade const& , typename Derived::difference_type) ) ; @@ -268,7 +271,7 @@ namespace boost BOOST_ITERATOR_FACADE_PLUS_HEAD( friend , (typename Derived::difference_type - , iterator_facade const&) + , iterator_facade const&) ) ; @@ -326,19 +329,17 @@ namespace boost template < class Derived , class Value - , class Category - , class Reference = Value& - , class Pointer = Value* - , class Difference = std::ptrdiff_t + , class AccessCategory + , class TraversalCategory + , class Reference = typename detail::const_qualified::type& + , class Difference = std::ptrdiff_t > class iterator_facade - : public detail::iterator_facade_base::type + : public detail::iterator_facade_base::type { private: - typedef iterator_facade self_t; - typedef typename - detail::iterator_facade_base::type + detail::iterator_facade_base::type super_t; // @@ -561,13 +562,13 @@ namespace boost } BOOST_ITERATOR_FACADE_PLUS(( - iterator_facade const& i + iterator_facade const& i , typename Derived::difference_type n )) BOOST_ITERATOR_FACADE_PLUS(( typename Derived::difference_type n - , iterator_facade const& i + , iterator_facade const& i )) # undef BOOST_ITERATOR_FACADE_PLUS # undef BOOST_ITERATOR_FACADE_PLUS_HEAD diff --git a/include/boost/iterator/transform_iterator.hpp b/include/boost/iterator/transform_iterator.hpp index 2bd982a..34e2fa6 100644 --- a/include/boost/iterator/transform_iterator.hpp +++ b/include/boost/iterator/transform_iterator.hpp @@ -19,7 +19,7 @@ namespace boost { - template + template class transform_iterator; namespace detail @@ -27,7 +27,7 @@ namespace boost // Given the transform iterator's transformation and iterator, this // is the type used as its traits. - template + template struct transform_iterator_base { private: @@ -71,12 +71,12 @@ namespace boost } - template + template class transform_iterator - : public detail::transform_iterator_base::type + : public detail::transform_iterator_base::type { typedef typename - detail::transform_iterator_base::type + detail::transform_iterator_base::type super_t; friend class iterator_core_access; @@ -84,17 +84,17 @@ namespace boost public: transform_iterator() { } - transform_iterator(Iterator const& x, AdaptableUnaryFunction f) + transform_iterator(Iterator const& x, UnaryFunction f) : super_t(x), m_f(f) { } template transform_iterator( - transform_iterator const& t + transform_iterator const& t , typename enable_if_convertible::type* = 0 ) : super_t(t.base()), m_f(t.functor()) {} - AdaptableUnaryFunction functor() const + UnaryFunction functor() const { return m_f; } private: @@ -103,7 +103,7 @@ namespace boost // Probably should be the initial base class so it can be // optimized away via EBO if it is an empty class. - AdaptableUnaryFunction m_f; + UnaryFunction m_f; }; template