diff --git a/example/reverse_iterator.cpp b/example/reverse_iterator.cpp index 1aec7e3..ffe6e3d 100644 --- a/example/reverse_iterator.cpp +++ b/example/reverse_iterator.cpp @@ -7,8 +7,9 @@ int main() { int x[] = { 1, 2, 3, 4 }; - boost::reverse_iterator - first(x + 4), last(x); + boost::reverse_iterator + , std::ptrdiff_t> first(x + 4), last(x); std::copy(first, last, std::ostream_iterator(std::cout, " ")); std::cout << std::endl; return 0; diff --git a/include/boost/iterator/iterator_adaptors.hpp b/include/boost/iterator/iterator_adaptors.hpp index 18b90b6..21b031e 100644 --- a/include/boost/iterator/iterator_adaptors.hpp +++ b/include/boost/iterator/iterator_adaptors.hpp @@ -7,14 +7,11 @@ namespace boost { -template -struct repository - : iterator::type, V, D, P, R> +template +struct repository : iterator { typedef Final final; - typedef RC return_category; - typedef TC traversal_category; }; template @@ -105,17 +102,17 @@ typename Base1::difference_type operator-( template > > > + downcastable > > > > struct iterator_adaptor : B, new_iterator_base { typedef V value_type; typedef R reference; typedef P pointer; - typedef typename B::iterator_category iterator_category; + typedef C iterator_category; typedef D difference_type; reference operator*() const @@ -139,7 +136,7 @@ struct iterator_adaptor : B, new_iterator_base { Final result(downcast()); return result -= x; } template - bool equal(iterator_adaptor const& x) const + bool equal(iterator_adaptor const& x) const { return this->downcast().base() == x.downcast().base(); } @@ -153,7 +150,7 @@ struct iterator_adaptor : B, new_iterator_base template difference_type - distance_from(const iterator_adaptor& y) const + distance_from(const iterator_adaptor& y) const { return y.downcast().base() - this->downcast().base();//? } @@ -164,13 +161,13 @@ struct iterator_adaptor : B, new_iterator_base template + class V, class R, class P, class C, class D> struct reverse_iterator : iterator_adaptor< - reverse_iterator, V, R, P, RC, TC, D + reverse_iterator, V, R, P, C, D > { - typedef iterator_adaptor, V, R, P, RC, TC, D> super; + typedef iterator_adaptor, V, R, P, C, D> super; // friend class super; // hmm, I don't like the next two lines @@ -185,7 +182,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) { } @@ -200,7 +197,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; } diff --git a/include/boost/iterator/iterator_categories.hpp b/include/boost/iterator/iterator_categories.hpp index f38c967..ae2217d 100644 --- a/include/boost/iterator/iterator_categories.hpp +++ b/include/boost/iterator/iterator_categories.hpp @@ -220,6 +220,14 @@ namespace boost { >::type type; }; + template + struct iterator_tag : cvt_iterator_category::type + { + typedef ReturnTag returns; + typedef TraversalTag traversal; + }; + + } // namespace boost #endif // BOOST_ITERATOR_CATEGORIES_HPP diff --git a/include/boost/iterator/iterator_concepts.hpp b/include/boost/iterator/iterator_concepts.hpp index 22ed509..349244d 100644 --- a/include/boost/iterator/iterator_concepts.hpp +++ b/include/boost/iterator/iterator_concepts.hpp @@ -26,7 +26,8 @@ namespace boost_concepts { public: typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::reference reference; - typedef typename boost::return_category::type return_category; + typedef typename std::iterator_traits::iterator_category iterator_category; + typedef typename iterator_category::returns return_category; void constraints() { boost::function_requires< boost::SGIAssignableConcept >(); @@ -47,7 +48,8 @@ namespace boost_concepts { template class WritableIteratorConcept { public: - typedef typename boost::return_category::type return_category; + typedef typename std::iterator_traits::iterator_category iterator_category; + typedef typename iterator_category::returns return_category; void constraints() { boost::function_requires< boost::SGIAssignableConcept >(); @@ -69,7 +71,8 @@ namespace boost_concepts { public: typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::reference reference; - typedef typename boost::return_category::type return_category; + typedef typename std::iterator_traits::iterator_category iterator_category; + typedef typename iterator_category::returns return_category; void constraints() { boost::function_requires< ReadableIteratorConcept >(); @@ -91,7 +94,8 @@ namespace boost_concepts { public: typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::reference reference; - typedef typename boost::return_category::type return_category; + typedef typename std::iterator_traits::iterator_category iterator_category; + typedef typename iterator_category::returns return_category; void constraints() { boost::function_requires< ReadableIteratorConcept >(); @@ -115,8 +119,8 @@ namespace boost_concepts { template class ForwardTraversalConcept { public: - typedef typename boost::traversal_category::type - traversal_category; + typedef typename std::iterator_traits::iterator_category iterator_category; + typedef typename iterator_category::traversal traversal_category; void constraints() { boost::function_requires< boost::SGIAssignableConcept >(); @@ -135,8 +139,8 @@ namespace boost_concepts { template class BidirectionalTraversalConcept { public: - typedef typename boost::traversal_category::type - traversal_category; + typedef typename std::iterator_traits::iterator_category iterator_category; + typedef typename iterator_category::traversal traversal_category; void constraints() { boost::function_requires< ForwardTraversalConcept >(); @@ -153,8 +157,8 @@ namespace boost_concepts { template class RandomAccessTraversalConcept { public: - typedef typename boost::traversal_category::type - traversal_category; + typedef typename std::iterator_traits::iterator_category iterator_category; + typedef typename iterator_category::traversal traversal_category; typedef typename std::iterator_traits::difference_type difference_type; diff --git a/test/iterator_adaptor_cc.cpp b/test/iterator_adaptor_cc.cpp index f5161d1..810d0db 100644 --- a/test/iterator_adaptor_cc.cpp +++ b/test/iterator_adaptor_cc.cpp @@ -8,14 +8,16 @@ int main() { { typedef boost::reverse_iterator rev_iter; + boost::iterator_tag, + std::ptrdiff_t> rev_iter; boost::function_requires< boost_concepts::MutableLvalueIteratorConcept >(); boost::function_requires< boost_concepts::RandomAccessTraversalConcept >(); boost::function_requires< boost::RandomAccessIteratorConcept >(); } { typedef boost::reverse_iterator::const_iterator, int, const int&, const int*, - boost::constant_lvalue_iterator_tag, boost::bidirectional_traversal_tag, std::ptrdiff_t> rev_iter; + boost::iterator_tag + , std::ptrdiff_t> rev_iter; boost::function_requires< boost_concepts::ConstantLvalueIteratorConcept >(); boost::function_requires< boost_concepts::BidirectionalTraversalConcept >(); boost::function_requires< boost::BidirectionalIteratorConcept >();